一、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.通過查看類新如下圖。
結構體類型如下: