首页 > 学院 > 开发设计 > 正文

spi_device的注册和创建(引入DTS之前)

2019-11-09 17:10:49
字体:
来源:转载
供稿:网友

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设备。
上一篇:CAKeyframeAnimation

下一篇:Adoptable Storage

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表