解决SD不能读写问题
//-----------------------------------------------------------------------------------------------------------
// 作者:wogoyixikexie@gliet
// 版权:桂林电子科技大学一系科协wogoyixikexie@gliet
// 平台:wince5.0 2440 5.0 BSP
// 发布日期:2009年5月5日 17:30:37
// 最后修改:
// 注意事项:未经作者同意,不得在转载的时候擅自修改、删除文章的任何部分
//-----------------------------------------------------------------------------------------------------------
今天,我插入SD卡,SD卡盘符很快出现了,可是郁闷的事情出现了:当我在SD卡盘符里面新建文件夹,立即弹出不允许建立的对话框,并且,删除里面的文件也不行。刚开始我怀疑是三星提供的BSP问题,后来,我用立宇泰开发板测试,发现这个SD卡使用完全正常,后来查看电路,发现有个写保护的控制的,我感觉到是这个问题,但是我看电路这个立宇泰的写保护控制引脚和我的手持机是完全一致的,这个BSP就是本来立宇泰的修改而来的,貌似我从来没有改动过GPH相关的东西。不过估计这个只能用貌似了,因为这个BSP我已经修改了好几个月,说不定无意间早就改动了。当我使用sunrain_hjb牛人写的应用程序去读GPH8相关的寄存器的时候,发现这的确是问题所在。两者的GPH8相关的寄存器居然不同。我的配置成输入了,成功的是输出的。
现在使用sunrain_hjb的小软件设置一下GPH8输出,就可以正常读写SD卡了。sunrain_hjb牛人让我学到了好多东西。
============================================================
在注册表里面,SD卡写保护配置有
"CardReadWriteGPIO"="H" ; card R/W on GPH8
"CardReadWriteMask"=dword:100
"CardReadWriteFlag"=dword:100
"CardReadWriteControlMask"=dword:fffcffff
"CardReadWriteControlFlag"=dword:0
"CardReadWritePullupMask"=dword:fffffeff
"CardReadWritePullupFlag"=dword:100
在驱动中有
BOOL CSDIOController::IsCardWriteProtected()
{
switch( m_chCardReadWriteGPIO )
{
case 'A':
return ( ( vm_pIOPreg->GPADAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE : FALSE;
case 'B':
return ( ( vm_pIOPreg->GPBDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE : FALSE;
case 'C':
return ( ( vm_pIOPreg->GPCDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE : FALSE;
case 'D':
return ( ( vm_pIOPreg->GPDDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE : FALSE;
case 'E':
return ( ( vm_pIOPreg->GPEDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE : FALSE;
case 'F':
return ( ( vm_pIOPreg->GPFDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE : FALSE;
case 'G':
return ( ( vm_pIOPreg->GPGDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE : FALSE;
case 'H':
return ( ( vm_pIOPreg->GPHDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE : FALSE;
default:
ASSERT(0); // invalid GPIO! We should never get here
return TRUE;
}
}
如果想让系统不检测这个写保护,可以直接该函数的函数体弄成
BOOL CSDIOController::IsCardWriteProtected()
{
return FALSE;
}
即可。哈哈,虽然是些小玩意,但是也是值得注意的。下一步是让该驱动支持大容量的SD卡。回去请教一下群里先。