SD驱动问题及相关文章
来源:互联网 发布:raft算法实现 编辑:程序博客网 时间:2024/05/17 01:51
近来调了个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模型:
安全性
SDA 中的SD Memory specification 有种机制可以在特定机器上锁定卡里面的内容。WINCE 5里并没有显示的支持该机制。但是可以自己来做,比如一个文件系统的FILTER等。
Bus Driver
主要功能如下:
l 枚举板上的卡,并决定他们的类型(MMC, SD Memory or SDIO)
l 配置合适的电流给卡。
l 根据注册表的值加载clients
l 把总线要求入队列
l 把来自host controller的异步通知入队列
l 总线要求完成,SDIO 中断,设备插入/拔出
l 出错时重试
参考代码:
D:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/SDCARD/SDBUSDRIVER
貌似此部分代码非微软原创:
// Copyright (c) 2002 BSQUARE Corporation. All rights reserved.
// DO NOT REMOVE --- BEGIN EXTERNALLY DEVELOPED SOURCE CODE ID 40973--- DO NOT REMOVE
Host Controller Driver
主要功能:
l HCD通知总线驱动卡的插入和拔出
l 给卡上电,SD定义了可接受的初时电压范围。
l 在总线驱动何客户端设置完时钟速度后,打开客户端卡的时钟(80个周期)
l 初始,把总线宽度设置成1。如果有需要的话(4-bit mode),把总线宽度设成4bit
l 传输SD 命令和数据到/来自卡上。
l 负责给槽上电,关电。
l IST 在这里存在
l (可选的)唤醒支持(插入,拔出,SDIO中断)
初始化
1. 调用HCD’s XXX_Init
2. 调用 SDHCDAllocateContext() 来分配一段HC的上下文
a) Context 是总线驱动和HCD共享的
3. HCD 使用SDHCDSetXxx宏来填充这个上下文结构
a) 这个步骤是把HC向总线驱动描述一下
b) 包括函数指针,支持的电流,最大时钟,槽数目,SDIO的支持等等。
4. 调用 SDHCDRegisterHostController() 来把自己向总线驱动注册一下
5. 当总线驱动准备处理SD事件时,它会调用 HCD的init 函数(pContext->pInitHandler) (见SDHCDRegisterHostController__X函数)
6. 在初始化里,HCD还应该完成硬件和资源的初始化(IST等)
下面代码抄自MX31 BSP中SDHC驱动的SDH_Init函数中:
DWORD SDH_Init(DWORD dwContext)
{
// allocate the context
status = SDHCDAllocateContext(SDH_SLOTS, &pHostContext);
。。。。。。
//Set a unique name for each host controller
if (pController->ControllerIndex == 1)
{
SDHCDSetHCName(pHostContext, TEXT("MXARM11_1"));
}
else
{
SDHCDSetHCName(pHostContext, TEXT("MXARM11_2"));
}
// set init handler
SDHCDSetControllerInitHandler(pHostContext,SDInitialize);
// set deinit handler
SDHCDSetControllerDeinitHandler(pHostContext, SDDeinitialize);
// set the bus request handler
SDHCDSetBusRequestHandler(pHostContext,SDHBusRequestHandler);
// set the cancel I/O handler
SDHCDSetCancelIOHandler(pHostContext, SDHCancelIoHandler);
// set the slot option handler
SDHCDSetSlotOptionHandler(pHostContext, SDHSlotOptionHandler);
// now register the host controller
status = SDHCDRegisterHostController(pHostContext);
Slot Option Handler
l 总线驱动调用HCD的 SlotOptionHandler :
n SDHCDSetSlotPower –设置电压
n SDHCDSetSlotInterface – 设置时钟和总线宽度
n SDHCDEnableSDIOInterrupts
n SDHCDAckSDIOInterrupt
n SDHCDDisableSDIOInterrupts
l SDHCDGetWriteProtectStatus – HCD 必须查看SD存储卡是否开启写保护
l SDHCDQueryBlockCapability – 返回HCD的最大和最小块长度
总线要求
l 总线驱动把总线要求放入队列然后把它们传入HCD的 BusRequestHandler 函数
l HCD根据要求来做相应的动作—command/read/write, multi-block, 等.
l HCD 使用某种方式(DMA, PIO, busy-waiting等)来发送命令和数据
l HCD 调用SDHCDIndicateBusRequestComplete() 来通知总线驱动完成
l 总线驱动把完成事件入队列并提交下一个要求给HCD
l 总线驱动的调度线程将会通知产生要求的起始源事件完成了。
标准的WINCE SDHC驱动支持
l Standard Host Controller v1.0
n Tokyo Electron Devices – Ellen
n Toshiba - Pegasus
n TI PCI 7x21
n Ricoh R5C811 and R5C841
l Non-standard hosts
n Intel PXA-27x SOC (Mainstone II)
n Samsung SMDK-2410
n Freescale MX series
关于Standard Host Controller
SDA Host Working Group (MSFT executive member)
Defined Standard Host Register Specification to standardize the hardware interface from bus to controller
Currently ratified to v1.0 by SDA executive committee
MSFT strongly advocating this standard to all IHVs, ODMs, OEMs and Silicons
中断
l HCD包括IST
l IST 决定哪个槽中断
l IST evaluates interrupt
比如现在拔出SD卡
IST 会调用Bus Driver’s SDHCIndicateSlotStateChange() with DeviceEjected parameter
l Bus Driver calls client’s SlotEventCallBack routine with SDCardEjected. (Provides async notification about changes in the slot state.)
l Client performs its deinitialization
如何让镜像支持SD STACK
SYSGEN_SDBUS – SD bus driver (sdbus.dll)
SYSGEN_SDHC_STANDARD – Standard host controller (sdhc.dll)
SYSGEN_SD_MEMORY – SD Memory client (sdmemory.dll)
SYSGEN_BTH or SYSGEN_BTH_SDIO_ONLY – SDIO Bluetooth client (bthsdio.dll)
BSP variables will be added for CSP-specific host controllers
Client Driver
目前,WINCE5.0所支持的client driver如下: l SD Memory Class l SDIO Bluetooth Class - Type A l SDIO WiFi (vendor specific) 如果需要自己写client驱动的话可以参考D:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/SDCARD/SDCLIENTDRIVERS目录下的微软自带的SD client驱动来写。 【example1: SD MEMORY DRIVER UNDER WINCE 5.0】 Wince自带的SD存储卡client驱动,代码路径为: D:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/SDCARD/SDCLIENTDRIVERS/SDMEMORY 一个SD存储卡在WINCE里的驱动架构如下图所示: 1注册表和启动 在注册表里告诉Storage Manager [HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/SDMemory] "Name"="SD Memory Card" "Folder"="Storage Card" ;"PartitionDriver"="" ; removable storage cannot have partitions [HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/MMC] "Name"="MMC Card" "Folder"="Storage Card" ;"PartitionDriver"="" ; removable storage cannot have partitions ; SD Memory Storage class driver [HKEY_LOCAL_MACHINE/Drivers/SDCARD/ClientDrivers/Class/SDMemory_Class] "Dll"="SDMemory.dll" "Prefix"="DSK" "BlockTransferSize"=dword:40 ; send no more than 64 blocks of data per bus transfer ;"SingleBlockWrites"=dword:1 ; alternatively force the driver to use single block access ;"IdleTimeout"=dword:7D0 ; 2000 milliseconds ;"IdlePowerState"=dword:2 ; 0 == D0, 1 == D1, etc. ;"DisablePowerManagement"="" ; if value present, then disable (remove value to enable) "Profile"="SDMemory" "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}", "{A32942B7-920C-486b-B0E6-92A702A99B35}" ; MMC Storage Class Driver [HKEY_LOCAL_MACHINE/Drivers/SDCARD/ClientDrivers/Class/MMC_Class] "Dll"="SDMemory.dll" "Prefix"="DSK" "BlockTransferSize"=dword:40 ; send no more than 64 blocks of data per bus transfer ;"SingleBlockWrites"=dword:1 ; alternatively force the driver to use single block access ;"IdleTimeout"=dword:7D0 ; milliseconds ;"IdlePowerState"=dword:2 ; 0 == D0, 1 == D1, etc. ;"DisablePowerManagement"="" ; if value present, then disable (remove value to enable) "Profile"="MMC" "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}", "{A32942B7-920C-486b-B0E6-92A702A99B35}" 2 SD命令和总线要求 将所有磁盘的操作转换成SD的命令和总线要求 NAME SDMEMORY.DLL EXPORTS DSK_Close=SMC_Close DSK_Deinit=SMC_Deinit DSK_Init=SMC_Init DSK_IOControl=SMC_IOControl DSK_Open=SMC_Open DSK_PowerDown=SMC_PowerDown DSK_PowerUp=SMC_PowerUp DSK_Read=SMC_Read DSK_Seek=SMC_Seek DSK_Write=SMC_Write 下面为具体的DISK I/O操作函数和CARD I/O操作函数,详细实现见sdmemdiskio.cpp和sdmemcardio.cpp: // // SDDiskIO // // SDMemCardConfig - Initialise the memcard structure and card itself DWORD SDMemCardConfig( PSD_MEMCARD_INFO pMemCard ); // SDMemRead - Read data from card into pSG scatter gather buffers DWORD SDMemRead( PSD_MEMCARD_INFO pMemCard, PSG_REQ pSG ); // SDMemWrite - Write data to card from pSG scatter gather buffers DWORD SDMemWrite( PSD_MEMCARD_INFO pMemCard, PSG_REQ pSG ); // SDMemErase - Erase a contiguous set of blocks DWORD SDMemErase( PSD_MEMCARD_INFO pMemCard, PDELETE_SECTOR_INFO pDSI ); // SDMemEraseAll - Erase all blocks DWORD SDMemEraseAll( PSD_MEMCARD_INFO pMemCard ); // // SDCardIO // // SDMemDoBusRequest - Perform a bus request, returns Windows Status DWORD SDMemDoBusRequest( PSD_MEMCARD_INFO pMemcard, UCHAR Command, DWORD Argument, SD_TRANSFER_CLASS TransferClass, SD_RESPONSE_TYPE ResponseType, ULONG NumBlocks, ULONG BlockSize, PUCHAR pBuffer, DWORD Flags); // SDMemSetBlockLen - Sets read/write block length for SD memory card DWORD SDMemSetBlockLen( PSD_MEMCARD_INFO pMemcard, DWORD BlockLen ); // SDMemReadMultiple - Read multiple 512 byte blocks of data from card DWORD SDMemReadMultiple( PSD_MEMCARD_INFO pHandle, ULONG StartBlock, ULONG NumBlocks, PUCHAR pBuffer ); // SDMemWriteMultiple - Write multiple 512 byte blocks of data to card DWORD SDMemWriteMultiple( PSD_MEMCARD_INFO pHandle, LONG StartBlock, LONG NumBlocks, PUCHAR pBuffer ); // SDMemWriteUsingSingleBlocks - Write using single block writes DWORD SDMemWriteUsingSingleBlocks( PSD_MEMCARD_INFO pHandle, LONG StartBlock, LONG NumBlocks, PUCHAR pBuffer ); // SDMemDoErase - Erase a contiguous set of blocks DWORD SDMemDoErase( PSD_MEMCARD_INFO pHandle, LONG StartBlock, LONG NumBlocks ); DWORD SDAPIStatusToErrorCode( SD_API_STATUS Status ); DWORD SDGetCardStatus(PSD_MEMCARD_INFO pMemCard , SD_CARD_STATUS *pCardStatus); VOID HandleIoctlPowerSet(PSD_MEMCARD_INFO pMemCard, PCEDEVICE_POWER_STATE pDevicePowerState); VOID InitializePowerManagement(PSD_MEMCARD_INFO pMemCard); VOID DeinitializePowerManagement(PSD_MEMCARD_INFO pMemCard); SD_API_STATUS IssueCardSelectDeSelect(PSD_MEMCARD_INFO pMemCard, BOOL Select); VOID RequestEnd(PSD_MEMCARD_INFO pMemCard); SD_API_STATUS RequestPrologue(PSD_MEMCARD_INFO pMemCard, DWORD DeviceIoControl); The Secure Digital Host Controller (SDHC) 模块支持MMC,SD和Secure Digital I/O and Combo Cards (SDIO)三种。MX31一共有2个SDHC硬件模块。一个host controller 只支持连接上的一个卡。 SDHC.DLL由以下源代码组成 『―――― 微软代码 c:/macallan/private/winceos/coreos/ceosutil/utiltree.cxx c:/macallan/public/common/sdk/inc/svsutil.hxx c:/macallan/private/winceos/coreos/ceosutil/utilmemf.cxx c:/macallan/public/common/sdk/inc/svsutil.hxx c:/macallan/private/winceos/coreos/ceosutil/utilmem.cxx c:/macallan/private/winceos/coreos/ceosutil/svsutil.cxx c:/macallan/public/common/oak/drivers/sdcard/sdcardlib/sdcardapistubs.cpp c:/macallan/public/common/oak/drivers/sdcard/sdcardlib/sddebug.cpp c:/macallan/public/common/oak/drivers/sdcard/sdcardlib/sdmemapi.cpp c:/macallan/public/common/oak/inc/block_allocator.hxx c:/macallan/public/common/oak/drivers/sdcard/sdhclib/sdhclib.cpp ―――――』 d:/wince500/platform/mx31/src/drivers/sdhc/bspsdhc.c d:/wince500/public/common/oak/csp/arm/freescale/mxarm11/drivers/sdhc/main.cpp d:/wince500/public/common/oak/csp/arm/freescale/mxarm11/drivers/sdhc/sdcontrol.cpp d:/wince500/public/common/sdk/inc/kfuncs.h SDHC的注册表设置 #if (defined BSP_SDHC1 || defined BSP_SDHC2) [HKEY_LOCAL_MACHINE/Drivers/SDCARD/ClientDrivers/Class/SDMemory_Class] "BlockTransferSize"=dword:100 ; Overwrite from default 64 blocks. ; "SingleBlockWrites"=dword:1 ; alternatively force the driver to use single block access [HKEY_LOCAL_MACHINE/Drivers/SDCARD/ClientDrivers/Class/MMC_Class] "BlockTransferSize"=dword:100 ; Overwrite from default 64 blocks. ; "SingleBlockWrites"=dword:1 ; alternatively force the driver to use single block access [HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/MMC] "Name"="MMC Card" "Folder"="MMC" [HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/SDMemory] "Name"="SD Memory Card" "Folder"="SD Memory" #endif IF BSP_SDHC1 [HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SDHC_ARM11_1] "Order"=dword:21 "Dll"="sdhc.dll" "Prefix"="SDH" "ControllerISTPriority"=dword:64 "Index"=dword:1 ENDIF ;BSP_SDHC1 IF BSP_SDHC2 [HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SDHC_ARM11_2] "Order"=dword:21 "Dll"="sdhc.dll" "Prefix"="SDH" "ControllerISTPriority"=dword:64 "Index"=dword:2 ENDIF ;BSP_SDHC SDHC和DMA SDHC驱动支持DMA 和非DMA 2种数据传输模式,默认是DMA。For every request submitted to it, the driver attempts to build a DMA Scatter Gather Buffer Descriptor list for the buffer passed to it by the upper layer. For cases where this list cannot be built, the driver falls back to the non-DMA mode of transfer. The default configuration is maintained in the file bsp_cfg.h using the parameters BSP_SDMA_SUPPORT_SDHC1 and BSP_SDMA_SUPPORT_SDHC2. A value of TRUE means DMA is the default mode, and for cases where DMA cannot be used, the driver falls back to a non-DMA mode. A value of FALSE means non-DMA mode is the default and DMA mode will not be attempted. For the driver to attempt to build the Scatter Gather DMA Buffer Descriptors, the upper layer should ensure that the buffer meets the following criteria. • Start of the buffer should be a word aligned address. • Number of bytes to transfer should be word aligned. Due to cache coherency issues arising due to processor and SDMA access of the memory, the above criteria is further stringent for the read or receive operation (it is not applicable for write or transmit): • Start of the buffer should be a cache line size (32 bytes) aligned address. • Number of bytes to transfer should be cache line size (32 bytes) aligned. 电源管理 The primary methods for limiting power in SDHC module is to gate off all clocks to the controllers and to cut off power to the card slot when no cards are inserted. When a card is inserted to any of the slots, that slot alone is powered and the clocks to that controller alone are gated on. While using memory cards, the clock to the host controller and the clock to memory cards are gated off when ever the controller is idle. For SDIO cards, both the clocks stay on all the time. SDHC driver supports the full power on and full power off states. In full power off state, the clocks to the controllers and the power to the inserted cards are turned off. When powered on, all cards inserted before and after the power down will be detected and mounted. PowerUp This function is implemented to support resuming a memory card operation that was previously terminated by calling PowerDown() API. Power to the card is restored, clocks to the pertaining controller is restarted. SDHC driver is notified of a device status change. This results in signaling the SD bus driver of a card removal followed by a card insertion. The card is re-initialized and is mounted so that the all operations scheduled during a power down resumes. SDIO cards will be initialized on resume. The details of this architecture and its operation can be found in the Platform Builder Help under the heading “Power On and Off Notifications for Secure Digital Card Drivers”, or in the online Microsoft documentation at the following URL: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddk5/html/wce50conpoweronoffnot ificationsforsecuredigitalcarddrivers.asp Note that this function is intended to be called only by the Power Manager. PowerDown This function has been implemented to support suspending all currently active SD operations just before the entire system enters the low power state. Note that this function is intended to be called only by the Power Manager. This function gates off all clocks to the controllers and powers down all the card slots. SDIO Wi-Fi 驱动是通过Freescale LP1070 SDIO Wi-Fi 卡来连接到一个IEEE 802.11b/g 无限局域网(WLAN) 。驱动支持以54 Mbps的速率和WLAN通讯。 注意: The LP1070 SDIO Wi-Fi driver is an NDIS 5.0 compliant miniport driver. LP1070 SDIO Wi-Fi card needs a 3.1~3.3V power supply from on-board Secure Digital Slot. [HKEY_LOCAL_MACHINE/Drivers/SDCARD/ClientDrivers/Custom/MANF-0325-CARDID-0217-FUNC-1] "Instance0"="FSL1070NdisSD:FSL1070NdisSD1" "Prefix"="NDL" "Dll"="FSL1070NdisSD.dll" [HKEY_LOCAL_MACHINE/Comm/FSL1070NdisSD] "ImagePath"="FSL1070NdisSD.dll" "Group"="NDIS" "DisplayName"="WaveBlaster 802.11 SDIO Adapter" [HKEY_LOCAL_MACHINE/Comm/FSL1070NdisSD/Linkage] "Route"=hex(7):/ 46,53,4c,31,30,37,30,4e,64,69,73,53,44,31,00,00,00,00 [HKEY_LOCAL_MACHINE/Comm/FSL1070NdisSD1] "ImagePath"="FSL1070NdisSD.dll" "Group"="NDIS" "DisplayName"="WaveBlaster 802.11 SDIO Adapter" [HKEY_LOCAL_MACHINE/Comm/FSL1070NdisSD1/Parms] "SDIOMaxClockFreq"=dword:017d7840 "SDIOMaxByteNumber"=dword:000003e8 "SDIOMaxBlockNumber"=dword:000003e8 "SDIOBlockSize"=dword:00000040 "SDIOSupportBlockMode"=dword:00000001 "SDIOSupport4BitMode"=dword:00000001 "BluetoothCoexCapability"=dword:00000000 "CcxCapability"=dword:00000000 "RadioMeasurementCapability"=dword:00000000 "MultiDomainCapability"=dword:00000000 "RoamRssiHysteresis80211bg"=dword:0000000a "RoamRssiThreshold80211bg"=dword:ffffff9d "ListenInterval"=dword:00000000 "BufferConfig"=dword:00000000 "DbgMaxFileSize"=dword:00019000 "WMMEnabled"=dword:00000000 "ResetEnable"=dword:00000001 "UWASensitivityLockout"=dword:00000000 "ShortPreamble"=dword:00000001 "RTSCTSThreshold"=dword:0000092b/ "FragmentThreshold"=dword:0000092a "DefaultKey3"="0x0000000000" "DefaultKey2"="0x0000000000" "DefaultKey1"="0x0000000000" "DefaultKey0"="0x0000000000" "LongKeys"=dword:00000000 "Auth"=dword:00000000 "WEP"=dword:00000000 "PowerSaving"=dword:00000000 "RateSelect"=dword:00000000 "MACID"="0x000000000000" "IbssChannel"=dword:00000000 "Ibss54g"=dword:00000000 "RestrictedChannel"=dword:00000000 "BSSID"="0x000000000000" "Manual"=dword:00000000 "ESSID"="" "Domain"=dword:00000010 "ProtocolType"=dword:00000003 "NetworkType"=dword:00000000 "STAuwa"="uwa_airoha.bin" "STAupper"="mac_airoha_STA.bin" "NetworkAddress"="" "BusType"=dword:00000000 "BusNumber"=dword:00000000 [HKEY_LOCAL_MACHINE/Comm/FSL1070NdisSD1/Parms/Tcpip] "Subnetmask"=hex(7):/ 32,35,35,2e,32,35,35,2e,32,35,35,2e,30,00,00,00,00 "IpAddress"=hex(7):/ 30,2e,30,2e,30,2e,30,00,00,00,00 "UseZeroBroadcast"=dword:00000000 "EnableDHCP"=dword:00000001 目前在EVT板上,对于SD的代码更改如下: 1 ***************************************** 2 *********************************************** SD卡与其他卡的对比 SDHC Compatibility * SDHC Host Products can use both SD and SDHC Memory Cards. Capacity (4GB SDHC Memory Card) Still image JPEG Approx. 1,240 images MPEG-2 Video Approx. 1 hr 40 min MPEG-4 Video Approx. 19 hrs Music (SD-Audio/AAC) Approx. 68 hrs 常用网站: http://www.sdcard.com/ http://www.sdcard.org/
[图无法插入]SD on MX31 ADS
Secure Digital Host Controller
LP1070 Secure Digital I/O Wi-Fi Driver
SD on EVT
附录
* SD Host Products can use only SD Memory Card 2GB or less.
1,880 x 2,160 pixels, 6 Megapixels
704 x 480 pixels, 5 Mbps, 30 fps
QVGA (320 x 240 pixels), 384 kbps, 15 fps
128 kbps
(About 1,000 songs)
文章之三:获取SD卡容量
常用代码段: 从block设备中读取扇区大小,扇区数,和总容量等。
- void GetStorageInfo()
- {
- DISK_INFO m_devinfo;
- BOOL buf=1;
- unsigned long BytesReturned;
- //这里DSK1:的名字要根据具体你的块设备index来的,sd卡的index一般不定死,但你可以用注册表工具从Active下面找到被加载的所有block设备,你可以知道哪个DSK是哪个存储设备。5楼更新了具体的方法。
- HANDLE h_nfd = CreateFile( L"DSK1:",
- GENERIC_READ,
- 0,
- NULL,
- OPEN_EXISTING,
- 0,
- NULL);
- if(h_nfd==NULL)
- ::MessageBox ( NULL, L"ERRO in createfile", L"ERROR", 0);
- if ( FALSE == DeviceIoControl(
- h_nfd,
- IOCTL_DISK_GETINFO,
- NULL,
- 0,
- &m_devinfo
- sizeof(m_devinfo),
- &BytesReturned,
- NULL
- )) {
- ::MessageBox ( NULL, L"DISK_IOCTL_GETINFO", L"ERROR", 0);
- return ;
- }
- CString tmp;
- tmp.Format(L"di_bytes_per_sect=%d di_total_sectors =%d Total Captal=%d/r/n",inbuf.di_bytes_per_sect,inbuf.di_total_sectors,di_total_sectors*di_bytes_per_sect );
- ::MessageBox ( NULL, tmp, L"ERROR", 0);
- CloseHandle(h_nfd);
- }
当然,类似的还可以获得SD卡ID号
- SD驱动问题及相关文章
- SD驱动系列文章
- u-boot内存容量显示修复及SD卡驱动问题
- linux驱动相关文章
- SD卡相关的问题
- Linux驱动中的关键问题及相关API
- 驱动相关问题
- android读取sd卡数据库文件相关问题
- 串口 驱动 MFC DLL 相关文章记录
- sd卡驱动分析之相关硬件操作和总结
- linux系统sd卡驱动中相关特性设置
- LCD驱动及Framebuffer相关
- LCD驱动及Framebuffer相关 .
- LCD驱动及Framebuffer相关
- Camera及视频驱动相关
- LCD驱动及Framebuffer相关
- Linux SD卡驱动开发(一) —— SD 相关基础概念
- Linux SD卡驱动开发(一) —— SD 相关基础概念
- define宏定义中的#,##,@#及/符号
- 基于嵌入式ARM的工控主板与X86工控主板的比较
- Android 上实现水波特效二--优化
- MFC宏定义详解
- 在Word 2007中打开多文档方法小结
- SD驱动问题及相关文章
- Same forum using http and https
- 云存储大战要开打罗
- 双击VC对话框提示cannot add new member的解决
- 解决IIS无法启动,"服务并未即使响应启动或控制请求"
- GPRS无线LED显示屏信息发布系统应用方案
- How to make a patch
- 网站架构:各种网站架构
- 全球十大最会赚钱的人