赞
踩
目录
1、Linux 内核使用 spi_master 表示 SPI 主机驱动, spi_master 是个结构体,定义在 include/linux/spi/spi.h 文件中,此结构体中有两个重要函数:
(1) transfer 函数,控制器数据传输,SPI 主机端最终会通过 transfer 函数与 SPI 设备进行通信:
(2) 用于 SPI 数据发送,用于发送一个 spi_message,SPI 的数据会打包成 spi_message,然后以队列方式发送出去:
在使用 spi_message之前需要对其进行初始化。
2、SPI 主机驱动的核心就是申请 spi_master,然后初始化 spi_master,最后向 Linux 内核注册spi_master:
(1) a. spi_master的申请,函数原型如下:
函数参数和返回值含义如下:
dev:设备,一般是 platform_device 中的 dev 成员变量;
size: 私有数据大小,可以通过 spi_master_get_devdata 函数获取到这些私有数据;
返回值: 申请到的 spi_master。
(2) spi_master 的释放,函数原型如下:
master:要释放的 spi_master。
(3) spi_master 的注册,函数原型如下:
master:要注册的 spi_master。
注:I.MX6U 的 SPI 主机驱动会采用 spi_bitbang_start 这个 API 函数来完成 spi_master 的注册,spi_bitbang_start 函数内部其实也是通过调用 spi_register_master 函数来完成 spi_master 的注册。
(4) spi_master 的注销,函数原型如下:
master:要注册的 spi_master。
注:如果使用 spi_bitbang_start 注册 spi_master 的话就要使用 spi_bitbang_stop 来注销掉spi_master。
1、linux 内核使用 spi_driver 结构体来表示 spi 设备驱动,定义在include/linux/spi/spi.h 文件中,结构体内容如下:
spi_driver 结构体,需要 SPI 设备驱动人员编写,包括匹配表、 probe 函数等,和 i2c_driver、 platform_driver 一样。
2、SPI 设备和驱动匹配过程
(1)由 SPI 总线来完成的,SPI总线为 spi_bus_type,定义在 drivers/spi/spi.c 文件中:
(2) SPI 设备和驱动的匹配函数为 spi_match_device。
3、 SPI 设备数据收发处理流程
(1) SPI 设备驱动的核心是 spi_driver 结构体;
(2) spi_transfer 结构体,用于描述 SPI 传输信息;
(3) spi_transfer 需要组织成 spi_message, spi_message 也是一个结构体;
(4) SPI 数据传输步骤如下:
①、申请并初始化 spi_transfer,设置 spi_transfer 的 tx_buf 成员变量, tx_buf 为要发送的数据。然后设置 rx_buf 成员变量, rx_buf 保存着接收到的数据。最后设置 len 成员变量,也就是要进行数据通信的长度。
②、使用 spi_message_init 函数初始化 spi_message:
③、使用 spi_message_add_tail函数将前面设置好的 spi_transfer添加到 spi_message队列中:
④、使用 spi_sync 函数完成 SPI 数据同步传输:
1、设备树的修改
(1) IO 的 pinctrl 子节点创建与修改
(2) SPI 设备节点的创建与修改
2、执行 probe 函数初始化时要注意:把 spi 设备设置成私有数据
3、主要函数
(1) 读函数
(2) 写函数
(3) 注意:SPI 为全双工通讯没有所谓的发送和接收长度之分;要读取或者发送 N 个字节就要封装 N+1 个字节,第 1 个字节是告诉设备我们要进行读还是写,后面的 N 个字节才是要读或者发送的数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。