嵌入式系统的SD控制器设计实现
它只实现简单的功能:响应设备中断并返回一个中断标识码。IST是用户态线程,负责处理具体的中断事务。
当有硬件设备产生中断时,系统进入核心ISR执行,响应设备中断并返回一个中断标识码,核心根据返回的中断标识码设置相应的事件,该事件将引起IST的执行,处理具体的中断事务。处理过程如图2所示。
图2 WindowsCE中断处理过程
本实现中用到了下列中断:SD卡检测中断,SDIO中断和DMA0中断(DMA0专用于SDHost的DMA数据传输)。SD卡检测中断IST负责检测SD卡的插入和拔出,通知上层应用SD插槽的状态;SDIO中断IST只是简单的通知总线驱动有SDIO中断产生,具体处理交给SDIO卡的驱动程序;DMA0中断IST负责处理SD的DMA数据传送。
在WindowsCE中,由于驱动程序DLL运行在用户态,因此驱动程序要访问硬件寄存器,必须在驱动程序的进程空间分配一段虚拟空间,然后将这段虚拟空间映射到硬件寄存器所映射到内核的虚拟地址才能够完成相应的访问。SDHost驱动程序在初始化的时候,必须进行资源分配和地址映射,配置好各个GPIO引脚的功能;然后需要创建事件和相应的中断标识码的关联,创建中断服务线程IST,准备进行中断响应服务。3 卡检测与防抖动
系统初始化时,SD_nCD检测引脚被设置为上升沿和下降沿触发,因此引脚电平发生变化时,都会有中断产生。当硬件产生中断时,系统进入核心ISR,对SD_nCD进行检测,返回相应的中断标识码,对于是SD插入还是拔出,则由驱动程序的IST来处理。
由于SD卡插槽采用的是机械式开关,在插拔卡的时候,机械开关断开、闭合时会有抖动,导致SD卡检测引脚的电平不稳定,从而有可能引起对卡的状态的误判。这样会导致加载上层驱动,初始化失败造成系统宕机。为了使每次插拔只响应一次,必须要采用相应的方法来防止抖动,避开按键按下的抖动时间。
在驱动程序IST里采用延时采样的方法来避免抖动,同时也尝试了多次采样的检测方法来避开用户按键的抖动时间。
延时采样是IST在收到SD卡检测事件以后,并不是立刻进行引脚信号判断,而是延时一段时间采样,延迟时间要根据系统电路特性而定,然后检测引脚信号,判断插槽的状态是卡插入还是拔出。多次采样方法是IST在收到SD卡检测事件以后,要对引脚进行多次等间隔采样,根据采样出的多数电平信号的值来决定插槽卡的状态。多次采样的方法可以有更短的响应时间,当采样出的电平信号多数值不能决定卡的状态时,需要进行重新采样判断。
对于延时采样的防抖动方法,必须考虑到实现的效率。
ISR运行于系统核心态,它的延时会影响整个系统,导致用户的输入响应时间过长,造成整体性能的下降。而WindowsCE的驱动程序是用户态的DLL,作为用户进程来调度,因此在SDHost的驱动程序里实现防抖动,可保证系统整体性能不下降。
对于上述两种防抖动方法,我们进行了连续插拔的测试,结果如图3所示。测试结果表明,这两种方法都取得了较好的效果,基本上解决了SD卡检测的抖动问题。
图3 SD卡插拔宕机次数测试
4 结语
本文介绍的SDHost控制器已经应用在工程实践中,结果表明设计是灵活有效的,防抖动设计对于类似的设计也具有一定的借鉴意义。
- 基于FPGA的DSP设计方法(08-26)
- 电力电子装置控制系统的DSP设计方案(04-08)
- 基于DSP Builder的VGA接口设计(04-10)
- 基于DSP和USB的高速数据采集与处理系统设计(05-01)
- 数字信号处理(DSP)应用系统中的低功耗设计(05-02)
- 基于DSP的嵌入式显微图像处理系统的设计(06-28)