spi系统框架分析

一 :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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Microsoft Windows 系统错误代码简单分析:   0000 操作已成功完成。   0001 错误的函数。   0002 系统找不到指定的文件。   0003 系统找不到指定的路径。   0004 系统无法打开文件。   0005 拒绝访问。   0006 句柄无效。   0007 存储区控制块已损坏。   0008 可用的存储区不足, 无法执行该命令。   0009 存储区控制块地址无效。   0010 环境错误。   0011 试图使用不正确的格式加载程序。   0012 访问代码无效。   0013 数据无效。   0014 可用的存储区不足,无法完成该操作。   0015 系统找不到指定的驱动器。   0016 无法删除该目录。   0017 系统无法将文件移到其他磁盘驱动器上。   0018 没有其他文件。   0019 媒体写保护。   0020 系统找不到指定的设备。   0021 设备尚未准备好。   0022 设备无法识别该命令。   0023 数据错误(循环冗余检查)。   0024 程序发出命令,但是该命令的长度错误。   0025 驱动器在磁盘上无法定位指定的区域或磁道。   0026 无法访问指定的磁盘或软盘。   0027 驱动器找不到所请求的扇区。   0028 打印机缺纸。   0029 系统无法写入指定的设备。   0030 系统无法读取指定的设备。   0031 与系统连接的设备不能正常运转。   0032 其他进程正使用该文件,因此现在无法访问。   0033 另一进程已锁定该文件的某一部分,因此现在无法访问。   0034 驱动器中的软盘不正确。请将 %2 (卷标序列号: %3)插入驱动器 %1。   0036 打开共享的文件太多。   0038 已到达文件结尾。   0039 磁盘已满。   0050 不支持此网络请求。   0051 远程计算机无法使用。   0052 网络中存在重名。   0053 找不到网络路径。   0054 网络正忙。   0055 指定的网络资源或设备已不可用。   0056 已经达到网络命令的极限。   0057 网络适配器出现错误。   0058 指定的服务器无法执行所请求的操作。   0059 网络出现意外错误。   0060 远程适配器不兼容。   0061 打印机队列已满。   0062 服务器上没有存储等待打印的文件的空间。   0063 已经删除等候打印的文件。   0064 指定的网络名无法使用。   0065 拒绝访问网络。   0066 网络资源类型错误。   0067 找不到网络名。   0068 已超过本地计算机网络适配器卡的名称极限。   0069 已超过网络 BIOS 会话的极限。   0070 远程服务器已经暂停或者正在启动过程中。   0071 由于该计算机的连接数目已达到上限,此时无法再连接到该远程计算机。   0072 指定的打印机或磁盘设备已经暂停。   0080 该文件存在。   0082 无法创建该目录或文件。   0083 INT 24 失败。   0084 处理该请求的存储区不可用。   0085 正在使用该本地设备名。   0086 指定的网络密码不正确。   0087 参数错误。   0088 网络出现写入错误。   0089 此时系统无法启动其他进程。 0100 无法创建其他系统标志。   0101 属于其他进程的专用标志。   0102 标志已经设置, 无法关闭。   0103 无法再次设置该标志。   0104 中断时无法请求专用标志。   0105 此标志先前的所有权已终止。   0106 请将软盘插入驱动器 %1。   0107 后续软盘尚未插入,程序停止。   0108 磁盘正在使用或已由其他进程锁定。   0109 管道已经结束。   0110 系统无法打开指定的设备或文件。   0111 文件名太长。   0112 磁盘空间不足。   0113 没有其他可用的内部文件标识符。   0114 目标内部文件标识符不正确。   0117 该应用程序所运行的 IOCTL 调用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科尔沁第一狠人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值