摘要 简明介绍MMC卡驱动程序的体系结构,设计并实现MMC卡的底层驱动;对传统的块设备驱动程序中的单块读写进行改进,实现MMC卡的集群读写,同时实现了卡的电源管理和即插即用功能。
关键词 Linux MMC卡 底层驱动 集群读写 热拔插
引 言
MMC(Multitmedia Card)是一种体积小巧、容量大、使用方便的存储器,目前在手机等嵌入式系统中有着广泛的应用。MMC通过卡内的一个集成片内控制器对MMC卡进行控制和管理,当主机正确地驱动MMC卡后,就可以像磁盘一样方便地存取数据。本文所研究与实现的Linux驱动程序,以Intel XScale的PXA250为硬件平台,在遵循MMC卡通信协议规范的基础上,实现了卡的底层读写。然后对传统的块设备驱动程序中的单块读写进行了改进www.cechina.cn,实现了集群读写技术,提高了卡的读写速度;同时增加了电源管理功能,满足了嵌入式系统低功耗的需求;增加了即插即用功能,方便了用户的使用。
1 MMC卡驱动程序的体系结构
MMC卡仅通过5个引脚与主机的控制器相连,通过串行协议与主机通信。MMC卡在硬件上的简单构造必然导致在实现驱动
图1中各部分的功能为:
①底层驱动——处理直接涉及与MMC卡硬件寄存器端口的操作,包括:命令的发布和响应、中断响应和处理、PIO或者DMA通道数据传输等。
②集群读写——将磁盘相邻数据块的读写请求合并起来一起发布读写命令,以加快数据读写,并在读写中实现并发控制。
③电源管理——实现MMC卡的低功耗管理。
④热拔插管理——实现MMC卡的即插即用功能。
⑤守护线程——响应文件系统的读写请求并启动对卡的1/O。
2 MMC卡驱动程序的实现
2.1 底层驱动
底层驱动指的是直接对MMC卡进行操作。MMC卡采用串行的数据传输方式;是一种比较“精细”的卡,对它的操作比较复杂而且必须有准确的时序安排。以下从命令的发布和响应、中断响应和处理、DMA数据传输3个方面讲述如何进行底层读写驱动。
(1)命令发布和响应
MMC卡的操作是通过对其18个控制寄存器的读写实现的。首先,设置时钟起停寄存器MMC_STRCPL的最低两位为01.关闭MMC卡内部时钟。然后,设置中断屏蔽寄存器MMC_LMASK的最低7位都为1,屏蔽所有对MMC控制器的中断,再向指定的MMC控制寄存器中写入命令参数,如时钟频率设置寄存器MMC_CLKRT,读写块数寄存器MMC_NOB,命令寄存器MMC_CMD等。最后,打开内部时钟,解除屏蔽的中断。这时,当前读写进程进入睡眠状态,等待中断处理程序的唤醒。
(2)中断响应和处理
MMC卡在数据传输请求、内部时钟关闭、命令发布完毕、数据传输完毕的情况下都会产生中断,但足MMC卡的控制器只通过1裉GPIO23的引脚与CPU相连,用于中断信号线的复用;因此在中断处理程序中,必须首先判断到底是哪种原因产生的中断,然后再进行相应的处理。这里,MMC卡在正确发布读写命令以后CONTROL ENGINEERING China版权所有,系统会产生1次中断,中断处理程序中读取MMC_IREG的值www.cechina.cn,判断命令已经发布成功,同时唤醒等待命令完成的进程。
读写进程被中断唤醒后控制工程网版权所有,首先读取MMC卡响应寄存器MMC_RES中的状态信息,再根据这些状态信息判断命令是否发布成功和卡的当前状态。如果这些状态信息表示命令执行成功,则通过读写缓冲寄存器MMC_RXFIFO和MMC_TXFIFO进行数据的读写(这里使用DMA进行数据传输,提高了数据的传输速度);如果返回的状态信息表明命令执行不成功,则根据状念信息进行相应的出错处理。
(3)DMA数据传输
驱动程序中对MMC卡的数据读写是通过DMA通道进行传输的。为了保汪操作的连续性,驱动程序对MMC卡的输入和输出缓冲各设置1个DMA通道,在进行实际数据传输时,读写进程也进入睡眠状态,等待DMA数据传输完毕后,被DMA中断唤醒。实现一次读操作的伪代码如下:
Pxa_read_mmc(){
关闭时钟,屏蔽中断;
设置读写寄存器的内容; /*读写块数,起始块数,读写速度等*/
打开时钟,发布读写命令;
Interruptible_sleep_on(); /*进入可打断睡眠状态,等待中断程序的唤醒*/
被中断程序唤醒,打开DMA通道,进行数据传输,再次进入可打断睡眠状态;
被DMA传输完毕中断唤醒,发布结束传输命令,结束数据传输;
2.2 集群(clustering)读写和并发控制
2.2.1 传统的块设备驱动