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

来源:互联网 发布:手机文字排版软件 编辑:程序博客网 时间:2024/05/12 20:47

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

[c-sharp] view plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕搬了重东西怎么办 深蹲力量不涨怎么办 ps4连接显示器分辨率低怎么办 大疆失去链接后怎么办 脑袋被锤了几拳怎么办 华为手机变板砖怎么办 电脑网页打开很慢怎么办 网页加载速度太慢.怎么办 cad字显示不出来怎么办 dell笔记本打不开机怎么办 手机系统界面已停止运行怎么办 大石退出菊丸怎么办 word空白页面突然变大了怎么办 高速上车胎爆了怎么办 没有定速巡航跑长途怎么办 惠普笔记本驱动无法安装怎么办 狙击手遇到热追踪导弹怎么办 做完卷腹脖子疼怎么办 医疗设备销售遭遇瓶颈怎么办 给顾客加油加超了怎么办 卡密码输错两次怎么办 擤鼻涕耳朵会响怎么办 鼻子里有血丝是怎么办 怀孕8周上火了怎么办 鼻炎犯了鼻涕流不停怎么办 擤鼻涕眼睛肿了怎么办 感冒咳嗽鼻子不通气怎么办 宝宝感冒不会擤鼻涕怎么办 新生儿鼻腔里有鼻涕怎么办 宝宝鼻腔有鼻涕出不来怎么办 怀孕的人感冒了怎么办 孕37周感冒咳嗽怎么办 吹鼻涕耳朵堵了怎么办 怀孕的孔雀鱼生病了怎么办 生病了咳嗽一直不好怎么办 宝宝生病治疗后咳嗽怎么办 2个月宝宝老是生病怎么办 2个月的哈士奇生病怎么办 怀孕的猫生病了怎么办 宝宝生病咳嗽啥都不吃怎么办 怀孕了感冒了怎么办啊