基于ARM9微处理器与Linux操作系统的SD驱动开发.pdf

上传人:qwe****56 文档编号:74651972 上传时间:2023-02-27 格式:PDF 页数:6 大小:289.92KB
返回 下载 相关 举报
基于ARM9微处理器与Linux操作系统的SD驱动开发.pdf_第1页
第1页 / 共6页
基于ARM9微处理器与Linux操作系统的SD驱动开发.pdf_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《基于ARM9微处理器与Linux操作系统的SD驱动开发.pdf》由会员分享,可在线阅读,更多相关《基于ARM9微处理器与Linux操作系统的SD驱动开发.pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、http:/-1-基于基于 ARM9 微处理器与微处理器与 Linux 操作系统的操作系统的 SD 驱动开发驱动开发 潘永新,刘杰,范春晓,邹俊伟 北京邮电大学电子工程学院,北京(100876)E-mail: 摘摘 要:要:本文是基于 ARM9-S3C2410 微处理器为硬件平台,以开放源代码的 Linux 为嵌入式操作系统,设计并实现了 SD 卡的驱动程序。主要从 SD 卡的内部通信模式和驱动开发两个方面加以阐述说明。关键词:关键词:驱动程序;嵌入式;SD 卡;ARM;Linux 1.引言引言 SD 卡的全称是 Secure Digital Card,是由日本松下公司、东芝公司和美国 San

2、disk 公司共同开发研制的新型存储卡产品。SD 存储卡是一个安全开放的标准。SD 卡它的封装技术较为先进,而且目前已经相当成熟。它的最大的特点是通过加密功能,可以保证数据资料的安全保密。它还具备版权保护技术,所采用的版权保护技术是 DVD 中使用的 CPRM 技术1。因此,SD 卡广泛应用在移动电话,数码相机,数码摄像机,MP3,PDA 等多种数码产品上。本文将介绍基于开放源代码的Linux操作系统和三星公司的ARM9-S3C2410处理器的SD设备驱动的实现过程。2.系统硬件平台系统硬件平台 嵌入式Linux可以运行的硬件平台十分广泛,从x86、MIPS、POWERPC到ARM,以及其他许

3、多硬件体系结构。本次开发所采用的硬件平台是基于ARM9体系结构的Nano2410A V2.0开发板,处理器型号是S3C2410,该微处理器是一款由三星公司为手持设备设计的体积小、低功耗、低成本、高性能、高度集成的32位微处理器。采用五级流水线,指令与数据分离的Cache,时钟频率最高可达266MHz,具有MMU功能,支持Thumb(16位)/ARM(32位)双指令集,具有31个通用寄存器和6个状态寄存器,片内外围线路包含SD/MMC接口,可以通过处理器实现对SD/MMC卡的操作3。在该硬件平台上已经包含了可以正常运行于其上的Linux操作系统。该系统的硬件平台框架图如下所示:图1 系统硬件平台

4、框图 http:/-2-3.SD 卡的相关描述卡的相关描述 3.1 SD 卡的总线引脚信号卡的总线引脚信号(1)CLK:时钟信号。(2)CMD:命令/响应信号。(3)DAT0-DAT3:双向数据传输信号。(4)VDD,Vss1,Vss2:电源和地信号。其原理图如下所示:表1 SD卡引脚描述 引脚 名称 类型 1 CD/DAT3卡探测/数据线Bit3 2 CMD 命令/响应 3 VSS1 电源地 4 VDD 电源 5 CLK 时钟 6 VSS2 电源地 7 DAT0 数据线Bit0 8 DAT1 数据线Bit1 9 DAT2 数据线Bit2 3.2 SD 卡的寄存器卡的寄存器 SD卡接口定义了6

5、个寄存器:OCR,CID,CSD,RCA,DSR和SCR。这些寄存器仅可以通过响应的命令来读取。OCR,CID,CSD和SCR寄存器包含卡的状态信息,而RCA和DSR寄存器存储卡的实际配置参数2。表2 SD卡寄存器描述 名称 位宽 描述 OCR 32 操作条件寄存器 CID 128 ID卡标志寄存器,每个卡惟一 CSD 128 SD特定数据寄存器,存储关于卡的操作条件 RCA 16 卡相对地址寄存器,卡在系统中的局部地址 DSR 16 驱动电压配置寄存器,配置卡的输出驱动 SCR 64 SD配置寄存器,存储关于卡的特征和性能 3.3 SD 卡的通信模式卡的通信模式 主机和 SD 卡之间的通信过

6、程由主机统一控制。SD 卡通信中使用两种模式:卡识别模式和数据传输模式。(1)卡识别模式。主机复位后进入卡识别模式来搜索新卡。卡会保持该种模式直到收到命令 SEND_RCA(CMD3)。在该种模式中,主机复位所有 SD 卡,校验操作电压范围,请求SD 相对卡地址(RCA)。该种操作通过选择他们的命令线依次对每个 SD 卡进行。在卡识别模式下进行的数据通信全部在 CMD 线上传输。流程图如图 2 所示。http:/-3-图2 SD卡识别过程 (2)数据传输模式。卡识别过程结束后,进入数据传输模式。在该模式中,主机发送SEND_CSD(CMD9)命令获取卡的 CSD 寄存器的内容(例如传输块的长度

7、和卡存储容量)。发送 CMD7 命令来选择一个卡进入传输状态,在任意时刻,只有一个卡可以处于该状态。SD卡读写数据通常按块读写,因此需要设定数据块的大小。通常与文件系统类似,我们将其设定为 512 字节。每次读写均是该数据块的整数倍。其中写命令必须在 SD 卡处于非选定状态之前停止。命令 CMD17/CMD18 和 CMD24/CMD25 分别是对卡读一个或多个和写一个或多个数据块,这些数据都会在末尾附有 CRC 校验码,当校验失败,所传数据均会被丢弃,数据读写操作也会被终止。4.Linux 下下 SD 卡驱动的实现卡驱动的实现 4.1 驱动程序的开发驱动程序的开发 驱动程序是应用和硬件设备之

8、间的一个软件层。它的主要作用在于提供应用程序访问硬件设备的机制4。Linux 系统将设备驱动分成三种类型:(1)字符设备:能够像字节流一样访问的设备,比如键盘,打印机等(2)块设备:通常是按照块为单位来访问数据的设备,每次访问都应该是块的整数倍,比如磁盘,SD 卡等。(3)网络设备:任何网络事务都要经过一个网络接口,即一个能够和其他主机交换数据的设备。比如网卡。SD 卡通过数据块实现读写信息的操作,所以需要将 SD 卡的实现为一个块设备驱动程序来完成系统及应用程序对它的访问。在 Linux 系统中共有两种程序运行状态:用户态和核心态。驱动程序属于 Linux 内核的一部分,所以驱动程序运行于内

9、核态。它可以通过编译进内核或者动态加载模块的方式整合http:/-4-进系统中。其中模块方式具有灵活、方便、易于调试等诸多优点,因此我们采用后者进行开发。为了实现驱动模块的加载和卸载,需要在驱动程序中实现两个函数:用于内核加载模块时调用的 init_module 函数和模块卸载之前调用的 cleanup_module 函数。在加载 SD 卡的驱动模块时,应先将 SD 卡作为块设备在系统中进行注册,以便其他程序需要访问时可以从系统中找到它。而在模块卸载时,需要将其注销,以便下次注册时能正确执行。调用过程如图 3 所示,这两个函数原型如下:#include int register_blkdev(

10、unsigned int major,const char*name,struct block_device_operations*sdops);int unregister_blkdev(unsigned int major,const char*name);第一个参数 major 表示注册设备的主设备号,当它的值为 0 的时候,表示给设备动态分配主设备号,并将该设备号返回给调用者,若返回一个负值表示错误。第二个参数 name 表示设备名称。第三个参数 block_device_operations 是一个结构体类型的数据,它里面定义了对 SD 块设备的各种操作函数成员。注销函数的参数必须与

11、 register_blkdev 的参数相匹配,否则会返回-ENINVAL,并不做任何注销工作。block_device_operations 结构体定义如下:struct block_device_operations int(*open)(struct inode*inode,struct file*filp);int(*release)(struct inode*inode,struct file*filp);int(*ioctl)(struct inode*inode,struct file*filp,unsigned cmd,unsigned long arg);int(*check

12、_media_change)(kdev_t dev);int(*revalidate)(kdev_t dev);其中 open 和 release 函数分别实现设备的打开和释放的操作;ioctl 完成不同设备的特殊化操作,块设备会截取大量的标准请求,因此大多数的块设备的 ioctl 函数都十分短小;check_media_change 主要作用检测介质是否发生变化,该函数只适用于那些支持可移动介质的驱动器;revalidate 函数作用是当介质被更换时,告诉驱动程序完成必要的工作,以便使用新的介质。在这个重要的结构体中并没有实现关键的块设备的读写功能。在 Linux 块设备中通常使用请求队列来

13、完成读写操作。每一个设备都有一个请求队列,它包含着块设备 I/O 请求的序列。系统会自动将处理请求连接成请求队列,启动对请求的响应,并且保证所有的请求最终被驱动程所处理。请求队列的处理函数原型如下:#include static void sd_request(request_queue_t*q);处理请求队列的过程大致分为:测试请求的有效性;执行实际的数据传输;清除已经处理过的请求;返回开头,开始处理下一条请求。驱动程序使用函数 blk_init_queue 来初始化一个请求队列,并把实际的传输函数传递给队列。请求队列的创建和删除函数原型如下:blk_init_queue(request_q

14、ueue_t*queue,&dev-lock);blk_cleanup_queue(request_queue_t*queue);SD 卡的读写操作是在这个队列处理函数中完成的,这个函数通过轮询的方式不断查看请求队列中是否有任务,然后根据 cmd 命令域来判断是读操作还是写操作,并由相应的硬http:/-5-件来执行。在驱动程序中还有两个重要的函数,驱动程序调用函数 refile_buffer()告诉核心准备改变缓冲块的状态;调用 mark_buffer_uptodate()告诉核心已完成对缓冲区的操作,用于保证缓冲高速缓存保持正确,防止有错误指向的指针,它的第二个参数为 1 表示传输成功;为

15、0 表示传输失败5。其中,SD 卡的函数调用以及驱动框图如图 3 所示:图3 SD卡的驱动架构图 4.2 驱动程序的实现驱动程序的实现 使用驱动程序的目的是为了使用其支持的设备。块设备是文件的载体,使用块设备实际上就是把块设备映射到指定的目录。在 Linux 中,几乎把所有的东西都当作文件,块设备也不例外。每个设备都有对应的特殊文件,也叫设备文件或是节点文件。设备文件一般存储在/dev 目录下。建立设备文件的命令如下:#mknod /dev/sd b 主设备号 次设备号 在执行此命令之后,在/dev 目录下将建立一个名叫 sd 的设备文件。此时应用程序若要访问 SD 卡,只需用系统提供的接口函

16、数对该设备文件进行操作即可。当然在建立设备节点文件之前应当将 sd 驱动模块通过#insmod sd.ko 命令加载到系统当中。当 SD 设备插入系统时,可以通过 mount 命令将 SD 卡挂载到 Linux 文件系统上,它的命令格式为:#mount sd 块设备文件 映射目录(可包含路径)http:/-6-以后对映射目录的文件进行的读写操作即是对 SD 卡的读写操作。当对映射目录读写完毕后,可以通过#umount 映射目录(可包含路径)命令取消目录映射。若不再使用驱动程序时可以卸载它,这时调用#rmmod sd 命令实现驱动模块的卸载。从而实现了对 SD 驱动的灵活管理。5.总结总结 到目

17、前为止已经完成了 SD 卡在 Linux 下的驱动程序,它可以驱动 SD 存储卡,实现卡上数据的存储读取,实现支持 SD 卡功能的手持设备的 SD 卡的正常工作。可以以此工作为基础进一步开发基于 SD 接口的字符设备产品的驱动,例如:SD 安全 Key,SDIO 卡等。参考文献参考文献 1 SD Group.SD Memory Card Specification Part1 Physical Layer Specification version1.01.2000.2 SD Group.SD Memory Card Specification Part2 File System Specif

18、ication version1.01.2000.3 S3C2410 datasheets Samsung ElectronicsCo,Ltd.2003 4 Jonathan Corbet,Alessandro Rubini&GregKroah-Hartman Linux Device Drivers OReilly Inc.2006 5 Robert Love.Linux Kernel Development Second Edition.机械工业出版社,2006 SD Driver Development Based on ARM9 Micro-processor and Linux Sy

19、stem Pan Yongxin,Liu Jie,Fan Chunxiao,Zou Junwei School of Electronic Engineering,BUPT,Beijing(100876)Abstract Based on the hardware platform with build-in micro-processor ARM9-S3C2410 and embeded system of open-sourced Linux,this paper aims at the design and realization of the driver program of SD card.The communication pattern inside the SD card and the driver program developing are illustrated.Keywords:Linux driver;Embedded;SD card;ARM;Linux 作者简介作者简介:潘永新(1982.2-),男,北京邮电大学电子工程学院研究生,专业方向:通信与信息系统。

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

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁