现在的位置: 首页 > 综合 > 正文

标准wince5.0 BSP之SD卡驱动分析

2013年10月10日 ⁄ 综合 ⁄ 共 12015字 ⁄ 字号 评论关闭

  本来打算把SD卡驱动移植到俺的4.2BSP下的,但是发现太难了,还不如直接把以前的BSP丢弃。从长远着想,还是丢弃比较好,为了将来的KITL,必须丢弃那个古董4.2BSP。这次先不告诉我的计划先,自己做出来再告诉他们了。

   还是老方法,首先看SD卡的注册表。

; @CESYSGEN IF CE_MODULES_SDBUS
IF BSP_SDHC_SC2440

[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SDHC_SMDK2440]
    "Order"=dword:21
    "Dll"="sdhc_sc2440.dll"
    "Prefix"="SDH"
   
    "DMAChannel"=dword:0            ; DMA channel to use.  Set to 0xffffffff to disable DMA
    "DMAIrq"=dword:11
    "DMA_IST_Priority"=dword:96

    "SDIOIrq"=dword:15
    "SDIO_IST_Priority"=dword:97
   
    "PollingTimeout"=dword:100      ; 100 ms
    "CardDetect_Thread_Priority"=dword:98
   
    "CardDetectGPIO"="G"            ; card detect on GPG8从电路图看这是EINT16,放心里面一定要注册表读取过程的。
    "CardDetectMask"=dword:100 这个是什么?有什么用?
    "CardDetectFlag"=dword:0 设置以何种方式检测SD插拔
    "CardDetectControlMask"=dword:fffcffff
    "CardDetectControlFlag"=dword:0
    "CardDetectPullupMask"=dword:fffffeff
    "CardDetectPullupFlag"=dword:100
   
    "CardReadWriteGPIO"="H"         ; card R/W on GPH8--我猜测以下部分没用到,因为俺们的SD卡根本没有写保护的
    "CardReadWriteMask"=dword:100
    "CardReadWriteFlag"=dword:100
    "CardReadWriteControlMask"=dword:fffcffff
    "CardReadWriteControlFlag"=dword:0
    "CardReadWritePullupMask"=dword:fffffeff
    "CardReadWritePullupFlag"=dword:100

    "HandleBusyFinishOnCommand38"=dword:1
    "DmaTransferTimeoutFactor"=dword:8
    "DmaTransferTimeoutConstant"=dword:3000

ENDIF BSP_SDHC_SC2440
; @CESYSGEN ENDIF CE_MODULES_SDBUS

 

我用PB的Find in file 工具查找CardDetectGPIO,就找到上面注册表的奥妙。请看下面代码

1.注册表相关部分

  1. #define CARD_DETECT_GPIO_TEXT TEXT("CardDetectGPIO")
  2. #define CARD_DETECT_MASK_TEXT TEXT("CardDetectMask")
  3. #define CARD_DETECT_FLAG_TEXT TEXT("CardDetectFlag")
  4. #define CARD_DETECT_CONTROL_MASK_TEXT TEXT("CardDetectControlMask")
  5. #define CARD_DETECT_CONTROL_FLAG_TEXT TEXT("CardDetectControlFlag")
  6. #define CARD_DETECT_PULLUP_MASK_TEXT TEXT("CardDetectPullupMask")
  7. #define CARD_DETECT_PULLUP_FLAG_TEXT TEXT("CardDetectPullupFlag")
  8. #define CARD_READWRITE_GPIO_TEXT TEXT("CardReadWriteGPIO")
  9. #define CARD_READWRITE_MASK_TEXT TEXT("CardReadWriteMask")
  10. #define CARD_READWRITE_FLAG_TEXT TEXT("CardReadWriteFlag")
  11. #define CARD_READWRITE_CONTROL_MASK_TEXT TEXT("CardReadWriteControlMask")
  12. #define CARD_READWRITE_CONTROL_FLAG_TEXT TEXT("CardReadWriteControlFlag")
  13. #define CARD_READWRITE_PULLUP_MASK_TEXT TEXT("CardReadWritePullupMask")
  14. #define CARD_READWRITE_PULLUP_FLAG_TEXT TEXT("CardReadWritePullupFlag")

 

上面这些东西一看便知,就不做介绍了

2.看看是怎么读取注册表的

  1. BOOL CSDIOController::CustomSetup( LPCTSTR pszRegistryPath )
  2. {
  3.     BOOL fRetVal = TRUE;
  4.     CReg regDevice; // encapsulated device key
  5.     HKEY hKeyDevice = OpenDeviceKey(pszRegistryPath);
  6.     if ( (hKeyDevice == NULL) || !regDevice.Open(hKeyDevice, NULL) ) {
  7.         DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("CSDIOControllerBase::InterpretCapabilities: Failed to open device key/r/n")));
  8.         fRetVal = FALSE;
  9.         goto FUNCTION_EXIT;
  10.     }
  11.     // read the card detect GPIO settings
  12.     //我猜测注册表是使用遍历查找的方法超找的
  13.     LPCTSTR pszCardDetectGPIO = regDevice.ValueSZ( CARD_DETECT_GPIO_TEXT );
  14.     if( pszCardDetectGPIO && pszCardDetectGPIO[0] >= TEXT('a') && pszCardDetectGPIO[0] <= TEXT('h') )
  15.     {
  16.         m_chCardDetectGPIO = (char)pszCardDetectGPIO[0] - ('a'-'A');
  17.     }
  18.     else if( pszCardDetectGPIO && pszCardDetectGPIO[0] >= TEXT('A') && pszCardDetectGPIO[0] <= TEXT('H') )
  19.     {
  20.         m_chCardDetectGPIO = (char)pszCardDetectGPIO[0];
  21.     }
  22.     else
  23.     {
  24.         // invalid SDIO SYSINTR value!
  25.         DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("invalid SDIO SYSINTR value!/r/n")));
  26.         fRetVal = FALSE;
  27.         goto FUNCTION_EXIT;
  28.     }
  29.     m_dwCardDetectMask = regDevice.ValueDW( CARD_DETECT_MASK_TEXT );
  30.     m_dwCardDetectFlag = regDevice.ValueDW( CARD_DETECT_FLAG_TEXT );
  31.     m_dwCardDetectControlMask = regDevice.ValueDW( CARD_DETECT_CONTROL_MASK_TEXT );
  32.     m_dwCardDetectControlFlag = regDevice.ValueDW( CARD_DETECT_CONTROL_FLAG_TEXT );
  33.     m_dwCardDetectPullupMask = regDevice.ValueDW( CARD_DETECT_PULLUP_MASK_TEXT );
  34.     m_dwCardDetectPullupFlag = regDevice.ValueDW( CARD_DETECT_PULLUP_FLAG_TEXT );
  35.     // read the card read/write GPIO settings
  36.     LPCTSTR pszCardReadWriteGPIO = regDevice.ValueSZ( CARD_READWRITE_GPIO_TEXT );
  37.     //这里也做了限定,不是什么东西都可以任意设置的
  38.     if( pszCardReadWriteGPIO && pszCardReadWriteGPIO[0] >= TEXT('a') && pszCardReadWriteGPIO[0] <= TEXT('h') )
  39.     {
  40.         m_chCardReadWriteGPIO = (char)pszCardReadWriteGPIO[0] - ('a'-'A');//赋值给成员变量
  41.     }
  42.     else if( pszCardReadWriteGPIO || pszCardReadWriteGPIO[0] >= TEXT('A') && pszCardReadWriteGPIO[0] <= TEXT('H') )
  43.     {
  44.         m_chCardReadWriteGPIO = (char)pszCardReadWriteGPIO[0];
  45.     }
  46.     else
  47.     {
  48.         // invalid SDIO SYSINTR value!
  49.         DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("invalid SDIO SYSINTR value!/r/n")));
  50.         if (hKeyDevice) RegCloseKey(hKeyDevice);
  51.         fRetVal = FALSE;
  52.         goto FUNCTION_EXIT;
  53.     }
  54.     m_dwCardReadWriteMask = regDevice.ValueDW( CARD_READWRITE_MASK_TEXT );
  55.     m_dwCardReadWriteFlag = regDevice.ValueDW( CARD_READWRITE_FLAG_TEXT );
  56.     m_dwCardReadWriteControlMask = regDevice.ValueDW( CARD_READWRITE_CONTROL_MASK_TEXT );
  57.     m_dwCardReadWriteControlFlag = regDevice.ValueDW( CARD_READWRITE_CONTROL_FLAG_TEXT );
  58.     m_dwCardReadWritePullupMask = regDevice.ValueDW( CARD_READWRITE_PULLUP_MASK_TEXT );
  59.     m_dwCardReadWritePullupFlag = regDevice.ValueDW( CARD_READWRITE_PULLUP_FLAG_TEXT );
  60. FUNCTION_EXIT:
  61.     if (hKeyDevice) RegCloseKey(hKeyDevice);
  62.     return fRetVal;
  63. }

 

以上程序写得很安全,很明了,三星,支持你!

3.再往下看——初始化硬件了

  1. BOOL CSDIOController::InitializeHardware( BOOL bOnPowerUp )
  2. {
  3.     // Configure GPIO pin to detect WRITE-PROTECT status
  4.     switch( m_chCardReadWriteGPIO )
  5.     {
  6.     case 'A':
  7.         vm_pIOPreg->GPACON  = ( vm_pIOPreg->GPACON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
  8.         break;
  9.     case 'B':
  10.         vm_pIOPreg->GPBCON  = ( vm_pIOPreg->GPBCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
  11.         vm_pIOPreg->GPBUP   = ( vm_pIOPreg->GPBUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;
  12.         break;
  13.     case 'C':
  14.         vm_pIOPreg->GPCCON  = ( vm_pIOPreg->GPCCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
  15.         vm_pIOPreg->GPCUP   = ( vm_pIOPreg->GPCUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;
  16.         break;
  17.     case 'D':
  18.         vm_pIOPreg->GPDCON  = ( vm_pIOPreg->GPDCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
  19.         vm_pIOPreg->GPDUP   = ( vm_pIOPreg->GPDUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;
  20.         break;
  21.     case 'E':
  22.         vm_pIOPreg->GPECON  = ( vm_pIOPreg->GPECON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
  23.         vm_pIOPreg->GPEUP   = ( vm_pIOPreg->GPEUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;
  24.         break;
  25.     case 'F':
  26.         vm_pIOPreg->GPFCON  = ( vm_pIOPreg->GPFCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
  27.         vm_pIOPreg->GPFUP   = ( vm_pIOPreg->GPFUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;
  28.         break;
  29.     case 'G':
  30.         vm_pIOPreg->GPGCON  = ( vm_pIOPreg->GPGCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
  31.         vm_pIOPreg->GPGUP   = ( vm_pIOPreg->GPGUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;
  32.         break;
  33.     case 'H':
  34.         vm_pIOPreg->GPHCON  = ( vm_pIOPreg->GPHCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
  35.         vm_pIOPreg->GPHUP   = ( vm_pIOPreg->GPHUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;
  36.         break;
  37.     default:
  38.         ASSERT(0); // invalid GPIO! We should never get here!
  39.         return FALSE;
  40.     }
  41.     // Configure GPIO pin to detect CARD PRESENT status
  42.     switch( m_chCardDetectGPIO )
  43.     {
  44.     case 'A':
  45.         vm_pIOPreg->GPACON  = ( vm_pIOPreg->GPACON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
  46.         break;
  47.     case 'B':
  48.         vm_pIOPreg->GPBCON  = ( vm_pIOPreg->GPBCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
  49.         vm_pIOPreg->GPBUP   = ( vm_pIOPreg->GPBUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;
  50.         break;
  51.     case 'C':
  52.         vm_pIOPreg->GPCCON  = ( vm_pIOPreg->GPCCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
  53.         vm_pIOPreg->GPCUP   = ( vm_pIOPreg->GPCUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;
  54.         break;
  55.     case 'D':
  56.         vm_pIOPreg->GPDCON  = ( vm_pIOPreg->GPDCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
  57.         vm_pIOPreg->GPDUP   = ( vm_pIOPreg->GPDUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;
  58.         break;
  59.     case 'E':
  60.         vm_pIOPreg->GPECON  = ( vm_pIOPreg->GPECON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
  61.         vm_pIOPreg->GPEUP   = ( vm_pIOPreg->GPEUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;
  62.         break;
  63.     case 'F':
  64.         vm_pIOPreg->GPFCON  = ( vm_pIOPreg->GPFCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
  65.         vm_pIOPreg->GPFUP   = ( vm_pIOPreg->GPFUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;
  66.         break;
  67.     case 'G':
  68.         vm_pIOPreg->GPGCON  = ( vm_pIOPreg->GPGCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
  69.         vm_pIOPreg->GPGUP   = ( vm_pIOPreg->GPGUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;
  70.         break;
  71.     case 'H':
  72.         vm_pIOPreg->GPHCON  = ( vm_pIOPreg->GPHCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
  73.         vm_pIOPreg->GPHUP   = ( vm_pIOPreg->GPHUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;
  74.         break;
  75.     default:
  76.         ASSERT(0); // invalid GPIO! We should never get here!
  77.         return FALSE;
  78.     }
  79.     return TRUE;
  80. }

 

看了这些代码,啥都不想说了。——三星,难怪你的用户这么多!

4.下面是检测卡擦拔以及写保户之类的东西

  1. BOOL CSDIOController::IsCardWriteProtected()
  2. {
  3.     switch( m_chCardReadWriteGPIO )
  4.     {
  5.     case 'A':
  6.         return ( ( vm_pIOPreg->GPADAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
  7.     case 'B':
  8.         return ( ( vm_pIOPreg->GPBDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
  9.     case 'C':
  10.         return ( ( vm_pIOPreg->GPCDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
  11.     case 'D':
  12.         return ( ( vm_pIOPreg->GPDDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
  13.     case 'E':
  14.         return ( ( vm_pIOPreg->GPEDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
  15.     case 'F':
  16.         return ( ( vm_pIOPreg->GPFDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
  17.     case 'G':
  18.         return ( ( vm_pIOPreg->GPGDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
  19.     case 'H':
  20.         return ( ( vm_pIOPreg->GPHDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
  21.     default:
  22.         ASSERT(0); // invalid GPIO!  We should never get here
  23.         return TRUE;
  24.     }
  25. }
  26. BOOL CSDIOController::IsCardPresent()
  27. {
  28.     switch( m_chCardDetectGPIO )
  29.     {
  30.     case 'A':
  31.         return ( ( vm_pIOPreg->GPADAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;
  32.     case 'B':
  33.         return ( ( vm_pIOPreg->GPBDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;
  34.     case 'C':
  35.         return ( ( vm_pIOPreg->GPCDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;
  36.     case 'D':
  37.         return ( ( vm_pIOPreg->GPDDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;
  38.     case 'E':
  39.         return ( ( vm_pIOPreg->GPEDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;
  40.     case 'F':
  41.         return ( ( vm_pIOPreg->GPFDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;
  42.     case 'G':
  43.         return ( ( vm_pIOPreg->GPGDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;
  44.     case 'H':
  45.         return ( ( vm_pIOPreg->GPHDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;
  46.     default:
  47.         ASSERT(0); // invalid GPIO!  We should never get here
  48.     }
  49.     return (vm_pIOPreg->GPGDAT & (1<<10))  ? FALSE : TRUE;
  50. }
  51. //----------不知道下面这个函数有什么玄机
  52. CSDIOControllerBase* CreateSDIOController( PSDCARD_HC_CONTEXT pHCContext )
  53. {
  54.     return new CSDIOController( pHCContext );
  55. }

以上源码均来自/Src/Drivers/SDHC/SDHC/sdiocontroller.cpp这个文件

抱歉!评论已关闭.