spi设备描述过程
2024-09-07 03:19:22
一、spi通信 中控制器驱动及spi设备、spi设备驱动的关系入下图:
控制器驱动以及设备全志已经完成,在/driver/spi/spi--sunxi.c 中,打开源码文件可以看到spi控制器属于平台总线,匹配成功会产生一个控制器对象spi_master,当spi_master注册时会和spi_board_info进行结合,生成spi_device对象。
我们需要做的就是描述一个spi设备的spi_board_info 类型的对象。
首先我们要先了解用到的结构体:
描述spi_device 对象的结构体:
struct spi_device {
struct device dev; //基于device成员扩展, 在/sys/bus/spi/devie目录有相应的子目录(名为spi%d.%d)
struct spi_master *master; //spi控制器对象的地址
u32 max_speed_hz; //设备工作时钟最大多少HZ
u8 chip_select;
u8 mode;
#define SPI_CPHA 0x01 /* clock phase */
#define SPI_CPOL 0x02 /* clock polarity */
#define SPI_MODE_0 (0|0) /* (original MicroWire) */
#define SPI_MODE_1 (0|SPI_CPHA)
#define SPI_MODE_2 (SPI_CPOL|0)
#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
#define SPI_CS_HIGH 0x04 /* chipselect active high? */
#define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */
#define SPI_3WIRE 0x10 /* SI/SO signals shared */
#define SPI_LOOP 0x20 /* loopback mode */
#define SPI_NO_CS 0x40 /* 1 dev/bus, no chipselect */
#define SPI_READY 0x80 /* slave pulls low to pause */
u8 bits_per_word; //传输的数据以多少位为单位
int irq; //中断号
void *controller_state;
void *controller_data; //给控制器的驱动使用,不同的控制器需要的类型不同,
可以进入/driver/spi/spi_sunxi.c查看controller_data的类型
char modalias[SPI_NAME_SIZE]; //spi设备的名字
};
// 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);
描述spi设备的结构体
struct spi_board_info spi_infos[] = {
{
.modalias = "mcp2515", //设备名
.platform_data = NULL, //根据spi驱动决定是否用了平台数据。dev.platform_data
.controller_data = &sunxi_data,//需查控制器的驱动代码,可得知需要提供struct sunxi_spi_config类型数据. 注意不同的同台,需要数据类型也会不同 .irq = gpio_to_irq(GPIOA(10)),
.max_speed_hz = , //2MHz
.bus_num = , // 接编号为0的控制器
.mode = SPI_MODE_0,//通信模式
}, }; 注:.controller_data 是和控制器驱动数据相关的,需要产看相应的控制器,如全志的spi控制器驱动代码在
/drivers/spi/spi-sunxi.c.通过查看类新如下图。
结构体类型如下:
最新文章
- ASP.NET MVC——CodeFirst开发模式
- C ReadProcessMemory
- .NET LINQ 限定符操作
- 8.2 辅助 xUtils 3.0
- Python入门笔记(15):对文件的操作(1)
- Mac下Android Studio中获取SHA1和MD5
- PDF 补丁丁 0.4.1.839 测试版发布:调整页面留白
- CGRectOffset与CGRectInset的计算公式
- DbUtil组件及C3P0数据库连接池组件的使用
- hadoop部署错误
- 浅析Thread类run()和start()的区别
- 使用Guava cache构建本地缓存
- 如何发布自己的 jar 包到 maven 中央仓库(待更新...)
- day10.函数升级
- JS 浅谈函数柯里化,不明觉厉
- apollo broker 启动流程
- Linux玩转redis从入门到放肆--1.缓存击穿
- English trip -- VC(情景课) 8 B job duties 工作职责
- filebeat 插件开发
- mysql-5.7 innodb_file_per_table 详解