PXA270,windows CE5.0下读取MMC/SD卡的硬件ID问题.
各位大虾好:
我用VirtualAlloc,VirtualCopy影射了PXA270的关于SD/MMC的硬件寄存器的物理地址,想这样通过发送指令CMD2来获得卡的128位的唯一ID.目前情况为: 物理地址已经成功映射.但是发送了指令后,等待SD/MMC响应指令的中断,一直等不到中断位置位.一直搞不定.个人怀疑,可能是CE的SD/MMC的驱动程序在我的程序操作硬件的的时候,也在操作.
大虾分析下什么原因,有没有能够使我独占这份资源的方法?还是其他原因?
谢谢
我面对的是PDA手机,不可能接触到驱动那一层的,我只能在应用层做这些事情
我感觉应用程序里面应该直接调用API访问好一点,找找看看有没有可以用的API?
如果像你说的那样自己影射寄存器,最好还是在驱动里面做
如果有这样的API,我也不会这样郁闷了。这位高人是否有wince的关于PXA270的SD/MMC驱动?参考以下?
setmem 0x41100000,0x00000002,32 //start the mmclk
具个例子:
///////////////////////////////////////////////////////////////////////////////
// SDClockOn - turn on the MMC Clock
// Input: pHc - hardware context
// Output:
// Return:
// Notes:
///////////////////////////////////////////////////////////////////////////////
VOID SDClockOn(PSDH_HARDWARE_CONTEXT pHc)
{
// RETAILMSG(1, (TEXT("-->SDClockOn\r\n")));
// turn on the clock
WRITE_MMC_REGISTER_DWORD(pHc, MMC_STRPCL, MMC_STRPCL_START_CLOCK);
}
我贴下代码吧,高手诊断下,谢谢啦
pMMCReg->rMMC_CLKRT = 0x00000006;
pMMCReg->rMMC_CMD = 0x00000002;//cmd2
pMMCReg->rMMC_ARGH = 0;
pMMCReg->rMMC_ARGL = 0;
pMMCReg->rMMC_CMDAT = CMDAT_RESP_R2;
pMMCReg->rMMC_I_MASK = ~END_CMD_RES;
pMMCReg->rMMC_STRPCL = 2;//运行到这里程序就死掉了,系统也死掉了
while( !(pMMCReg->rMMC_I_REG & (1<<2)) );//wait for end_cmd_res
for( i = 0; i < 8; i ++ )
{
resp = pMMCReg->rMMC_RES & 0x0000ffff;
}
为了获得ID 不需要这么做吧,一般的SD卡驱动程序已经包含了这样的命令了, 你只需要调用WinCE标准的API既可以获得SD的硬件ID.
看看 Help 钟关于 Storage 的相关的 API.
可以用API函数的,API函数有个好处就是不需要分是SD卡还是MMC卡,如果你直接操作寄存器的话需要细分你插入的是SD卡还是MMC卡,在使用CMD2之前两个卡的初始化是不相同的,所以CMD2命令可能你不能成功的。
引用: 引用 9 楼 alexu2002 的回复:
我贴下代码吧,高手诊断下,谢谢啦
pMMCReg-> rMMC_CLKRT = 0x00000006;
pMMCReg-> rMMC_CMD = 0x00000002;//cmd2
pMMCReg-> rMMC_ARGH = 0;
pMMCReg-> rMMC_ARGL = 0;
pMMCReg-> rMMC_CMDAT = CMDAT_RESP_R2;
pMMCReg-> rMMC_I_MASK = ~END_CMD_RES;
pMMCReg-> rMMC_STRPCL = 2;//运行到这里程序就死掉了…
pMMCReg-> rMMC_STRPCL = 2;
把上面这行代码去掉,前面停CLOCK的代码也去掉
让MMC 的CLOCK在你对卡作操作的时候一直保持,不要停
如果还是不行,可以把MMC_I_REG,和MMC_STAT两个寄存器的值读出来看看有什么问题