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.通過查看類新如下圖。

結構體類型如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM