SD驱动问题及相关文章

本文档介绍了在WinCE系统中遇到的SD卡驱动问题,涉及插拔卡时的声音播放异常及解决方法。同时,概述了WinCE下SD卡驱动的三层架构,包括Host Controller Driver、Bus Driver和Client Driver的功能。文中引用了三个关于SD卡驱动开发的文章,涵盖了驱动开发的基础知识、SD卡容量获取和SDHC驱动的细节。
摘要由CSDN通过智能技术生成

     近来调了个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 模型:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值