spi设备描述过程

一、spi通信 中控制器驱动及spi设备、spi设备驱动的关系入下图:

控制器驱动以及设备全志已经完成,在/driver/spi/spi--sunxi.c  中,打开源码文件可以看到spi控制器属于平台总线,匹配成功会产生一个控制器对象spi_master,当spi_master注册时会和spi_board_info进行结合,生成spi_device对象。

我们需要做的就是描述一个spi设备的spi_board_info 类型的对象。

首先我们要先了解用到的结构体:

描述spi_device 对象的结构体:

 1 struct spi_device {
 2         struct device           dev; //基于device成员扩展, 在/sys/bus/spi/devie目录有相应的子目录(名为spi%d.%d)
 3         struct spi_master       *master; //spi控制器对象的地址
 4         u32                     max_speed_hz; //设备工作时钟最大多少HZ
 5         u8                      chip_select;   
 6         u8                      mode;    
 7 #define SPI_CPHA        0x01                    /* clock phase */
 8 #define SPI_CPOL        0x02                    /* clock polarity */
 9 #define SPI_MODE_0      (0|0)                   /* (original MicroWire) */
10 #define SPI_MODE_1      (0|SPI_CPHA)
11 #define SPI_MODE_2      (SPI_CPOL|0)
12 #define SPI_MODE_3      (SPI_CPOL|SPI_CPHA)
13 #define SPI_CS_HIGH     0x04                    /* chipselect active high? */
14 #define SPI_LSB_FIRST   0x08                    /* per-word bits-on-wire */
15 #define SPI_3WIRE       0x10                    /* SI/SO signals shared */
16 #define SPI_LOOP        0x20                    /* loopback mode */
17 #define SPI_NO_CS       0x40                    /* 1 dev/bus, no chipselect */
18 #define SPI_READY       0x80                    /* slave pulls low to pause */
19         u8                      bits_per_word; //传输的数据以多少位为单位
20         int                     irq;    //中断号
21         void                    *controller_state;
22         void                    *controller_data; //给控制器的驱动使用,不同的控制器需要的类型不同,
                           可以进入/driver/spi/spi_sunxi.c查看controller_data的类型
23 char modalias[SPI_NAME_SIZE]; //spi设备的名字 24 };
// spi设备驱动类型
struct spi_driver {
    const struct spi_device_id *id_table;
    int         (*probe)(struct spi_device *spi);
    int         (*remove)(struct spi_device *spi);
    void            (*shutdown)(struct spi_device *spi);
    int         (*suspend)(struct spi_device *spi, pm_message_t mesg);
    int         (*resume)(struct spi_device *spi);
    struct device_driver    driver; //基于device_driver扩展, 驱动模型
};


extern int spi_register_driver(struct spi_driver *sdrv);
static inline void spi_unregister_driver(struct spi_driver *sdrv);
 1 描述spi设备的结构体
 2 struct spi_board_info spi_infos[] = {
 3     {
 4         .modalias = "mcp2515",  //设备名
 5         .platform_data = NULL,   //根据spi驱动决定是否用了平台数据。dev.platform_data    
 6         .controller_data = &sunxi_data,//需查控制器的驱动代码,可得知需要提供struct sunxi_spi_config类型数据. 注意不同的同台,需要数据类型也会不同
 7 
 8         .irq = gpio_to_irq(GPIOA(10)),
 9         .max_speed_hz = 2000000, //2MHz
10         .bus_num = 0, // 接编号为0的控制器
11         .mode = SPI_MODE_0,//通信模式
12     },
13
14 };

  注:.controller_data 是和控制器驱动数据相关的,需要产看相应的控制器,如全志的spi控制器驱动代码在
  /drivers/spi/spi-sunxi.c.通过查看类新如下图。

结构体类型如下:

扫描二维码关注公众号,回复: 1872550 查看本文章

猜你喜欢

转载自www.cnblogs.com/edan/p/9265099.html