Linux设备模型之spi子系统

相比于前面介绍的i2c子系统(见  ),spi子系统相对简单,和i2c的结构也很相似,这里主要介绍一下平台无关部分的代码。先概括的说一下,spi总线或者说是spi控制器用结构体struct spi_master来表述,而一般不会明显的主动实现这个结构而是借助板级的一些信息结构,利用spi的模型填充,存在板级信息的一条链表board_list,上面挂接着板级spi设备的描述信息,其挂接的结构是struct boardinfo,这个结构内部嵌入了具体的板级spi设备所需信息结构struct spi_board_info,对于要操控的spi设备,用struct spidev_data来描述,内嵌了具体设备信息结构struct spi_device,并通过struct spi_device->device_entry成员挂接到全局spi设备链表device_list,结构struct spi_device就是根据前面board_list上所挂的信息填充的,而driver端比较简单,用struct spi_driver来描述,一会儿会看到该结构和标准的platform非常相似,总括的说下一般编写流程:对于soc,spi控制器一般注册成platform,当driver匹配后,会根据platform_device等信息构造出spi_master,一般发生在driver的probe函数,并且注册该master,在master的注册过程中会去遍历board_list找到bus号相同的spi设备信息,并实例化它,好了先就说这么多,下面先看一下具体的数据结构。

一、spi相关的数据结构

先看一下spi设备的板级信息填充的结构:

[cpp]

struct boardinfo {       struct list_head    list;              //用于挂接到链表头board_list上                      unsigned        n_board_info;      //设备信息号,spi_board_info成员的编号        struct spi_board_info   board_info[0];     //内嵌的spi_board_info结构    };   //其中内嵌的描述spi设备的具体信息的结构struct spi_board_info为:    struct spi_board_info {       /* the device name and module name are coupled, like platform_bus;       * "modalias" is normally the driver name.       *       * platform_data goes to spi_device.dev.platform_data,       * controller_data goes to spi_device.controller_data,       * irq is copied too       */       char        modalias[SPI_NAME_SIZE];     //名字        const void  *platform_data;              //如同注释写的指向spi_device.dev.platform_data        void        *controller_data;            //指向spi_device.controller_data        int     irq;                         //中断号        /* slower signaling on noisy or low voltage boards */       u32     max_speed_hz;                //时钟速率        /* bus_num is board specific and matches the bus_num of some       * spi_master that will probably be registered later.       *       * chip_select reflects how this chip is wired to that master;       * it's less than num_chipselect.       */       u16     bus_num;                     //所在的spi总线编号        u16     chip_select;                          /* mode becomes spi_device.mode, and is essential for chips       * where the default of SPI_CS_HIGH = 0 is wrong.       */       u8      mode;                        //模式        /* ... may need additional spi_device chip config data here.       * avoid stuff protocol drivers can set; but include stuff       * needed to behave without being bound to a driver:       *  - quirks like clock rate mattering when not selected       */   };   

利用boardinfo->list成员会将自身挂接到全局的board_list链表上。

再来看一下spi控制器的表述结构:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22710.html