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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Linux老A

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

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

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

打赏作者

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

抵扣说明:

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

余额充值