跳转至

接口描述

3 接口描述

3.1 设备注册接口

接口定义在 include/linux/spi/spi.h,主要包含 spi_register_driver 与 spi_unregister_driver 接口,其中给出了快速注册的 SPI 设备驱动的宏 module_spi_driver(),定义如下:

#define module_spi_driver(__spi_driveSPI \
module_driver(__spi_driver, spi_register_driver, \
    spi_unregister_driver)

3.1.1 spi_register_driver()

函数原型:int spi_register_driver(struct spi_driver *sdrv)

功能描述: 注册一个 SPI 设备驱动。

参数说明:

sdrv,spi_driver 类型的指针,其中包含了 SPI 设备的名称、probe 等接口信息。

返回值:返回 0 表示成功,返回其他值表示失败。

3.1.2 spi_unregister_driver()

函数原型:void spi_unregister_driver(struct spi_driver *sdrv)

功能描述:注销一个 SPI 设备驱动。

参数说明:

sdrv,spi_driver 类型的指针,其中包含了 SPI 设备的名称、probe 等接口信息。

返回值:无

3.2 数据传输接口

SPI 设备驱动使用 “struct spi_message” 向 SPI 总线请求读写 I/O。一个 spi_message 中包含了一个操作序列,每一个操作称作 spi_transfer,这样方便 SPI 总线驱动中串行的执行一个个原子的序列。内核线程使用队列实现了异步传输的功能,对于同一个数据传输的发起者,既然异步方式无需等待数据传输完成即可返回,返回后,该发起者可以立刻又发起一个 message,而这时上一个 message 还没有处理完。对于另外一个不同的发起者来说,也有可能同时发起一次 message 传输请求。

​ 图 3-1: Linux SPI 数据传输流程

struct spi_transfer {
    const void *tx_buf;
    void *rx_buf;
    unsigned len;
    dma_addr_t tx_dma;
    dma_addr_t rx_dma;
    unsigned cs_change:1;
    u8 bits_per_word;
    u16 delay_usecs;
    u32 speed_hz;
    struct list_head transfer_list;
};

struct spi_message {
    struct list_head transfers;
    struct spi_device *spi;
    unsigned is_dma_mapped:1;
    void (*complete)(void *context);
    void *context;
    unsigned actual_length;
    int status;
    struct list_head queue;
    void *state;
};

3.2.1 spi_message_init()

函数原型:void spi_message_init(struct spi_message *m)

功能描述:初始化一个 SPI message 结构,主要是清零和初始化 transfer 队列。

参数说明:

m:spi_message 类型的指针。

返回值:无

3.2.2 spi_message_add_tail()

函数原型:void spi_message_add_tail(struct spi_transfer *t, struct spi_message *m)

功能描述:向 SPI message 中添加一个 transfer。

参数说明:

t: 指向待添加到 SPI transfer 结构;

m:spi_message 类型的指针。

返回值:无

3.2.3 spi_sync()

函数原型:int spi_sync(struct spi_device *spi, struct spi_message *message)

功能描述:启动、并等待 SPI 总线处理完指定的 SPI message。

参数说明:

spi,指向当前的 SPI 设备;

m,spi_message 类型的指针,其中有待处理的 SPI transfer 队列。

返回值:0,成功;小于 0,失败。