论文研究-基于嵌入式Linux系统SPI驱动的研究与实现 .pdf

所需积分/C币:9 2019-08-18 20:46:54 388KB .PDF
12
收藏 收藏
举报

基于嵌入式Linux系统SPI驱动的研究与实现,余瑾,袁野,ARM-Linux操作系统下,SPI总线操作,自上而下分为3个层次:平台依赖层、硬件抽象层和用户接口层。本文基于linux内核的驱动管理和注册机
山国武花论文在丝 总线驱动框架 在2.6的1inux内核中,SPI的驱动架构可以分为如下三个层次:SPI核心层、SPI控制器 驱动层和SPI设备驱动层。 Linux中SPI驱动代码位于 drivers/spi日录。SPI核心层是 Linux 的SPI核心部分,提供了核心数据结构的定义、SPI控制器驱动和设备驱动的注册、注销管理 等API。其为使件平台无关层,向下屏蔽了物理总线控制器的差异,定义了统一的访问策賂 和接冂;其向上提供了统ˉ的接∏,以便SP设备驱动通过总线控制器进行数据收发。 Linux 中,SPI核心层的代码位于 driver/spi/spi.c。SPl控制器驱动层,每种处理器平台都有 自己的控制器驱动,風于平台移植相关层。它的职责是为系统中每条SPI总线实现相应的读 写方法。在物理上,每个S門I控制器可以连接若干个SPI从设备。在系统开机时,SPI控制器 驱动被首先装载。一个控制器驱动用于支持一条特定的SP总线的读写。一个控制器驱动可 以用数据结构 struct spl master来描述。SPI设各驱动层为用户接口层,其为用户提供了通 过SPI总线访问具体设备的接口。SP设备驱动层可以用两个模块来描述, struct spi driver和 struct spi device。通常来说 spi device对应着SPI总线上某个特定的 slave 并且 spi device封裝了一个 spI master结构体。 spi device结构体包含了私有的特定的 lave设备特性,包括它最大的频率,片选那ˆ,输入输岀模式等等。其驱动架构如图2所示 平合依蝻层( PlatforM Relied Layer sI控制对应的 Platform busy 控制对应的4 platform dcvicc1' Platform driver 硬什家层 Hardwarc Abstract Layer GpI模拟$序艹 sPI同/异步消息 sm上ith3ncp 件无关头坝 传等桑作s 用户接口尽 user intrface Layer 普通或特走5P设舞 sPI控祠器对应 对应的 sp1 device4 卫 atfor device 图21inux下spi总线驱动架构 驱动程序设计 通过 Platform机制开发发底层驱动,主要分为三个步骤: (1)总线注册阶段: 内核启动初始化时的main.c文件中的 kernel init0→ do basic setup(→ driver init0→ platform bus init0→ bus register(& platform bus type),注册了条 platform总线(虚拟总线, platform bus)。 (2)添加设备阶段: 设备注册的时候 Platform device register(→ platform device add()→(pdev→ dev.bus-& platform bus type)→ device add(,就这样把设备给挂到虚拟的总线上。 (3)驱动注册阶段 Platform driver register driver register o bus add driver o driver attach(→ bus for each dev(,对在每个挂在虚拟的 platform bus的设备作 driver attach→ driver probe device(,判断drv→bus→ match(是否执行成功,此时 山国武花论文在丝 通过指针执行 platform match→ strncmp(pdev→name,dry→name, BUS ID SIZE),如果相 符就调用 really probe(实际就是执行相应设备的 platform driver probe( platform device)。)开始真正的探测,如果 probe成功,则绑定设备到该驱动。 其中,第一个步骤总线的注册是由1inux内核定义及初始化好了的,因此不需要添加代 码。在s3c6410开发板上,spi的 paltform device结构体定义如下 struct platform device s3c64xx device spio-t name=s3c61xx-spi d=0 num resources-ARRAY SIZE(s3c64xx spi0 resource) resource=s3c64xx spi0 resource de lev dma mask=&spi damask coherent dma mask= DMA BIT MASK (32) platform data = &s3c64xx spio pdata 其中 resource结构体对应spi的在板资源,包括所有的与spi总线相关的寄存器地址,从 0x7FO0B000开始。 dma mask表示dma的寻址范围, coherent dma mask表示可以通过关闭 cache 等措施保证一致性的dma寻址范围,id为0表示第一路的spi信号(6110芯片一共两路spi信号, 分别是gpe[0:3])gpc[4:7])。 palform data表示特殊的平台数据,在s3c64 KX Spl0 pdata 结构体中主要定义了初始化spi相关管脚的函数,直接操作底层硬件 palform device结构体设计完成之后进行 palform driver的设计。 static structplatform driver s3c64xx spi driver=( driver=[.name="s3c64 XX SP1",//名称,和 platform device对应 owner= THIS MOdULE }, remove- s3c64xx spi remove suspend=s3c6xx spi suspend resume-s3c64xx spi resume platform driver probe(&s 3c64xx spi driver, s3c64xx spi probe); //EJ]s3c64xx spi probe方式的驱动会根据事先的配置安排加载并通过探测初始化进而启用硬件设备。它 以 XXX driver框架作统领,以 (xx probe函数完成设备的探测与初始化,以 XXX remove函数 完成设备的去除。相应的设备操作配置靠 mach XX.C文件指定。这里以SP接口的4线电阻 式触摸屏控制器驱动设计为例加以说明。该设备既是SP设备,也是输入设备。和平台中注 册的 platform device匹配后,调用s3c64 xx spi probe。然后根据传入的 platform devicc 参数,构建一个用于描述SPI控制器的结构体 spI master,并注册。后续注册的 spi device 需要选定自己的 spI master,并利用 spi master提供的传输功能传输spi数据。 SPI有一个描述控制器的对象叫 spI master。其主要成员是主机控制器的序号(系统中 可能存在多个SPI主机控制器)、片选数量、SPI模式和时钟设置用到的函数、薮据传输用到 的函数等。其定义如下: 山国武技论文在丝 struct device dev s16 bus num;∥/表示是SPI主机控制器的编号。由平台代码决定 u16 num chipselect;//控制器攴持的片选数量,即能支持多少个spi设备 int( Setup)( structspi device*spi);//针对设备设置SPI的工作时钟及数据传输模 式等。在 spi add device函数中调用。 int (*transfer)(structspi devic *spi struct spl message*mesg);//实现数据的双向传输,可能会睡眠 void( *cleanup)( structspi device*spi)://注销时调用 s3c64xspi.0和s3c64xx-spi.1与平台架构相关,所以我们到arch/arm/mach-s3c64xx 目录中找到了dev-spi.c,这个代码中定义了s3c64 xx device spi0和s3c64 xx device_spi1 也就是设备s3c64 XX SPI.0和s3c64 KX SpI.l的实现代码,所以 dev spi.c必须加入到编译中, 需要修改相关的编译配置文件。 然后,在mini6410的初始化代码,注意代码中的这个函数 platform add devices(mini6410 devices, ARRAY SIZE(mini6410 devices)),可以看出该 两数是批量初始化了一批设备,所以将&s3c64 kx device spi0,&S3c64 xx device spi1,加入 到mini6410 devices结构中,就可以将设备s3c64xX-spi.0和s3c6xx-spi.1进行初始化, s3c64 xx device_spi0和s3c61 x device spi1结构中的片选数量和时钟并未定义,需要根据 开发板的具体情况进行定义,函数原型 void init s3c64 xx spi set info( int cntrl,int src clk nr, int num cs)这里具体的执行代码如下: s3c64xx spi set info (0, 0, 1) 3c64xx spi set info (, 0, 1) 此时已经可以在平台目录中看见s3c64 x device spig0和s3c64 xx device spil,在类 sp1 master目录下看见spi0和spi1了。mach-mini6410.c中增加如下代码 static void cs set level(unsigned line id, int 1v1)I gpio direction output(linc id, 1v1); tatic struct s3c64xx spi csinfo s3c64xx spio csinfo Tb delay=100 line=S3C64XX GPC (3) set leve⊥= cs set leve l static struct spi board info s3c6410 spio board[=t modalias spider bus num 0 chip select-0,/必须小于s3c6410spi0 platdata. num CS irg -IRQ SPIo max speed hz= 500*1000 mode=SPI mOde o controller data=&s 3c64xx spio csinfo 山国武花论文在丝 设备驱动程序,通过硬件中断以消息传递形式异步完成数据采集并形成公共信息广播给 上层应用系统。由于中断中不能展开SPI通信进程,这里采用了异步传输和“自旋锁”机制, H回调睬数完成数据处理和上传。限于篇幅,没有考虑“去抖”滤波。 驱动的用户层接口 SPI的操作主要设置的是CPOL,CPIA,CS,SCLK,在 Linux下,主要是通过 IOCTL和 struct spi ioc transfer这个结构体米设置的。打开SP设备后,通过 LOCTL设置相关属性,spi 用户空间接口提供了 write、read、 unlocked ioctl、open、 release等五个cdev设备的标准 操作。 spider0.0和 spidey1.0都是挂接到 spider字符设备下子设备,它们共用一套设备操作 两数。其中重点是 spider_ ioctl函数,它用来设置spi设备的状态等等操作。它支持如下 命令 SPⅠ IOC RD MODE改置读的模式 SPI IOC RD LSB FIRST设置读字的格式 SPL1 OC RD BITS PER WORL设置读字长 SPL1 OC RD MAX SPEED HZ设置读的速度 SPI IOC WR MODE设置写的模式 SPI IOC WR LSB FIRST设置写的字格式 SPI IOC WR BITS PER WORD设置写的字长 SPI IOC WR MAX SPEED HZ设置写的速度 以MINI6410-ARM1为例,编写简单的测试程序,对6410芯片的 spick管脚进行示波器监测得 到如图结果 Tek TIThiq'd M Pos &,0B0US TRIOGER 类型 信源 斜率 发方式 目动 耦合 制 CHi 2009 CH2 200V M. Js ?120 23-11165163603 佟三测试结果 结论 本文详细介绍了嵌入式 Linux下字符设备驱动程序的编写过程及需要注意的细节,并 以SPI总线设备为例详细介绍了SPI总线设备驱动程序的实现.最后以Mini6410- ARMII 为例,编写了简单的测试程序实现了SPI数据的发送.对以SPI总线协议进行通信的设备 提供一定的参考价值。 山国武技论文在丝 参考文献 韩国三星集团三星 用户手册韩国:韩国三星集团 怯肇乾,陈永超 设备的添加与驱动实现 宋宝华 设备驱动川发详解北京:人民邮电出版社 曹颖鵬基于嵌入式驱动程序的研究与设计西安:内安电子科技大学 孙大泽,付晓江,袁文菊串行总线在系统中的编程实现微电子学与计算札

...展开详情
试读 7P 论文研究-基于嵌入式Linux系统SPI驱动的研究与实现 .pdf
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
论文研究-基于嵌入式Linux系统SPI驱动的研究与实现 .pdf 9积分/C币 立即下载
1/7
论文研究-基于嵌入式Linux系统SPI驱动的研究与实现 .pdf第1页
论文研究-基于嵌入式Linux系统SPI驱动的研究与实现 .pdf第2页

试读结束, 可继续读1页

9积分/C币 立即下载 >