linux内核spi子系统驱动架构以与其数据传输

上传人:ji****en 文档编号:107696674 上传时间:2019-10-20 格式:PDF 页数:25 大小:853.25KB
返回 下载 相关 举报
linux内核spi子系统驱动架构以与其数据传输_第1页
第1页 / 共25页
linux内核spi子系统驱动架构以与其数据传输_第2页
第2页 / 共25页
linux内核spi子系统驱动架构以与其数据传输_第3页
第3页 / 共25页
linux内核spi子系统驱动架构以与其数据传输_第4页
第4页 / 共25页
linux内核spi子系统驱动架构以与其数据传输_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《linux内核spi子系统驱动架构以与其数据传输》由会员分享,可在线阅读,更多相关《linux内核spi子系统驱动架构以与其数据传输(25页珍藏版)》请在金锄头文库上搜索。

1、 1 SPI 子系统驱动架构以及其数据传输 20132013 年年 1 1 月月 2424 日日 linux 2.6.35 目标:目标: 分析整理 SPI 子系统初始化驱动架构; 本文要点:本文要点: 1、spi 重要数据结构及关系图; 2、spi 子系统初始化驱动架构; 3、spi 数据的传输; 硬件框图:硬件框图: 数据结构:数据结构: (片选信号可以有多个) MISO MOSI SS2 SS1 SCL SPI Master2 Slave2 Slave1 MISO MOSI SS2 SS1 SCL SPI Master1 Slave2 Slave1 2 bus_num spi_master

2、 dev mxc_bitbang mxc_spi *master spi_bitbang id platform_device dev device *parent device *class spi_master_class spi_board_info board_info0 boardinfo list bus_num spi_board_info chip_select 复制一份 spi_register_board_info() board_list 板卡注册 spi_register_master() max_speed_hz *controller_data modalias *

3、platform_data *master spi_device dev chip_select max_speed_hz modalias *controller_data *platform_data spi_new_device()构造、并注册 *parent device 开发人员自己使用 最终生成 注1 注1: spi_register_master()执行到完成spi_master注册后,会调用scan_boardinfo(),查询匹配board_list链表上的外设数据结构;当确认某外 设使用当前被注册的控制器(即spi_master.bus_num=spi_board_info

4、.bus_num成立)后,将调用 spi_new_device() ,构造该外设对 应的spi_device并注册; 注2: 显然板卡注册需先于控制器注册,这里稍稍提醒; 开发人员定义 platform_driver.probe() spi_device的构造及其关系的构造及其关系 构建 注2 3 spi_master dev *parent device *class spi_master_class *master spi_device dev modalias *parent device *bus *driver device_private knode_bus *p .driver

5、spi_diver *id_table *probe *name device_driver *bus driver_private knode_bus *p .match spi_bus_type *p spi_match_device() *devices_kset bus_type_private *drivers_kset platform_device dev device spi_device_id char name32 driver_data 数组 x0 xi xn 注1 注2 spi设备模型总图设备模型总图 注1:platform_device是spi_master控制器的平

6、台设备资源数据结构; 注2:spi_device.modalias由spi_board_info.modalias获得; spi_driver.device_driver.name和spi_driver.id_table.name由驱动直接指定;需注意的是,spi_device.modalias 优先与 spi_driver.id_table.name匹配,当驱动中spi_driver.id_table为空时,spi_device.modalias将与spi_driver .device_driver.name匹配; 开发人员定义 mcu_probe() 4 struct spi_board_

7、info /该结构主要用来匹配 spi master 和初始化 spi_device char modaliasSPI_NAME_SIZE; const void *platform_data; void *controller_data; int irq; u32 max_speed_hz; u16 bus_num; u16 chip_select; u8 mode; ; 关于关于 mode 传输模式:传输模式: 成员变量解说:成员变量解说: modalias spi_new_device()中将初始化 spi_device.modalias, 用来和 spi_driver.driver-n

8、ame 等进行匹配; platform_data spi_new_device()中将初始化 spi_device.dev.platform_data,存储驱动的特定数据 controller_data spi_new_device()中将初始化 spi_device.controller_data,有些控制器需要有关硬件设置的数据,如 DMA 等 irq spi_new_device()中将初始化 spi_device.irq,由硬件原理图连线确定 max_speed_hz,最大的传输速率,取决于 spi 设备芯片的 datasheet 以及 spi master mode 模式信息,取决于

9、使用哪种传输模式,控制器是否三线连线模式,片选信号激活时候电平高低等, spi_master.mode_bits 会和它适配(见 spi_setup() ) 。 bus_num 用于和 spi _master.bus_num 适配(见 scan_boardinfo() ) ,硬件上该设备会连接到系统的某个 spi master 上 chip_select spi_new_device()中将初始化 spi_device.chip_select,表示该 spi 设备在硬件上是连接到 spi 控制器的第几个片 选脚。起始为 0,不能大过 spi_master.num_chipselect(由硬件决

10、定,即 spi 控制器的 SS 片选管脚的个数) platform_data 和 controller_data 区别:platform_data 存储驱动需要的额外内容(非标准定制,视需要定义具体内容) , controller_data 则是存储的与 spi 控制器相关的内容(非标准定制,视需要定义) spi 重要的数据结构重要的数据结构 spi_board_info.mode 定义 #define SPI_CPHA 0x01 /* clock phase */时钟相位 #define SPI_CPOL 0x02 /* clock polarity */时钟极性 #define SPI_M

11、ODE_0 (0|0) /* (original MicroWire) */四种传输模式 #define SPI_MODE_1 (0|SPI_CPHA) #define SPI_MODE_2 (SPI_CPOL|0) #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) #define SPI_CS_HIGH 0x04 /* chipselect active high? */片选电位为高 #define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */先输出低比特位 #define SPI_3WIRE 0x10 /* SI/

12、SO signals shared */输入输出共享接口,此时只能够半双工 #define SPI_LOOP 0x20 /* loopback mode */回写/回显模式 #define SPI_NO_CS 0x40 /* 1 dev/bus, no chipselect */只有单个从设备 #define SPI_READY 0x80 /* slave pulls low to pause */ 5 spi 的四种传输模式的四种传输模式 LSB(Least Significant Bit) ,意为最低有效位;MSB(Most Significant Bit) ,意为最高有效位 SPI 模块

13、为了和外设进行数据交换, 根据外设工作要求, 其输出串行同步时钟极性和相位可以进行配置, 时钟极性(CPOL)对传输协议没有重大的影响。 如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果 CPOL=1,串行同步时钟的空闲状态为高电 平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果 CPHA=0,在串 行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果 CPHA=1,在串行同步时钟的第二个跳变沿 (上升或下降)数据被采样。 SPI 主模块和与之通信的外设备时钟相位和极性应该一致。 6 struct boardinfo struct list_head

14、list; unsigned n_board_info; struct spi_board_info board_info0; ; spi_board_info与与 boardinfo的关系:的关系: spi_board_info:每个 spi_board_info代表一个设备,spi_board_info 以数组的形式组织 boardinfo:boardinfo会将 spi_board_info的内容拷贝过来填充其 board_info结构,相关函数为 spi_register_board_ino(struct spi_board_info const *info, unsigned n),

15、其中 n 代表有多少个 spi_board_info这 样的数组元素。一个 board_info对应一个 spi_board_info数组(即 1 个以上的 spi_board_info,但实际上 spi_board_info数组元素一般只定义一个,以对应 board_list 上的一个节点仅表示一个设备的逻辑关系) , 每个 boardinfo都会连接到一个全局 board_list 链表。 图示如下: 成员变量解说:成员变量解说: list 链表,连接到一个名叫 board_list 的链表 n_board_info 有几个 spi_board_info 结构。spi_register_board_ino(struct spi_board_info const *info, unsigned n) 函数中的 n 用来初始化该成员 board_info 根据 n_board_info 的数目,组成一个 spi_board_info. boardinfo list n_board_info board_info0 . . board_infon_board_info

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号