spi系统框架分析

来源:互联网 发布:yahoo 雅虎输入法 mac 编辑:程序博客网 时间:2024/06/03 09:07

一 :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_masterstruct spi_driverstruct spi_devicestruct spi_transferstruct 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 提供一些简单的数据传输提供了独立的API4 构建注册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_mastert1 申请必要的硬件资源,例如中断,DMA通道,DMA内存缓冲区等等;2 配置SPI控制器的工作模式和参数,使之可以和相应的设备进行正确的数据交换工作;3 向核心层提供接口,使得设备驱动可以通过核心层访问控制器驱动4 完成数据消息队列的排队和处理,直到消息队列变空为止;5 向核心层注册spi_mastert 该层是基于platform总线搭建起来的;结构:1 构建注册 struct platform_driver2 设备树中构建 “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()