已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux 下 spi 驱动开发 一 概述 基于子系统去开发驱动程序已经是 linux 内核中普遍的做法了 前面写过基于 I2C 子系统 的驱动开发 本文介绍另外一种常用总线 SPI 的开发方法 SPI 子系统的开发和 I2C 有很 多的相似性 大家可以对比学习 本主题分为两个部分叙述 第一部分介绍基于 SPI 子系 统开发的理论框架 第二部分以华清远见教学平台 FS S5PC100 上的 M25P10 芯片为例 内 核版本 2 6 29 编写一个 SPI 驱动程序实例 二 SPI 总线协议简介 介绍驱动开发前 需要先熟悉下 SPI 通讯协议中的几个关键的地方 后面在编写驱动时 需要考虑相关因素 SPI 总线由 MISO 串行数据输入 MOSI 串行数据输出 SCK 串行移位时钟 CS 使能信号 4 个信号线组成 如 FS S5PC100 上的 M25P10 芯片接线为 上图中 M25P10 的 D 脚为它的数据输入脚 Q 为数据输出脚 C 为时钟脚 SPI 常用四种数据传输模式 主要差别在于 输出串行同步时钟极性 CPOL 和相位 CPHA 可以进行配置 如果 CPOL 0 串行同步时钟的空闲状态为低电平 如果 CPOL 1 串行同步时钟的空闲状态为高电平 如果 CPHA 0 在串行同步时钟的前沿 上升或下 降 数据被采样 如果 CPHA 1 在串行同步时钟的后沿 上升或下降 数据被采样 这四种模式中究竟选择哪种模式取决于设备 如 M25P10 的手册中明确它可以支持的两种模 式为 CPOL 0 CPHA 0 和 CPOL 1 CPHA 1 三 linux 下 SPI 驱动开发 首先明确 SPI 驱动层次 如下图 我们以上面的这个图为思路 1 1 PlatformPlatform busbus Platform bus 对应的结构是 platform bus type 这个内核开始就定义好的 我们不需要 定义 2 2 Platform devicePlatform device SPI 控制器对应 platform device 的定义方式 同样以 S5PC100 中的 SPI 控制器为例 参 看 arch arm plat s5pc1xx dev spi c 文件 点击点击 此处此处 折叠或打开折叠或打开 1 struct platform device s3c device spi0 2 name s3c64xx spi 名称 要和 Platform drive r 匹配 3 id 0 第 0 个控制器 S5PC100 中有 3 个控制器 4 num resources ARRAY SIZE s5pc1xx spi0 resource 占用 资源的种类 5 resource s5pc1xx spi0 resource 指向资源结构数组的指针 6 dev 7 dma mask 12 13 static struct s3c64xx spi cntrlr info s5pc1xx spi0 pdata 14 cfg gpio s5pc1xx spi cfg gpio 用于控制器管脚的 IO 配置 15 fifo lvl mask 0 x7f 16 rx lvl offset 13 17 18 19 static int s5pc1xx spi cfg gpio struct platform device pdev 20 21 switch pdev id 22 case 0 23 s3c gpio cfgpin S5PC1XX GPB 0 S5PC1XX GPB0 SPI MISO0 24 s3c gpio cfgpin S5PC1XX GPB 1 S5PC1XX GPB1 SPI CLK0 25 s3c gpio cfgpin S5PC1XX GPB 2 S5PC1XX GPB2 SPI MOSI0 26 s3c gpio setpull S5PC1XX GPB 0 S3C GPIO PULL UP 27 s3c gpio setpull S5PC1XX GPB 1 S3C GPIO PULL UP 28 s3c gpio setpull S5PC1XX GPB 2 S3C GPIO PULL UP 29 break 30 31 case 1 32 s3c gpio cfgpin S5PC1XX GPB 4 S5PC1XX GPB4 SPI MISO1 33 s3c gpio cfgpin S5PC1XX GPB 5 S5PC1XX GPB5 SPI CLK1 34 s3c gpio cfgpin S5PC1XX GPB 6 S5PC1XX GPB6 SPI MOSI1 35 s3c gpio setpull S5PC1XX GPB 4 S3C GPIO PULL UP 36 s3c gpio setpull S5PC1XX GPB 5 S3C GPIO PULL UP 37 s3c gpio setpull S5PC1XX GPB 6 S3C GPIO PULL UP 38 break 39 40 case 2 41 s3c gpio cfgpin S5PC1XX GPG3 0 S5PC1XX GPG3 0 S PI CLK2 42 s3c gpio cfgpin S5PC1XX GPG3 2 S5PC1XX GPG3 2 S PI MISO2 43 s3c gpio cfgpin S5PC1XX GPG3 3 S5PC1XX GPG3 3 S PI MOSI2 44 s3c gpio setpull S5PC1XX GPG3 0 S3C GPIO PULL U P 45 s3c gpio setpull S5PC1XX GPG3 2 S3C GPIO PULL U P 46 s3c gpio setpull S5PC1XX GPG3 3 S3C GPIO PULL U P 47 break 48 49 default 50 dev err 51 return EINVAL 52 3 3 Platform driverPlatform driver 再看 platform driver 参看 drivers spi spi s3c64xx c 文件 点击点击 此处此处 折叠或打开折叠或打开 1 static struct platform driver s3c64xx spi driver 2 driver 3 name s3c64xx spi 名称 和 platform device 对应 4 owner THIS MODULE 5 6 remove s3c64xx spi remove 7 suspend s3c64xx spi suspend 8 resume s3c64xx spi resume 9 10 11 platform driver probe 3 s16 bus num 表示是 SPI 主机控制器的编号 由平台代 码决定 4 u16 num chipselect 控制器支持的片选数量 即能支持多少个 spi 设备 5 int setup struct spi device spi 针对设备设置 SPI 的工 作时钟及数据传输模式等 在 spi add device 函数中调用 6 int transfer struct spi device spi 7 struct spi message mesg 实现数据的双向传输 可 能会睡眠 8 void cleanup struct spi device spi 注销时调用 9 4 4 SpiSpi busbus Spi 总线对应的总线类型为 spi bus type 在内核的 drivers spi spi c 中定义 点击点击 此处此处 折叠或打开折叠或打开 1 struct bus type spi bus type 2 name spi 3 dev attrs spi dev attrs 4 match spi match device 5 uevent spi uevent 6 suspend spi suspend 7 resume spi resume 8 对应的匹配规则是 高版本中的匹配规则会稍有变化 引入了 id table 可以匹配多个 spi 设备名称 点击点击 此处此处 折叠或打开折叠或打开 1 static int spi match device struct device dev struct device driver drv 2 3 const struct spi device spi to spi device dev 4 return strcmp spi modalias drv name 0 5 5 5 spi devicespi device 下面该讲到 spi device 的构建与注册了 spi device 对应的含义是挂接在 spi 总线上的 一个设备 所以描述它的时候应该明确它自身的设备特性 传输要求 及挂接在哪个总线 上 点击点击 此处此处 折叠或打开折叠或打开 1 static struct spi board info s3c spi devs initdata 2 3 modalias m25p10 4 mode SPI MODE 0 CPOL 0 CPHA 0 此处 选择具体数据传输模式 5 max speed hz 10000000 最大的 spi 时钟频率 6 Connected to SPI 0 as 1st Slave 7 bus num 0 设备连接在 spi 控制器 0 上 8 chip select 0 片选线号 在 S5PC100 的控制器驱动 中没有使用它作为片选的依据 而是选择了下文 controller data 里的方法 9 controller data 12 static struct s3c64xx spi csinfo smdk spi0 csi 13 0 14 set level smdk m25p10 cs set level 15 fb delay 0 x3 16 17 18 static void smdk m25p10 cs set level int high spi 控制 器会用这个方法设置 cs 19 20 u32 val 21 val readl S5PC1XX GPBDAT 22 if high 23 val 1 3 24 else 25 val 7 unsigned n 8 for n bi n board info n 0 n ch ip 9 if chip bus num master bus num 10 continue 11 NOTE this relies on spi new d evice to 12 issue diagnostics when given bo gus inputs 13 14 void spi new device master chi p 创建并注册了 spi device 15 16 17 mutex unlock 18 6 6 spi driverspi driver 本文先以 linux 内核中的 driver mtd devices m25p80 c 驱动为参考 点击点击 此处此处 折叠或打开折叠或打开 1 static struct spi driver m25p80 driver spi driver 的构建 2 driver 3 name m25p80 4 bus 11 12 spi register driver spi driver 的注册 13 14 在有匹配的 spi device 时 会调用 m25p probe 15 16 static int devinit m25p probe struct spi device spi 17 18 19 根据传入的 spi device 参数 可以找到对应的 spi master 接下来就可以利用 spi 子系 统为我们完成数据交互了 可以参看 m25p80 read 函数 要完成传输 先理解下面几个结 构的含义 这两个结构的定义及详细注释参见 include linux spi spi h spi message 描述一次完整的传输 即 cs 信号从高 底 高的传输 spi transfer 多个 spi transfer 够成一个 spi message 举例说明 m25p80 的读过程如下图 可以分解为两个 spi transfer 一个是写命令 另一个是读数据 具体实现参见 m25p80 c 中的 m25p80 read 函数 下面内容摘取之此函数 点击点击 此处此处 折叠或打开折叠或打开 1 struct spi transfer t 2 定义了两个 spi transfer 2 struct spi message m 定义了两个 spi message 3 spi message init 初始化其 transfers 链表 4 5 t 0 tx buf flash command 6 t 0 len CMD SIZE FAST READ DUMMY BYTE 定义第一个 t ransfer 的写指针和长度 7 spi message add tail 添加到 spi message 8 t 1 rx buf buf 9 t 1 len len 定义第二个 transfer 的读指针和长度 10 11 spi message add tail 添加到 spi message 12 flash command 0 OPCODE READ 13 flash command 1 from 16 14 flash command 2 from 8 15 flash command 3 from 初始化前面写 buf 的内容 16 17 spi sync flash spi 调用 spi master 发送 spi message 18 19 spi sync 为同步方式发送 还可以用 spi async 异步方式 那样的话 需要设置回调完 成函数 20 21 另外你也可以选择一些封装好的更容易使用的函数 这些函数可以在 include linux spi sp i h 文件中找到 如 22 23 extern int spi write then read struct spi device spi 24 const u8 txbuf unsigned n tx 25 u8 rxbuf unsigned n rx 这篇博文就到这了 下篇给出一个针对 m25p10 完整的驱动程序 Linux 下 spi 驱动开发之之 m25p10m25p10 驱动测试驱动测试 目标 在华清远见的 FS S5PC100 平台上编写一个简单的 spi 驱动模块 在 probe 阶 段实现对 m25p10 的 ID 号探测 flash 擦除 flash 状态读取 flash 写入 flash 读取等操 作 代码已经经过测试 运行于 2 6 35 内核 理解下面代码需要参照 m25p10 的芯片手册 其实下面的代码和处理器没有太大关系 这也是 spi 子系统的分层特点 点击点击 此处此处 折叠或打开折叠或打开 1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include kzalloc 9 include 10 11 define FLASH PAGE SIZE 256 12 13 Flash Operating Commands 14 define CMD READ ID 0 x9f 15 define CMD WRITE ENABLE 0 x06 16 define CMD BULK ERASE 0 xc7 17 define CMD READ BYTES 0 x03 18 define CMD PAGE PROGRAM 0 x02 19 define CMD RDSR 0 x05 20 21 Status Register bits 22 define SR WIP 1 Write in progress 23 define SR WEL 2 Write enable latch 24 25 ID Numbers 26 define MANUFACTURER ID 0 x20 27 define DEVICE ID 0 x1120 28 29 Define max times to check status register before we give up 30 define MAX READY WAIT COUNT 100000 31 define CMD SZ 4 32 33 struct m25p10a 34 struct spi device spi 35 struct mutex lock 36 char erase opcode 37 char cmd CMD SZ 38 39 40 41 Internal Helper functions 42 43 44 45 Read the status register returning its value in the location 46 Return the status register value 47 Returns negative if error occurred 48 49 static int read sr struct m25p10a flash 50 51 ssize t retval 52 u8 code CMD RDSR 53 u8 val 54 55 retval spi write then read flash spi 56 57 if retval spi dev error d reading SR n int retval 59 return retval 60 61 62 return val 63 64 65 66 Service routine to read status register until ready or timeout o ccurs 67 Returns non zero if error 68 69 static int wait till ready struct m25p10a flash 70 71 int count 72 int sr 73 74 one chip guarantees max 5 msec wait here after page writes 75 but potentially three seconds after page erase 76 77 for count 0 count MAX READY WAIT COUNT count 78 if sr read sr flash cmd 0 CMD WRITE ENABLE 97 return spi write flash spi flash cmd 1 98 99 100 101 Erase the whole flash memory 102 103 Returns 0 if successful non zero otherwise 104 105 static int erase chip struct m25p10a flash 106 107 Wait until finished previous write command 108 if wait till ready flash 109 return 1 110 111 Send write enable then erase commands 112 write enable flash 113 flash cmd 0 CMD BULK ERASE 114 return spi write flash spi flash cmd 1 115 116 117 118 Read an address range from the flash chip The address range 119 may be any size provided it is within the physical boundaries 120 121 static int m25p10a read struct m25p10a flash loff t from size t len char buf 122 123 int r count 0 i 124 125 flash cmd 0 CMD READ BYTES 126 flash cmd 1 from 16 127 flash cmd 2 from 8 128 flash cmd 3 from 129 130 if 1 131 struct spi transfer st 2 132 struct spi message msg 133 134 spi message init 135 memset st 0 sizeof st 136 137 flash cmd 0 CMD READ BYTES 138 flash cmd 1 from 16 139 flash cmd 2 from 8 140 flash cmd 3 from 141 142 st 0 tx buf flash cmd 143 st 0 len CMD SZ 144 spi message add tail 145 146 st 1 rx buf buf 147 st 1 len len 148 spi message add tail 149 150 mutex lock 151 152 Wait until finished previous write command 153 if wait till ready flash 154 mutex unlock 155 return 1 156 157 158 spi sync flash spi 159 r count msg actual length CMD SZ 160 printk in s read d bytes n func r count 161 for i 0 i lock 166 endif 167 168 return 0 169 170 171 172 Write an address range to the flash chip Data must be written in 173 FLASH PAGE SIZE chunks The address range may be any size provide d 174 it is within the physical boundaries 175 176 static int m25p10a write struct m25p10a flash loff t to size t len const char buf 177 178 int w count 0 i page offset 179 struct spi transfer st 2 180 struct spi message msg 181 if 1 182 if wait till ready flash 读状态 等待 ready 183 mutex unlock 184 return 1 185 186 endif 187 write enable flash 写使能 188 189 spi message init 190 memset st 0 sizeof st 191 192 flash cmd 0 CMD PAGE PROGRAM 193 flash cmd 1 to 16 194 flash cmd 2 to 8 195 flash cmd 3 to 196 197 st 0 tx buf flash cmd 198 st 0 len CMD SZ 199 spi message add tail 200 201 st 1 tx buf buf 202 st 1 len len 203 spi message add tail 204 205 mutex lock 206 207 get offset address inside a page 208 page offset to FLASH PAGE SIZE 209 210 do all the bytes fit onto one page 211 if page offset len spi 217 218 w count msg actual length CMD SZ 219 220 else no 221 222 printk in s write d bytes to flash in total n fu nc w count 223 mutex unlock 224 return 0 225 226 227 static int check
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五年级上册数学习题数学广角植树问题教案
- 痴呆的护理教案(2025-2026学年)
- 2026年常州纺织服装职业技术学院高职单招职业适应性考试备考题库及答案详解
- Ctex细纱工艺教案(2025-2026学年)
- 2025年数字化图书馆:共享书房发展报告
- 六年级语文上册挂两支笔的孩子教案浙教版
- ABC教育大班语言活动教案(2025-2026学年)
- 大班语言活动照片的故事教案(2025-2026学年)
- 绝对值三角不等式微课市公开课百校联赛获奖教案
- 高中生物必修一第五章能量之源光与光合作用第三课时教案(2025-2026学年)
- 物业设施维护保养计划表
- 质量管理体系内审方法与技巧
- 上海市华二附中2026届化学高二第一学期期末统考试题含答案
- 私募基金管理人-突发事件应急预案管理制度
- 新风机组施工方案(3篇)
- 化学品泄漏应急知识培训课件
- 【《基于PLC的自卸汽车举升机构控制系统设计案例》5100字】
- 《这一次我全力以赴》(2023年广东省中考满分作文13篇附审题指导)
- 空调技师考试题及答案
- 思想道德与法治2023年版电子版教材-1
- 蜜雪冰城加盟合同协议
评论
0/150
提交评论