Windows CE SDHC驱动简析(3)-CSDIOController类(基于WinCE5.0 SMDK2410 BSP的SDHC驱动)

接下来我们来看看CSDIOControllerBase的继承类CSDIOController,实现在sdiocontroller.cpp.这个类的对象在SDH_Init中通过调用CreateSDIOController来创建其对象,这个函数也在sdiocontroller.cpp中实现:

[c-sharp]  view plain copy
  1. CSDIOControllerBase* CreateSDIOController( PSDCARD_HC_CONTEXT pHCContext )  
  2. {  
  3.     return new CSDIOController( pHCContext );  
  4. }  

CSDIOController实现了CSDIOControllerBase中定义的几个纯虚函数:
 virtual BOOL InitializeHardware( BOOL bOnPowerUp = FALSE ) = 0;
 virtual void DeinitializeHardware( BOOL bOnPowerDown = FALSE ) = 0;
 virtual BOOL CustomSetup( LPCTSTR pszRegistryPath ) = 0;
 virtual BOOL IsCardWriteProtected() = 0;
 virtual BOOL IsCardPresent() = 0;
这些函数定义了与实际硬件平台相关的一些代码,当硬件发生变化时,只需要修改和硬件相关的代码就可以了.
1.CustomSetup
CustomSetup被基类的InterpretCapabilities函数调用,和InterpretCapabilities一样,CustomSetup主要工作也是从注册表中获取信息.如CardDetect,CardReadWrite的信息,比如是哪个GPIO寄存器,相应的掩码和具体的值等.这些信息被以下几个函数用到.
[c-sharp]  view plain copy
  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/n")));  
  8.         fRetVal = FALSE;  
  9.         goto FUNCTION_EXIT;  
  10.     }  
  11.   
  12.     // read the card detect GPIO settings  
  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!/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.   
  36.     // read the card read/write GPIO settings  
  37.     LPCTSTR pszCardReadWriteGPIO = regDevice.ValueSZ( CARD_READWRITE_GPIO_TEXT );  
  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!/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.   
  61. FUNCTION_EXIT:  
  62.     if (hKeyDevice) RegCloseKey(hKeyDevice);  
  63.     return fRetVal;  
  64. }  

2.InitializeHardware
InitializeHardware被基类的Initialize函数调用.
根据具体的GPIO(读写检测m_chCardReadWriteGPIO,这里是GPH8,插入检测m_chCardDetectGPIO,这里是GPG10)来对相应的GPIO寄存器进行初始化(如GPACON或者GPBCON等).根据以下变量的值来进行设置,这些变量从注册表中获得(CustomSetup函数中进行).m_dwCardReadWriteControlMask,m_dwCardReadWriteControlFlag,m_dwCardDetectControlMask,m_dwCardDetectControlFlag
[c-sharp]  view plain copy
  1. BOOL CSDIOController::InitializeHardware( BOOL bOnPowerUp )  
  2. {  
  3.     // Configure GPIO pin to detect WRITE-PROTECT status  
  4.       
  5.     RETAILMSG(1, (TEXT("++CSDIOController::InitializeHardware for GEC2410 SDHC/r/n")));  
  6.       
  7.     switch( m_chCardReadWriteGPIO )  
  8.     {  
  9.     case 'A':  
  10.         vm_pIOPreg->GPACON  = ( vm_pIOPreg->GPACON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;  
  11.         break;  
  12.     case 'B':  
  13.         vm_pIOPreg->GPBCON  = ( vm_pIOPreg->GPBCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;  
  14.         vm_pIOPreg->GPBUP   = ( vm_pIOPreg->GPBUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;  
  15.         break;  
  16.     case 'C':  
  17.         vm_pIOPreg->GPCCON  = ( vm_pIOPreg->GPCCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;  
  18.         vm_pIOPreg->GPCUP   = ( vm_pIOPreg->GPCUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;  
  19.         break;  
  20.     case 'D':  
  21.         vm_pIOPreg->GPDCON  = ( vm_pIOPreg->GPDCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;  
  22.         vm_pIOPreg->GPDUP   = ( vm_pIOPreg->GPDUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;  
  23.         break;  
  24.     case 'E':  
  25.         vm_pIOPreg->GPECON  = ( vm_pIOPreg->GPECON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;  
  26.         vm_pIOPreg->GPEUP   = ( vm_pIOPreg->GPEUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;  
  27.         break;  
  28.     case 'F':  
  29.         vm_pIOPreg->GPFCON  = ( vm_pIOPreg->GPFCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;  
  30.         vm_pIOPreg->GPFUP   = ( vm_pIOPreg->GPFUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;  
  31.         break;  
  32.     case 'G':  
  33.         vm_pIOPreg->GPGCON  = ( vm_pIOPreg->GPGCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;  
  34.         vm_pIOPreg->GPGUP   = ( vm_pIOPreg->GPGUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;  
  35.         break;  
  36.     case 'H':  
  37.         vm_pIOPreg->GPHCON  = ( vm_pIOPreg->GPHCON & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;  
  38.         vm_pIOPreg->GPHUP   = ( vm_pIOPreg->GPHUP & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;  
  39.         break;  
  40.     default:  
  41.         ASSERT(0); // invalid GPIO! We should never get here!  
  42.         return FALSE;  
  43.     }  
  44.   
  45.     // Configure GPIO pin to detect CARD PRESENT status  
  46.     switch( m_chCardDetectGPIO )  
  47.     {  
  48.     case 'A':  
  49.         vm_pIOPreg->GPACON  = ( vm_pIOPreg->GPACON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;  
  50.         break;  
  51.     case 'B':  
  52.         vm_pIOPreg->GPBCON  = ( vm_pIOPreg->GPBCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;  
  53.         vm_pIOPreg->GPBUP   = ( vm_pIOPreg->GPBUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;  
  54.         break;  
  55.     case 'C':  
  56.         vm_pIOPreg->GPCCON  = ( vm_pIOPreg->GPCCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;  
  57.         vm_pIOPreg->GPCUP   = ( vm_pIOPreg->GPCUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;  
  58.         break;  
  59.     case 'D':  
  60.         vm_pIOPreg->GPDCON  = ( vm_pIOPreg->GPDCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;  
  61.         vm_pIOPreg->GPDUP   = ( vm_pIOPreg->GPDUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;  
  62.         break;  
  63.     case 'E':  
  64.         vm_pIOPreg->GPECON  = ( vm_pIOPreg->GPECON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;  
  65.         vm_pIOPreg->GPEUP   = ( vm_pIOPreg->GPEUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;  
  66.         break;  
  67.     case 'F':  
  68.         vm_pIOPreg->GPFCON  = ( vm_pIOPreg->GPFCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;  
  69.         vm_pIOPreg->GPFUP   = ( vm_pIOPreg->GPFUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;  
  70.         break;  
  71.     case 'G':  
  72.         vm_pIOPreg->GPGCON  = ( vm_pIOPreg->GPGCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;  
  73.         vm_pIOPreg->GPGUP   = ( vm_pIOPreg->GPGUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;  
  74.         break;  
  75.     case 'H':  
  76.         vm_pIOPreg->GPHCON  = ( vm_pIOPreg->GPHCON & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;  
  77.         vm_pIOPreg->GPHUP   = ( vm_pIOPreg->GPHUP & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;  
  78.         break;  
  79.     default:  
  80.         ASSERT(0); // invalid GPIO! We should never get here!  
  81.         return FALSE;  
  82.     }  
  83.   
  84.     return TRUE;  
  85. }  

3.DeinitializeHardware
未做任何工作

4.IsCardWriteProtected
在SlotOptionHandler中被调用,给PSD_CARD_INTERFACE结构的WriteProtected成员赋值,判断SD卡是否写保护,通过判断对应的GPHDAT寄存器m_dwCardReadWriteMask位(GPH8)与m_dwCardReadWriteFlag进行比较判断.
[c-sharp]  view plain copy
  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. }  


5.IsCardPresent
判断SD卡是否存在,这个函数被基类的很多函数调用,如TransferIstThread等,很多操作都要先判断SD卡是否存在,然后在进行下面的操作.
通过判断GPG10状态来获得.
[c-sharp]  view plain copy
  1. BOOL CSDIOController::IsCardPresent()  
  2. {  
  3.     switch( m_chCardDetectGPIO )  
  4.     {  
  5.     case 'A':  
  6.         return ( ( vm_pIOPreg->GPADAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;  
  7.     case 'B':  
  8.         return ( ( vm_pIOPreg->GPBDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;  
  9.     case 'C':  
  10.         return ( ( vm_pIOPreg->GPCDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;  
  11.     case 'D':  
  12.         return ( ( vm_pIOPreg->GPDDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;  
  13.     case 'E':  
  14.         return ( ( vm_pIOPreg->GPEDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;  
  15.     case 'F':  
  16.         return ( ( vm_pIOPreg->GPFDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;  
  17.     case 'G':  
  18.         return ( ( vm_pIOPreg->GPGDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;  
  19.     case 'H':  
  20.         return ( ( vm_pIOPreg->GPHDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? TRUE  : FALSE;  
  21.     default:  
  22.         ASSERT(0); // invalid GPIO!  We should never get here  
  23.     }  
  24.     return (vm_pIOPreg->GPGDAT & (1<<10))  ? FALSE : TRUE;  
  25. }  

另外附上注册表sdhc_sc2410.reg的内容:
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SDHC_SMDK2410]
    "Order"=dword:21
    "Dll"="sdhc_smdk2410.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 GPG10
    "CardDetectMask"=dword:400
    "CardDetectFlag"=dword:0
    "CardDetectControlMask"=dword:fffcffff
    "CardDetectControlFlag"=dword:0
    "CardDetectPullupMask"=dword:ffffffef
    "CardDetectPullupFlag"=dword:10
    
    "CardReadWriteGPIO"="H"         ; card R/W on GPH8
    "CardReadWriteMask"=dword:100
    "CardReadWriteFlag"=dword:100
    "CardReadWriteControlMask"=dword:ffcfffff
    "CardReadWriteControlFlag"=dword:0
    "CardReadWritePullupMask"=dword:ffffffbf
    "CardReadWritePullupFlag"=dword:40

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值