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

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设备。


  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值