近来调了个SD卡驱动方面的问题,顺便看了一些文章,觉得不错,就拿来了,方便自己以后再看!
问题:在插拔卡时需要播放声音,但是卡在卡槽里时,休眠唤醒的时候也会发声音,开机的时候播放声音会卡
在handadddevice里处理
if (fSameCard)
{
delete psdDevice;
bSDPowerupFlag = TRUE;
psdDevice = psdOldDevice;
}
else
{
psdOldDevice->NotifyClient(SDCardDetectDiffType);
dwRefCnt = psdOldDevice->DeRef();
RemoveAllDevice();
bSDPowerupFlag = TRUE;
}
}
else
{
fNewCard = TRUE;
bSDPowerupFlag=TRUE;
if(GetTickCount()>4000)
PlaySound(ID_WAVE_SDMMC_ATTACH, NULL, SND_FILENAME | SND_ASYNC);
}
VOID CSDSlot::SlotStatusChangeProcessing(SD_SLOT_EVENT Event)
///
{
RETAILMSG(DBG_ZONE_INFO,(TEXT("+++SlotStatusChangeProcessing:Event=%d"),Event));
switch (Event)
{
case DeviceEjected:
HandleRemoveDevice();
if (bSDPowerupFlag)
PlaySound(ID_WAVE_SDMMC_ATTACH, NULL, SND_FILENAME | SND_ASYNC);
break;
}
另外就是需要在休眠的时候设置bSDPowerupFlag为false就可以了
文章之一:
WinCE下SD卡驱动开发--与文件系统有些关系
WinCE 5.0下面SD卡驱动的开发。这是我做的第一个项目,当时做这个项目花费了相当的时间和精力,搞的我精疲力尽。几乎可以说当时对WinCE一点都不懂。也 不知道从何处下手,就东看西看。东改西改,改的是一塌糊涂。幸好老板和老大都比较宽容,给了我充裕的时间和支持,将自己有关SD卡在WinCE 5。0下面的驱动理解的点滴给记录下来,希望能够对别人有所帮助。
目前WinCE下面的驱动主要有两种架构,一种就是WinCE自带的三层架构(Host,BUS,Client)。另外就是直接将驱动写成Block驱动 的形式,分真正的驱动和一个专门用来Loader的程序。本人用的微软自带的三层架构,下面将较为详细的介绍一下这种架构,以及如何在这种架构下来实现 SD卡驱动。(建议大家做SD卡驱动前先将SD card的Spec看一下(下载SDSPEC ),知道其的一些特性,主要包括初始化流程,那些命令是干什么的。还有就是有那些内部寄存器。这些寄存器又是又通过那些命令获得的,了解了这些才能再以后能有个好的调试。) 有关SD卡的一些规格(网上一大堆到处都有)本文将不做介绍,主要介绍其在WinCE下面的实现。WinCE下面SD卡的架构如下图所示:
如图所示:最下面的是你的H/W部分,其中SD Host Controller是你的SD硬件控制器部分,你写驱动需要这部分的SPEC。接着上面的SD Host Controller Driver就是你需要实现的部分了,直接和你的控制器打交道。 而BUS层则是位于Host和Client之间的一层,主要用来进行两层之间的通信,并根据不同的设备来加载不同的Client驱动,如果是SD Memory卡就加载SD Memory。如果是具有WIFI功能的SDIO卡就会加载这个SDIO WIF驱动。
驱动BUS Driver和Client Driver均由微软提供,但是不是微软自己写的。貌似是一个叫什么BSQUARE公司开发的。其中BUS层的代码位于C:/WINCE500 /PUBLIC/COMMON/OAK/DRIVERS/SDCARD/SDBUSDRIVER下面。(C:/WINCE500是你安装WinCE的目 录)。而Client端的代码位于C:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/SDCARD /SDCLIENTDRIVERS下面,其下面微软带了一个两个Client 驱动(BLUETOOTH 和 SDMEMORY)。下面介绍各层的主要功能,BUS层主要是:枚举板上的卡,并决定他们的类型(MMC, SD Memory or SDIO),配置合适的电流给卡,根据注册表的值加载clients,把总线要求入队列,把来自host controller的异步通知入队列,总线要求完成,SDIO 中断,设备插入/拔出,出错时重试等功能。
其主要的处理流程主要在 sdhceventhandlers.cpp中的handleAddDevice() 中,在这里面包括了卡的识别,卡的上电,卡的种类的识别,加载 Client端的驱动等工作,在调试的时候,可以在这里面添加一些Debug信息,看初始化出要出错出在哪里,并根据相应的回应来驱动为什么出错。其中
while (NULL != pCurrentDevice)
{
// try to load devices
CSDBusDriver::SDLoadDevice (pCurrentDevice);
pCurrentDevice = pCurrentDevice->pNext;
}
这段主要就是用来根据上面得到的信息来Load Client端驱动的。其中如果仅仅是存储卡的话,就会load SDMemory.dll。而如果是SDIO WIFI卡的话,就会load相应的WIFI Client端驱动。其中初始化的流程主要就在这个函数里面实现:
主要的命令有:CMD5----CMD55/CMD41---CMD2--CMD3等等,具体的CMD参考SD的SPEC。这些命令均有BUS层下给HOST Controller层的。
其中Host Controller层主要实现将命令下给H/W,并且得到相应的Response,把这些response按照相应的格式放到某个Buffer中,传给 bus层,由bus层来处理。bus层就是根据这些response来确定卡的类型,卡的大小,卡的传输速度,卡的一些属性的。
卡的读写: 文件系统的读写会先到SDMemory层,SDMemory先将CardIO转化为DISKIO然后通过BUS层传递给Host Controller,其中读写主要由CMD17和CMD18 ,以及CMD24和CMD25。在完成每一次BUS层的处理之后,都要向BUS层发送一个 BUSRequest Handle Complete事件,通知BUS层读写操作已经完成。读写操作需要用到DMA操作,这里需要COPY动作,因为DMA需要物理地址,而BUS层传下来的BUF 是虚拟地址。
文章之二:【WinCE】SD card技术了解并WINCE下SDHC驱动开发
了解 SD card
SD 是 Secure Digital Card 卡的简称,直译成汉语就是 “ 安全数字卡 ” ,是由日本松下公司、东芝公司和美国 SANDISK 公司共同开发研制的全新的存储卡产品。 SD 存储卡是一个完全开放的标准(系统),多用于 MP3 、数码摄像机、数码相机、电子图书、 AV 器材等等,尤其是被广泛应用在超薄数码相机上。 SD 卡在外形上同 Multimedia Card 卡保持一致,大小尺寸比 MMC 卡略厚,容量也大很多。并且兼容 MMC 卡接口规范。不由让人们怀疑 SD 卡是 MMC 升级版。另外, SD 卡为 9 引脚,目的是通过把传输方式由串行变成并行,以提高传输速度。它的读写速度比 MMC 卡要快一些,同时,安全性也更高。 SD 卡最大的特点就是通过加密功能,可以保证数据资料的安全保密。它还具备版权保护技术,所采用的版权保护技术是 DVD 中使用的 CPRM 技术(可刻录介质内容保护)。
规格
主要特点:
1. 精巧而且超薄
SD 记忆卡的尺寸只有 24 毫米 x 32 毫米 x 2.1 毫米。作为“桥梁媒体”的重要特征,它精致小巧,方便您在不同设备上使用。兼容 SD 记忆卡的设备可以采用解码器软件来播放音乐、影像短片以及更多其他类型的内容,无需像 CD 播放机或 DVD 播放机那样采用驱动装置。从而使设备的外形更加精巧,同时也赋予了产品设计者发挥自由创意的全新空间。由于消除了播放音乐时的跳音现象,提高了播放的稳定性。
2. 大容量栽体
目前, SD 记忆卡已经具备各种容量可供选择,同时, 2GB 、 4GB 和 8GB 的 SDHC 也出现了。
3. 高速数据传输
为了提供快速响应和容易处理数字内容, SD 记忆卡可以用每秒 10MB 的速率写入和读取数据。当其能够用于远程通信终端,直接下载内容时,记忆卡的高速传送能力将可使存取时间和通信成本降至最低,同时可减轻网络压力。
4. 拥有版权保护功能
先进的数码技术使高保真音乐和其他高质量内容的录制成为现实。日新月异的数码技术,借助因特网,实现了全球范围的信息快速共享。这一进步也带来了对原版内容的大量复制,因此,作为 21 世纪的一种切实可行的记忆载体就必须具备高水平的版权保护技术,这样才能保护大量高质的数码数据。 SD 记忆卡可以自由复制各种数码数据,并采用独特的内置 CPRM 技术保存和转移版权所有的内容,这也是建立一个全新的音乐及其他商业媒体的发布体系的关键所在。
硬件结构
(参看附录中 SD 卡和其他卡的一个对比表)
SDIO 卡
SDIO (输入 / 输出)卡是一种扩展带 SD 卡插孔设备之功能的接口。正在开发各种 SDIO 卡,如相机、 Bluetooth 、 GPS 和 802.11b 等 。
如果编写以上设备的驱动,当然前提是有一个合格的 SD Host Controller 。如同编写 USB STORAGE/HID 设备的驱动一样,需要 USB HCD 支持。 MX31 的 ADS 支持基于 SDIO 的 LP1070 SDIO WLAN Card (在 Wince 5.0 的 SD 卡驱动模型里,这种驱动称为 client driver )。
SD_SDIO_SPEC.PDF
SDIO features
l Targeted for portable and stationary applications
l Minimal or no modification to SD Physical bus is required
l Minimal change to memory driver software
l Extended physical form factor available for specialized applications
l Plug and play (PnP) support
l Multi-function support including multiple I/O and combined I/O and memory
l Up to 7 I/O functions plus one memory supported on one card.
l Allows card to interrupt host
l Initialization Voltage: 2.0 to 3.6V
l Operational Voltage range: 3.1 to 3.5V
WinCE 5.0 下 SD Stack
一共可以分为 3 个部分: a bus driver, host controller driver 和 client drivers ,现分别介绍:
1 Bus Driver
顾名思义,总线,连接 client driver 和 host controller driver 之间的一个管理层。这部分代码微软已经写好了,也就是说定义好了 client 和 host 之间的通讯接口。(是不是可以这么说 : 编写 SD WIFI 的程序员可以不用知道是什么 SDHC ,从而达到驱动的跨硬件性)
参考代码:
D:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/SDCARD/SDBUSDRIVER/
2 Host Controller
控制硬件并且通过上述的 BUS driver 来和 client 进行通讯。
参考代码:
D:/WINCE500/PLATFORM/Mx31/Src/Drivers/Sdhc
D:/WINCE500/PUBLIC/COMMON/OAK/CSP/ARM/FREESCALE/Mxarm11/Drivers/Sdhc
3 Client Driver
通过 BUS driver 和 SD 设备进行通讯。
Windows CE 5.0 中的 SDIO 支持如下:
l 动态插入和拔出
l DMA 方式 ( 平台相关 )
l SDIO 中断
l 动态的时钟控制
l 错误恢复
l 唤醒
l v1.0 多功能和组合设备
l CE Power Manager 来处理电源管理
l MMC
下图可以清晰的表达基于 WINCE5.0 的一个 SD STACK 模型: