一、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.通过查看类新如下图。
结构体类型如下: