SPI通用接口层用spi_device结构来表示一个spi设备,它的各个字段的意义如下:
struct device dev | 代表该spi设备的device结构 |
struct spi_master *master | 指向该spi设备所使用的控制器 |
u32 max_speed_hz | 该设备的最大工作时钟频率 |
u8 chip_select | 在控制器中的片选引脚编号索引 |
u16 mode | 设备的工作模式,包括时钟格式,片选信号的有效电平等等 |
u8 bits_per_Word | 设备每个单位数据所需要的比特数 |
int irq | 设备使用的irq编号 |
char modalias[SPI_NAME_SIZE] | 该设备的名字,用于spi总线和驱动进行配对 |
int cs_gpio | 片选信号的gpio编号,通常不用我们自己设置,接口层会根据上面的chip_select字段在spi_master结构中进行查找并赋值 |
要完成向系统增加并注册一个SPI设备,我们还需要另一个数据结构:
/* include/linux/spi/spi.h */struct spi board_info {char modalias[32] ;/*用于初始化spi_device.modalias */const void *platform_data ;/*用于初始化spi_device.dev.platform_data */void *controller data;/ * 用于初始化spi_device.controller_data */int irq;/*用于初始化spi_device.irq */u32 max speed h z ;/*用于初始化spi_device.max_speed_hz */ul6 b us num;/*用于初始化spi_device.bus_num */ul6 chip_select ;/*用于初始化spi_device.chip select */u8 mode ;/*用于初始化spi_device.mode */};
spi_board_info对象用于描述 SPI设备信息,其大部分字段和spi_device结构相对应,bus_num字段则用来指定所属的控制器编号,通过spi_board_info结构,我们可以有两种方式向系统增加spi设备。第一种方式是在SPI控制器驱动已经被加载后,我们使用通用接口层提供的如下API来完成:
struct spi_device *spi_new_device(struct spi_master *master, struct spi_board_info *chip);
第二种方式是在板子的初始化代码中,定义一个spi_board_info数组,然后通过以下API注册spi_board_info:int spi_register_board_info(struct spi_board_info const *info, unsigned n);
上面这个API会把每个spi_board_info挂在全局链表变量board_list上,并且遍历已经在系统中注册了的控制器,匹配上相应的控制器并取得它们的spi_master结构指针,最终也会通过spi_new_device函数添加SPI设备。因为spi_register_board_info可以在板子的初始化代码中调用,可能这时控制器驱动尚未加载,此刻无法取得相应的spi_master指针,不过不要担心,控制器驱动被加载时,一定会调用spi_register_master函数来注册spi_master结构,而spi_register_master函数会反过来遍历全局链表board_list上的spi_board_info,然后通过spi_new_device函数添加SPI设备。新闻热点
疑难解答