一 :SPI系统框架大致分为三层:
1:SPI核心层
在linux的核心层代码中主要定义了SPI主控制器spi_master,SPI驱动spi_driver,
SPI通信相关的spi_transfer,spi_message等数据结构,这些数据结构是构成整个
SPI系统的最基本的元素,同时,在SPI的核心层中又定义了这些基本元素之间的关系。
SPI核心层对SPI系统提供了最基础的搭建方法
2:SPI控制器驱动层 :spi_master
负责最底层的数据收发,平台芯片相关
3:SPI设备驱动层
spi接口 — master控制器 —- 一条spi总线 —-多个设备
二:SPI核心层 :dervers/spi/spi.c、include/spi/spi.h
功能:为控制器层和设备驱动层提供标准的接口以及数据结构
0 include/spi/spi.h
定义了:struct spi_master
struct spi_driver
struct spi_device
struct spi_transfer
struct spi_message 等等
1 为SPI控制器层提供的接口:
1.1申请struct spi_master : spi_alloc_master(struct device *host, unsigned size)
1.2注册 spi_master : spi_register_master(struct spi_master *master);
1.3注销 spi_master : spi_unregister_master(struct spi_master *master);
2 为SPI设备驱动层提供的接口
2.1 注册spi_driver至spi总线
2.2 分配、添加 spi_device 到 spi总线
3 提供一些简单的数据传输提供了独立的API
4 构建注册spi类型总线struct bus_type spi_bus_type
同时创建控制器设备类struct class spi_master_class
系统开机启动之后会自动加载初始化各个模块儿,其中就会加载 spi核心层模块,spi.c文件中
的 postcore_initcall(spi_init); 作用就是开机加载 spi_init(),spi_init()执行完成后会
在/sys/bus 下生成 spi目录,说明在 系统 中定义并添加了一条类型为 spi 的总线。
sys/class/spi_master 控制类设备类
当系统定义并且添加了类型为spi类型的总线之后,接着便会在系统中添加自己的平台spi总线
芯片平台上集成的spi总线在Linux内核中是作为spi控制器存在的
三:控制器驱动层 dervers/spi/spi-rockchip.c
功能:
0 申请并且初始化 注册spi_mastert
1 申请必要的硬件资源,例如中断,DMA通道,DMA内存缓冲区等等;
2 配置SPI控制器的工作模式和参数,使之可以和相应的设备进行正确的数据交换工作;
3 向核心层提供接口,使得设备驱动可以通过核心层访问控制器驱动
4 完成数据消息队列的排队和处理,直到消息队列变空为止;
5 向核心层注册spi_mastert
该层是基于platform总线搭建起来的;
结构:
1 构建注册 struct platform_driver
2 设备树中构建 “platform_device” 等价模型
3 构建prob函数,完成相应设置,向核心层注册spi_mastert结构体//注册spi_mastert
四:设备驱动层: dervers/spi/spidev.c
SPI设备驱动层的重点在于 他是基于 spi_bus_type总线
device driver 都是注册到spi_bus_type(在核心层注册总线)
1 构建注册 struct spi_driver
2 设备树中 完善 设备信息
3 构建probe函数
{
device_create(); // 创建设备节点 sys/devices/platform 平台节点
}
4 构建 spidev_init(void) 函数
{
class_create(); // sys/class 类
unregister_chrdev(); //创建字符设备
spi_register_driver();//注册spi_driver
}
五 : SPI通讯:
1 定义一个 spi_message 结构
2 用spi_message_init函数初始化spi_message
3 定义一个或多个spi_transfer结构,初始化并且为数据准备缓冲区并赋值给spi_transfer相应的字段(tx_buf、rx_buf等)
4 通过spi_message_init 函数把这些spi_transfer挂在spi_message结构下
5 如果使用同步方式,调用spi_sync()、如果使用异步方式,调用spi_async()