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

结构体类型如下:

最新文章

  1. ASP.NET MVC——CodeFirst开发模式
  2. C ReadProcessMemory
  3. .NET LINQ 限定符操作
  4. 8.2 辅助 xUtils 3.0
  5. Python入门笔记(15):对文件的操作(1)
  6. Mac下Android Studio中获取SHA1和MD5
  7. PDF 补丁丁 0.4.1.839 测试版发布:调整页面留白
  8. CGRectOffset与CGRectInset的计算公式
  9. DbUtil组件及C3P0数据库连接池组件的使用
  10. hadoop部署错误
  11. 浅析Thread类run()和start()的区别
  12. 使用Guava cache构建本地缓存
  13. 如何发布自己的 jar 包到 maven 中央仓库(待更新...)
  14. day10.函数升级
  15. JS 浅谈函数柯里化,不明觉厉
  16. apollo broker 启动流程
  17. Linux玩转redis从入门到放肆--1.缓存击穿
  18. English trip -- VC(情景课) 8 B job duties 工作职责
  19. filebeat 插件开发
  20. mysql-5.7 innodb_file_per_table 详解

热门文章

  1. tortoiseGit 的简单使用说明
  2. springboot 潜入式web容器
  3. CodeForces - 748E Santa Claus and Tangerines(二分)
  4. POJ 1129:Channel Allocation 四色定理+暴力搜索
  5. Java集合--Map
  6. [tensorflow] 线性回归模型实现
  7. win10编译libpng
  8. vue select框change事件
  9. 吴裕雄--天生自然 JAVASCRIPT开发学习:RegExp 对象
  10. pywin32获得tkinter窗口句柄,并在上面绘图