SD卡支持大容量办法(转)
1.
更新PB,补丁名称为:
07年12月份的WinCEPB50-071231-Product-Update-Rollup-Armv4I.msi
2. 在platform->setting->environment 中设置IMGSDBUS2 = 1
之所以要设置这个环境变量是因为sdbus2.dll 才支持大容量的SD的。
3、在common.bib中
#if defined IMGSDBUS2
; @CESYSGEN IF CE_MODULES_SDBUS2
sdbus.dll $(_FLATRELEASEDIR)\sdbus2.dll NK SH
; @CESYSGEN ENDIF CE_MODULES_SDBUS2
#else
; @CESYSGEN IF CE_MODULES_SDBUS
sdbus.dll $(_FLATRELEASEDIR)\sdbus.dll NK SH
; @CESYSGEN ENDIF CE_MODULES_SDBUS
#endif
(第三个似乎很多BSP都已经包含了的)
4、修改BSP代码:
在SDHC——》sdhcbase下的sdiocontrollerbase.cpp中,添加两句代码:
第一个在SendCommand函数下:
case ResponseR1: // Short response required
case ResponseR1b:
case ResponseR3:
case ResponseR4:
case ResponseR5:
case ResponseR6:
case ResponseR7://该句话为添加的代码
第二个在GetCommandResponse函数下:
case ResponseR1:
case ResponseR1b:
case ResponseR7: //该句话为添加的代码
*(respBuff ) = (BYTE)(START_BIT | TRANSMISSION_BIT | pRequest->CommandCode);
*(respBuff + 1) = (BYTE)(vm_pSDIReg->SDIRSP0 );
*(respBuff + 2) = (BYTE)(vm_pSDIReg->SDIRSP0 >> 8 );
*(respBuff + 3) = (BYTE)(vm_pSDIReg->SDIRSP0 >> 16);
*(respBuff + 4) = (BYTE)(vm_pSDIReg->SDIRSP0 >> 24);
*(respBuff + 5) = (BYTE)(END_RESERVED | END_BIT);
主要是增加对CMD8命令,详细请查MMC,SD卡的协议。
pb6已经默认包含了对sd20的支持。pb5在打过2007全年补丁后,就增加了对sd20协议以及SDHC卡的支持,需要设置一个新的环境变量IMGSDBUS2=1.在驱动里面的对应修改非常简单, 就是增加对CMD8命令的响应, 根据sd20协议,cmd8的响应类型是R7, 所以, 简单的在1208和1308行增加case ResponseR7:就可以了。
说明, sdhc是遵循sd20协议, sd20协议和sd11协议的差别不是很大, 主要一个区别是在初始化时候,发送cmd0复位后, 首先发送cmd8进行判断是否支持sd20, 然后才发生cmd2, cmd3, acmd55进行识别。还有一个重大的变化是sd20只能支持512大小的block。 但是对于之前的驱动实现,对于sd11的卡, 默认的也都是使用512,所以这一点不需要额外处理。
经过测试2440可以支持sdhc和sd20. 之前一直担忧2440的sd的fifo的size太小, 仅仅64, 小于一次有效传输的block size, 担忧会导致fifo溢出。 又对比了2450和6410系列的sd部分, fifo都增加到了512, 也许是因应新协议的变化。
我测试的是一张4G class 2的SDHC卡。实际测试, 2440可以使用SDHC。意味着可以支持4G~32G的卡。