自己动手写TCC7901的GPIO驱动

//=====================================================================
//TITLE:
//    自己动手写TCC7901的GPIO驱动
//AUTHOR:
//    norains
//DATE:
//    Monday 12-July-2010
//Environment:
//    Windows CE 5.0 + TCC7901
//=====================================================================

    如果你使用的是WinCE,然后又涉及到GPIO的操作,你会很尴尬地发现,WinCE根本就没有针对于GPIO的接口。如果你想采用标准流驱动的GPIO口,很大的可能必须你自己丰衣足食,运气好一点的,或许你所使用的BSP就附带有其相应驱动。而对于TCC7901而言,很遗憾,属于前者。

 

    不过幸运的是,TCC7901对于寄存器的操作还算方便,所以写起驱动来,也并不是一件困难的事情。

 

    既然不困难,那么我们就自己动手,将TCC7901的驱动来完善吧!

 

    这篇文章假设朋友们已经对WinCE的流驱动结构有一定的了解,所以在此不对驱动的结构来进行解说,而是直奔主题。

 

    因为对于TCC7901的GPIO驱动来说,主要功能无非是设置或获取工作方式以及相应的数据,故我们对于控制码的定义可以定义为如下五种:

[cpp]  view plain copy
  1. enum GPIOCtrl  
  2. {  
  3.  //设置工作的模式  
  4.  IOCTL_GPIO_SET_DIRECTION = 0x00,  
  5.     
  6.  //获取工作的模式  
  7.  IOCTL_GPIO_GET_DIRECTION = 0x01,   
  8.    
  9.  //将输入的PIN作为GPIO口功能  
  10.  IOCTL_GPIO_SET_FUNCTION_GPIO = 0x02,  
  11.    
  12.  //设置数据为高,该控制码只有工作模式为输出时才有笑  
  13.  IOCTL_GPIO_SET_DATA = 0x03,  
  14.     
  15.  //设置数据为低,该控制码只有工作模式为输出时才有笑  
  16.  IOCTL_GPIO_CLEAR_DATA = 0x04,  
  17.     
  18.  //获取GPIO的数据  
  19.  IOCTL_GPIO_GET_DATA = 0x05,  
  20. };  
 


 控制码有了,那么我们的控制函数就可以简单的如此:

[cpp]  view plain copy
  1. extern "C" BOOL PIO_IOControl(  
  2.     DWORD Handle,  
  3.     DWORD dwIoControlCode,  
  4.     PBYTE pInBuf,  
  5.     DWORD nInBufSize,  
  6.     PBYTE pOutBuf,  
  7.     DWORD nOutBufSize,  
  8.     PDWORD pBytesReturned  
  9.     )  
  10. {  
  11.  switch(dwIoControlCode)  
  12.  {  
  13.   case IOCTL_GPIO_SET_DIRECTION:  
  14.   {  
  15.    if(sizeof(GPIOCtrlData) > nInBufSize)  
  16.    {  
  17.     return FALSE;  
  18.    }  
  19.    GPIOCtrlData *pCtrlData = reinterpret_cast<GPIOCtrlData *>(pInBuf);  
  20.      
  21.    return GPIO_SetDirection(pCtrlData->pin,pCtrlData->drct);  
  22.   }  
  23.   case IOCTL_GPIO_GET_DIRECTION:  
  24.   {  
  25.    if(sizeof(GPIOPin) > nInBufSize || sizeof(GPIODirection) > nOutBufSize)  
  26.    {  
  27.     return FALSE;  
  28.    }  
  29.      
  30.    *(reinterpret_cast<GPIODirection *>(pOutBuf)) = GPIO_GetDirection(*(reinterpret_cast<GPIOPin *>(pInBuf)));  
  31.      
  32.    return TRUE;  
  33.   }  
  34.   case IOCTL_GPIO_SET_FUNCTION_GPIO:  
  35.   {  
  36.    if(sizeof(GPIOPin) > nInBufSize)  
  37.    {  
  38.     return FALSE;  
  39.    }  
  40.   
  41.    return GPIO_SetFuncGPIO(*(reinterpret_cast<GPIOPin *>(pInBuf)));       
  42.   }  
  43.   case IOCTL_GPIO_SET_DATA:  
  44.   {  
  45.    if(sizeof(GPIOPin) > nInBufSize)  
  46.    {  
  47.     return FALSE;  
  48.    }  
  49.      
  50.    return GPIO_SetData(*(reinterpret_cast<GPIOPin *>(pInBuf)));  
  51.   }  
  52.   case IOCTL_GPIO_CLEAR_DATA:  
  53.   {  
  54.    if(sizeof(GPIOPin) > nInBufSize)  
  55.    {  
  56.     return FALSE;  
  57.    }  
  58.      
  59.    return GPIO_ClearData(*(reinterpret_cast<GPIOPin *>(pInBuf)));  
  60.   }  
  61.   case IOCTL_GPIO_GET_DATA:  
  62.   {  
  63.    if(sizeof(GPIOPin) > nInBufSize || sizeof(GPIOInputData) > nOutBufSize)  
  64.    {  
  65.     return FALSE;  
  66.    }  
  67.      
  68.    GPIOInputData inputData = GPIO_GetData(*(reinterpret_cast<GPIOPin *>(pInBuf)));  
  69.    *(reinterpret_cast<GPIOInputData *>(pOutBuf)) = inputData;  
  70.    if(inputData == GPIO_INPUT_HIGH || inputData == GPIO_INPUT_LOW)  
  71.    {  
  72.     return TRUE;  
  73.    }  
  74.    else  
  75.    {  
  76.     return FALSE;  
  77.    }  
  78.   }  
  79.     
  80.   default:  
  81.    return FALSE;  
  82.  }  
  83.  return FALSE;  
  84. }  
  85.   
  86.    

 

 

    该函数用到了一些常量,其实和控制码一样,也是枚举类型:

[cpp]  view plain copy
  1. //GPIO的PIN  
  2. enum GPIOPin  
  3. {  
  4.  GPIO_A00,  
  5.  GPIO_A01,  
  6.  GPIO_A02,  
  7.  GPIO_A03,  
  8.  GPIO_A04,  
  9.  GPIO_A05,  
  10.  GPIO_A06,  
  11.  GPIO_A07,  
  12.  GPIO_A08,  
  13.  GPIO_A09,  
  14.  GPIO_A10,  
  15.  GPIO_A11,  
  16.  GPIO_A12,  
  17.    
  18.  GPIO_B00,  
  19.  GPIO_B01,  
  20.  GPIO_B02,  
  21.  GPIO_B03,  
  22.  GPIO_B04,  
  23.  GPIO_B05,  
  24.  GPIO_B06,  
  25.  GPIO_B07,  
  26.  GPIO_B08,  
  27.  GPIO_B09,  
  28.  GPIO_B10,  
  29.  GPIO_B11,  
  30.  GPIO_B12,  
  31.  GPIO_B13,  
  32.  GPIO_B14,  
  33.  GPIO_B15,  
  34.    
  35.  GPIO_C00,  
  36.  GPIO_C01,  
  37.  GPIO_C02,  
  38.  GPIO_C03,  
  39.  GPIO_C04,  
  40.  GPIO_C05,  
  41.  GPIO_C06,  
  42.  GPIO_C07,  
  43.  GPIO_C08,  
  44.  GPIO_C09,  
  45.  GPIO_C10,  
  46.  GPIO_C11,  
  47.  GPIO_C12,  
  48.  GPIO_C13,  
  49.  GPIO_C14,  
  50.  GPIO_C15,  
  51.  GPIO_C16,  
  52.  GPIO_C17,  
  53.  GPIO_C18,  
  54.  GPIO_C19,  
  55.  GPIO_C20,  
  56.  GPIO_C21,  
  57.  GPIO_C22,  
  58.  GPIO_C23,  
  59.  GPIO_C24,  
  60.  GPIO_C25,  
  61.  GPIO_C26,  
  62.  GPIO_C27,  
  63.  GPIO_C28,  
  64.  GPIO_C29,  
  65.  GPIO_C30,  
  66.  GPIO_C31,  
  67.    
  68.  GPIO_D00,  
  69.  GPIO_D01,  
  70.  GPIO_D02,  
  71.  GPIO_D03,  
  72.  GPIO_D04,  
  73.  GPIO_D05,  
  74.  GPIO_D06,  
  75.  GPIO_D07,  
  76.  GPIO_D08,  
  77.  GPIO_D09,  
  78.  GPIO_D10,  
  79.  GPIO_D11,  
  80.  GPIO_D12,  
  81.    
  82.  GPIO_E00,  
  83.  GPIO_E01,  
  84.  GPIO_E02,  
  85.  GPIO_E03,  
  86.  GPIO_E04,  
  87.  GPIO_E05,  
  88.  GPIO_E06,  
  89.  GPIO_E07,  
  90.  GPIO_E08,  
  91.  GPIO_E09,  
  92.  GPIO_E10,  
  93.  GPIO_E11,  
  94.  GPIO_E12,  
  95.  GPIO_E13,  
  96.  GPIO_E14,  
  97.  GPIO_E15,  
  98.  GPIO_E16,  
  99.  GPIO_E17,  
  100.  GPIO_E18,  
  101.  GPIO_E19,  
  102.  GPIO_E20,  
  103.  GPIO_E21,  
  104.  GPIO_E22,  
  105.  GPIO_E23,  
  106.  GPIO_E24,  
  107.  GPIO_E25,  
  108.  GPIO_E26,  
  109.  GPIO_E27,  
  110.  GPIO_E28,  
  111.  GPIO_E29,  
  112.  GPIO_E30,  
  113.  GPIO_E31,  
  114.    
  115.  GPIO_F00,  
  116.  GPIO_F01,  
  117.  GPIO_F02,  
  118.  GPIO_F03,  
  119.  GPIO_F04,  
  120.  GPIO_F05,  
  121.  GPIO_F06,  
  122.  GPIO_F07,  
  123.  GPIO_F08,  
  124.  GPIO_F09,  
  125.  GPIO_F10,  
  126.  GPIO_F11,  
  127.  GPIO_F12,  
  128.  GPIO_F13,  
  129.  GPIO_F14,  
  130.  GPIO_F15,  
  131.  GPIO_F16,  
  132.  GPIO_F17,  
  133.  GPIO_F18,  
  134.  GPIO_F19,  
  135.  GPIO_F20,  
  136.  GPIO_F21,  
  137.  GPIO_F22,  
  138.  GPIO_F23,  
  139.  GPIO_F24,  
  140.  GPIO_F25,  
  141.  GPIO_F26,  
  142.  GPIO_F27,  
  143.  GPIO_F28,  
  144.  GPIO_F29, /* Only used as input mode */  
  145.  GPIO_F30, /* Only used as input mode */  
  146.  GPIO_F31 /* Only used as input mode */  
  147. };  
  148.   
  149. //GPIO的模式  
  150. enum GPIODirection  
  151. {  
  152.  GPIO_DIRCT_INPUT = 0,  
  153.  GPIO_DIRCT_OUTPUT = 1,  
  154.  GPIO_DIRCT_UNKNOW = 3  
  155. };  
  156.   
  157. //GPIO的输入数据  
  158. enum GPIOInputData  
  159. {   
  160.  GPIO_INPUT_LOW = 0,  
  161.  GPIO_INPUT_HIGH = 1,  
  162.  GPIO_INPUT_UNKNOW = 3,  
  163. };  
  164.   
  165. struct GPIOCtrlData  
  166. {  
  167.  enum GPIOPin pin;  
  168.  enum GPIODirection drct;  
  169. };  
  170.   
  171.    

 

 

    我们先回头,看看IOControl的所调用的GPIO_SetFuncGPIO函数:

[cpp]  view plain copy
  1. BOOL GPIO_SetFuncGPIO(GPIOPin gpioPin)  
  2. {  
  3.  switch(gpioPin)  
  4.  {  
  5.   case GPIO_A00:           
  6.   case GPIO_A01:   
  7.    SET_FUNC_AS_GPIO_A00_TO_A01();              
  8.    break;                     
  9.   case GPIO_A02:        
  10.    SET_FUNC_AS_GPIO_A02();         
  11.    break;                     
  12.   case GPIO_A03:  
  13.    SET_FUNC_AS_GPIO_A03();               
  14.    break;                     
  15.   case GPIO_A04:   
  16.    SET_FUNC_AS_GPIO_A04();              
  17.    break;                     
  18.   case GPIO_A05:  
  19.    SET_FUNC_AS_GPIO_A05();               
  20.    break;                     
  21.   case GPIO_A06:    
  22.    SET_FUNC_AS_GPIO_A06();             
  23.    break;                     
  24.   case GPIO_A07:     
  25.    SET_FUNC_AS_GPIO_A07();            
  26.    break;                                           
  27.   case GPIO_A08:   
  28.    SET_FUNC_AS_GPIO_A08();    
  29.    break;                    
  30.   case GPIO_A09:    
  31.    SET_FUNC_AS_GPIO_A09();    
  32.    break;                    
  33.   case GPIO_A10:    
  34.    SET_FUNC_AS_GPIO_A10();    
  35.    break;                    
  36.   case GPIO_A11:   
  37.    SET_FUNC_AS_GPIO_A11();    
  38.    break;                    
  39.   case GPIO_A12:       
  40.    SET_FUNC_AS_GPIO_A12();    
  41.    break;                   
  42.   case GPIO_B00:      
  43.    SET_FUNC_AS_GPIO_B00();          
  44.    break;                    
  45.   case GPIO_B01:            
  46.    SET_FUNC_AS_GPIO_B01();    
  47.    break;                    
  48.   case GPIO_B02:       
  49.    SET_FUNC_AS_GPIO_B02();         
  50.    break;                    
  51.   case GPIO_B03:          
  52.    SET_FUNC_AS_GPIO_B03();      
  53.    break;                    
  54.   case GPIO_B04:           
  55.    SET_FUNC_AS_GPIO_B04();     
  56.    break;                    
  57.   case GPIO_B05:          
  58.    SET_FUNC_AS_GPIO_B05();      
  59.    break;                    
  60.   case GPIO_B06:          
  61.    SET_FUNC_AS_GPIO_B06();      
  62.    break;                    
  63.   case GPIO_B07:         
  64.    SET_FUNC_AS_GPIO_B07();       
  65.    break;                    
  66.   case GPIO_B08:      
  67.     SET_FUNC_AS_GPIO_B08();                                  
  68.    break;                                            
  69.   case GPIO_B09:     
  70.    SET_FUNC_AS_GPIO_B09();                                                         
  71.    break;                                            
  72.   case GPIO_B10:           
  73.    SET_FUNC_AS_GPIO_B10();                             
  74.    break;                                                                  
  75.   case GPIO_B11:       
  76.    SET_FUNC_AS_GPIO_B11();                                 
  77.    break;                                            
  78.   case GPIO_B12:    
  79.    SET_FUNC_AS_GPIO_B12();                                                          
  80.    break;                                            
  81.   case GPIO_B13:         
  82.    SET_FUNC_AS_GPIO_B13();                               
  83.    break;                                                                  
  84.   case GPIO_B14:              
  85.    SET_FUNC_AS_GPIO_B14();                         
  86.    break;                                            
  87.   case GPIO_B15:        
  88.    SET_FUNC_AS_GPIO_B15();                                
  89.    break;                                           
  90.   case GPIO_C00:                                       
  91.   case GPIO_C01:                                         
  92.   case GPIO_C02:                                    
  93.   case GPIO_C03:                                    
  94.   case GPIO_C04:                                    
  95.   case GPIO_C05:                                    
  96.   case GPIO_C06:                                    
  97.   case GPIO_C07:     
  98.    SET_FUNC_AS_GPIO_C00_TO_C07();                              
  99.    break;                                       
  100.   case GPIO_C08:                                    
  101.   case GPIO_C09:                                        
  102.   case GPIO_C10:                                        
  103.   case GPIO_C11:                                       
  104.   case GPIO_C12:                                        
  105.   case GPIO_C13:                                       
  106.   case GPIO_C14:                                        
  107.   case GPIO_C15:             
  108.    SET_FUNC_AS_GPIO_C08_TO_C15();                           
  109.    break;                                            
  110.   case GPIO_C16:                                     
  111.   case GPIO_C17:     
  112.    SET_FUNC_AS_GPIO_C16_TO_C17();                                    
  113.    break;                                            
  114.   case GPIO_C18:                                        
  115.   case GPIO_C19:   
  116.    SET_FUNC_AS_GPIO_C18_TO_C19();                                     
  117.    break;                                            
  118.   case GPIO_C20:   
  119.    SET_FUNC_AS_GPIO_C20();                                     
  120.    break;                                            
  121.   case GPIO_C21:    
  122.    SET_FUNC_AS_GPIO_C21();                                    
  123.    break;                                            
  124.   case GPIO_C22:  
  125.    SET_FUNC_AS_GPIO_C22();                                      
  126.    break;                                            
  127.   case GPIO_C23:  
  128.    SET_FUNC_AS_GPIO_C23();                                      
  129.    break;                                            
  130.   case GPIO_C24:  
  131.    SET_FUNC_AS_GPIO_C24();                                      
  132.    break;                                            
  133.   case GPIO_C25:  
  134.    SET_FUNC_AS_GPIO_C25();                                      
  135.    break;                                                                  
  136.   case GPIO_C26:  
  137.    SET_FUNC_AS_GPIO_C26();               
  138.    break;                               
  139.   case GPIO_C27:  
  140.    SET_FUNC_AS_GPIO_C27();               
  141.    break;                               
  142.   case GPIO_C28:  
  143.    SET_FUNC_AS_GPIO_C28();               
  144.    break;                               
  145.   case GPIO_C29:  
  146.    SET_FUNC_AS_GPIO_C29();               
  147.    break;                               
  148.   case GPIO_C30:  
  149.    SET_FUNC_AS_GPIO_C30();               
  150.    break;                               
  151.   case GPIO_C31:  
  152.    SET_FUNC_AS_GPIO_C31();               
  153.    break;                              
  154.   case GPIO_D00:   
  155.    SET_FUNC_AS_GPIO_D00();                        
  156.    break;                               
  157.   case GPIO_D01:   
  158.    SET_FUNC_AS_GPIO_D01();                        
  159.    break;                               
  160.   case GPIO_D02:    
  161.    SET_FUNC_AS_GPIO_D02();                       
  162.    break;                               
  163.   case GPIO_D03:     
  164.    SET_FUNC_AS_GPIO_D03();                      
  165.    break;                               
  166.   case GPIO_D04:  
  167.    SET_FUNC_AS_GPIO_D04();                         
  168.    break;                               
  169.   case GPIO_D05:      
  170.    SET_FUNC_AS_GPIO_D05();                     
  171.    break;                               
  172.   case GPIO_D06:  
  173.    SET_FUNC_AS_GPIO_D06();                         
  174.    break;                               
  175.   case GPIO_D07:  
  176.    SET_FUNC_AS_GPIO_D07();                         
  177.    break;                               
  178.   case GPIO_D08:  
  179.    SET_FUNC_AS_GPIO_D08();                         
  180.    break;                               
  181.   case GPIO_D09:    
  182.    SET_FUNC_AS_GPIO_D09();                       
  183.    break;                               
  184.   case GPIO_D10:   
  185.    SET_FUNC_AS_GPIO_D10();                                                 
  186.    break;                                                        
  187.   case GPIO_D11:     
  188.    SET_FUNC_AS_GPIO_D11();                                                                     
  189.    break;                                                        
  190.   case GPIO_D12:   
  191.    SET_FUNC_AS_GPIO_D12();                                                 
  192.    break;                                                                             
  193.   case GPIO_E00:     
  194.    SET_FUNC_AS_GPIO_E00();                                               
  195.    break;                                                        
  196.   case GPIO_E01:    
  197.    SET_FUNC_AS_GPIO_E01();                                                                      
  198.    break;                                                        
  199.   case GPIO_E02:  
  200.    SET_FUNC_AS_GPIO_E02();                                                  
  201.    break;                                                                              
  202.   case GPIO_E03:   
  203.    SET_FUNC_AS_GPIO_E03();                                                 
  204.    break;                                                        
  205.   case GPIO_E04:     
  206.    SET_FUNC_AS_GPIO_E04();                                                                     
  207.    break;                                                        
  208.   case GPIO_E05:  
  209.    SET_FUNC_AS_GPIO_E05();                                                  
  210.    break;                                                        
  211.   case GPIO_E06:   
  212.    SET_FUNC_AS_GPIO_E06();                                                                       
  213.    break;                                            
  214.   case GPIO_E07:      
  215.    SET_FUNC_AS_GPIO_E07();                                  
  216.    break;                                            
  217.   case GPIO_E08:       
  218.    SET_FUNC_AS_GPIO_E08();                                 
  219.    break;                                            
  220.   case GPIO_E09:   
  221.    SET_FUNC_AS_GPIO_E09();                                      
  222.    break;                                            
  223.   case GPIO_E10:    
  224.    SET_FUNC_AS_GPIO_E10();                                    
  225.    break;                                            
  226.   case GPIO_E11:  
  227.    SET_FUNC_AS_GPIO_E11();                                      
  228.    break;                                            
  229.   case GPIO_E12:  
  230.    SET_FUNC_AS_GPIO_E12();                                      
  231.    break;                                            
  232.   case GPIO_E13:      
  233.    SET_FUNC_AS_GPIO_E13();                                  
  234.    break;                                            
  235.   case GPIO_E14:   
  236.    SET_FUNC_AS_GPIO_E14();                                                 
  237.    break;                                                        
  238.   case GPIO_E15:      
  239.    SET_FUNC_AS_GPIO_E15();                                              
  240.    break;                                                        
  241.   case GPIO_E16:    
  242.    SET_FUNC_AS_GPIO_E16();                                                
  243.    break;                                                        
  244.   case GPIO_E17:  
  245.    SET_FUNC_AS_GPIO_E17();                                                  
  246.    break;                                                        
  247.   case GPIO_E18:  
  248.    SET_FUNC_AS_GPIO_E18();                                                  
  249.    break;                                                       
  250.   case GPIO_E19:    
  251.    SET_FUNC_AS_GPIO_E19();                                                
  252.    break;                                                        
  253.   case GPIO_E20:   
  254.    SET_FUNC_AS_GPIO_E20();                                                 
  255.    break;                                                        
  256.   case GPIO_E21:    
  257.    SET_FUNC_AS_GPIO_E21();                                                
  258.    break;                                                        
  259.   case GPIO_E22:   
  260.    SET_FUNC_AS_GPIO_E22();                                                 
  261.    break;                                                        
  262.   case GPIO_E23:        
  263.    SET_FUNC_AS_GPIO_E23();                                            
  264.    break;                                                        
  265.   case GPIO_E24:  
  266.    SET_FUNC_AS_GPIO_E24();                                                  
  267.    break;                                                        
  268.   case GPIO_E25:  
  269.    SET_FUNC_AS_GPIO_E25();                                                  
  270.    break;                                                        
  271.   case GPIO_E26:  
  272.    SET_FUNC_AS_GPIO_E26();                                                  
  273.    break;                                                        
  274.   case GPIO_E27:  
  275.    SET_FUNC_AS_GPIO_E27();                                                  
  276.    break;                                                        
  277.   case GPIO_E28:  
  278.    SET_FUNC_AS_GPIO_E28();                                                  
  279.    break;                                                        
  280.   case GPIO_E29:  
  281.    SET_FUNC_AS_GPIO_E29();                                                  
  282.    break;                                                        
  283.   case GPIO_E30:  
  284.    SET_FUNC_AS_GPIO_E30();                                                                        
  285.    break;                                          
  286.   case GPIO_E31:  
  287.    SET_FUNC_AS_GPIO_E31();                                    
  288.    break;                                         
  289.   case GPIO_F00:   
  290.    SET_FUNC_AS_GPIO_F00();                                   
  291.    break;                                          
  292.   case GPIO_F01:   
  293.    SET_FUNC_AS_GPIO_F01();                                   
  294.    break;                                          
  295.   case GPIO_F02:     
  296.    SET_FUNC_AS_GPIO_F02();                                 
  297.    break;                                          
  298.   case GPIO_F03:    
  299.    SET_FUNC_AS_GPIO_F03();                                       
  300.    break;                                          
  301.   case GPIO_F04:         
  302.    SET_FUNC_AS_GPIO_F04();                               
  303.    break;                                          
  304.   case GPIO_F05:   
  305.    SET_FUNC_AS_GPIO_F05();                                     
  306.    break;                                  
  307.   case GPIO_F06:   
  308.    SET_FUNC_AS_GPIO_F06();                              
  309.    break;                                  
  310.   case GPIO_F07:      
  311.    SET_FUNC_AS_GPIO_F07();                                          
  312.    break;                                                                      
  313.   case GPIO_F08:                                          
  314.   case GPIO_F09:                                           
  315.   case GPIO_F10:                                     
  316.   case GPIO_F11:  
  317.    SET_FUNC_AS_GPIO_F08_TO_F11();                                     
  318.    break;                                              
  319.   case GPIO_F12:                                         
  320.   case GPIO_F13:                                         
  321.   case GPIO_F14:                                        
  322.   case GPIO_F15:  
  323.    SET_FUNC_AS_GPIO_F12_TO_F15();                                          
  324.    break;                                                
  325.   case GPIO_F16:                                 
  326.   case GPIO_F17:  
  327.    SET_FUNC_AS_GPIO_F16_TO_F17();                                             
  328.    break;                                               
  329.   case GPIO_F18:                                   
  330.   case GPIO_F19:                              
  331.   case GPIO_F21:                                         
  332.   case GPIO_F22:  
  333.   case GPIO_F23:  
  334.    SET_FUNC_AS_GPIO_F18_TO_F19_F21_TO_F23();   
  335.    break;  
  336.   case GPIO_F20:  
  337.    SET_FUNC_AS_GPIO_F20();                                          
  338.    break;       
  339.   case GPIO_F24:  
  340.    SET_FUNC_AS_GPIO_F24();   
  341.    break;  
  342.   case GPIO_F25:  
  343.    SET_FUNC_AS_GPIO_F25();   
  344.    break;  
  345.   case GPIO_F26:   
  346.    SET_FUNC_AS_GPIO_F26();  
  347.    break;  
  348.   case GPIO_F27:   
  349.    SET_FUNC_AS_GPIO_F27();  
  350.    break;  
  351.   case GPIO_F28:   
  352.    SET_FUNC_AS_GPIO_F28();  
  353.    break;  
  354.   case GPIO_F29:  
  355.   case GPIO_F30:  
  356.   case GPIO_F31:   
  357.    SET_FUNC_AS_GPIO_F29_TO_F31();  
  358.    break;  
  359.  }  
  360.    
  361.  return TRUE;  
  362. }  
  363.   
  364.    

 

    不知道大家看了,是不是觉得有点恐怖,一大版的case。但其实这也没办法,因为这些GPIO口的功能设置,每个之间基本上不存在相似性,所以只能通过case这种土办法。

 

  虽然在这函数中,我们看到了函数的调用,但其实际上却是一堆宏定义而已:
 

[cpp]  view plain copy
  1. #define SET_FUNC_AS_GPIO_A00_TO_A01()        (BITCSET(HwPORTCFG11,HwPORTCFG11_GPIOA0(0xFUL),HwPORTCFG11_GPIOA0(0)))  
  2.  #define SET_FUNC_AS_GPIO_A02()           (BITCSET(HwPORTCFG4,HwPORTCFG4_GPIOA2(0xFUL),HwPORTCFG4_GPIOA2(0)))  
  3.  #define SET_FUNC_AS_GPIO_A03()           (BITCSET(HwPORTCFG4,HwPORTCFG4_GPIOA3(0xFUL),HwPORTCFG4_GPIOA3(0)))  
  4.  #define SET_FUNC_AS_GPIO_A04()           (BITCSET(HwPORTCFG4,HwPORTCFG4_GPIOA4(0xFUL),HwPORTCFG4_GPIOA4(0)))  
  5.  #define SET_FUNC_AS_GPIO_A05()           (BITCSET(HwPORTCFG4,HwPORTCFG4_GPIOA5(0xFUL),HwPORTCFG4_GPIOA5(0)))  
  6.  #define SET_FUNC_AS_GPIO_A06()           (BITCSET(HwPORTCFG7,HwPORTCFG7_GPIOA6(0xFUL),HwPORTCFG7_GPIOA6(0)))  
  7.  #define SET_FUNC_AS_GPIO_A07()           (BITCSET(HwPORTCFG7,HwPORTCFG7_GPIOA7(0xFUL),HwPORTCFG7_GPIOA7(0)))  
  8.  #define SET_FUNC_AS_GPIO_A08()           (BITCSET(HwPORTCFG7,HwPORTCFG7_GPIOA8(0xFUL),HwPORTCFG7_GPIOA8(0)))  
  9.  #define SET_FUNC_AS_GPIO_A09()           (BITCSET(HwPORTCFG8,HwPORTCFG8_GPIOA9(0xFUL),HwPORTCFG8_GPIOA9(0)))  
  10.  #define SET_FUNC_AS_GPIO_A10()           (BITCSET(HwPORTCFG8,HwPORTCFG8_GPIOA10(0xFUL),HwPORTCFG8_GPIOA10(0)))  
  11.  #define SET_FUNC_AS_GPIO_A11()           (BITCSET(HwPORTCFG8,HwPORTCFG8_GPIOA11(0xFUL),HwPORTCFG8_GPIOA11(0)))  
  12.  #define SET_FUNC_AS_GPIO_A12()           (BITCSET(HwPORTCFG8,HwPORTCFG8_GPIOA12(0xFUL),HwPORTCFG8_GPIOA12(0)))  
  13.                                                   
  14.  #define SET_FUNC_AS_GPIO_B00()           (BITCSET(HwPORTCFG5,HwPORTCFG5_GPIOB0(0xFUL),HwPORTCFG5_GPIOB0(0)))  
  15.  #define SET_FUNC_AS_GPIO_B01()           (BITCSET(HwPORTCFG5,HwPORTCFG5_GPIOB1(0xFUL),HwPORTCFG5_GPIOB1(0)))  
  16.  #define SET_FUNC_AS_GPIO_B02()           (BITCSET(HwPORTCFG5,HwPORTCFG5_GPIOB2(0xFUL),HwPORTCFG5_GPIOB2(0)))  
  17.  #define SET_FUNC_AS_GPIO_B03()           (BITCSET(HwPORTCFG5,HwPORTCFG5_GPIOB3(0xFUL),HwPORTCFG5_GPIOB3(0)))  
  18.  #define SET_FUNC_AS_GPIO_B04()           (BITCSET(HwPORTCFG5,HwPORTCFG5_GPIOB4(0xFUL),HwPORTCFG5_GPIOB4(0)))  
  19.  #define SET_FUNC_AS_GPIO_B05()           (BITCSET(HwPORTCFG5,HwPORTCFG5_GPIOB5(0xFUL),HwPORTCFG5_GPIOB5(0)))  
  20.  #define SET_FUNC_AS_GPIO_B06()           (BITCSET(HwPORTCFG5,HwPORTCFG5_GPIOB6(0xFUL),HwPORTCFG5_GPIOB6(0)))  
  21.  #define SET_FUNC_AS_GPIO_B07()           (BITCSET(HwPORTCFG6,HwPORTCFG6_GPIOB7(0xFUL),HwPORTCFG6_GPIOB7(0)))  
  22.  #define SET_FUNC_AS_GPIO_B08()           (BITCSET(HwPORTCFG6,HwPORTCFG6_GPIOB8(0xFUL),HwPORTCFG6_GPIOB8(0)))  
  23.  #define SET_FUNC_AS_GPIO_B09()           (BITCSET(HwPORTCFG6,HwPORTCFG6_GPIOB9(0xFUL),HwPORTCFG6_GPIOB9(0)))  
  24.  #define SET_FUNC_AS_GPIO_B10()           (BITCSET(HwPORTCFG6,HwPORTCFG6_GPIOB10(0xFUL),HwPORTCFG6_GPIOB10(0)))  
  25.  #define SET_FUNC_AS_GPIO_B11()           (BITCSET(HwPORTCFG6,HwPORTCFG6_GPIOB11(0xFUL),HwPORTCFG6_GPIOB11(0)))  
  26.  #define SET_FUNC_AS_GPIO_B12()           (BITCSET(HwPORTCFG6,HwPORTCFG6_GPIOB12(0xFUL),HwPORTCFG6_GPIOB12(0)))  
  27.  #define SET_FUNC_AS_GPIO_B13()           (BITCSET(HwPORTCFG6,HwPORTCFG6_GPIOB13(0xFUL),HwPORTCFG6_GPIOB13(0)))  
  28.  #define SET_FUNC_AS_GPIO_B14()           (BITCSET(HwPORTCFG6,HwPORTCFG6_GPIOB14(0xFUL),HwPORTCFG6_GPIOB14(0)))  
  29.  #define SET_FUNC_AS_GPIO_B15()           (BITCSET(HwPORTCFG7,HwPORTCFG7_GPIOB15(0xFUL),HwPORTCFG7_GPIOB15(0)))  
  30.                                                   
  31.  #define SET_FUNC_AS_GPIO_C00_TO_C07()          (BITCSET(HwPORTCFG0,HwPORTCFG0_LCD8(0xFUL),HwPORTCFG0_LCD8(2)))  
  32.  #define SET_FUNC_AS_GPIO_C08_TO_C15()        (BITCSET(HwPORTCFG0,HwPORTCFG0_LCD16(0xFUL),HwPORTCFG0_LCD16(2)))  
  33.  #define SET_FUNC_AS_GPIO_C16_TO_C17()        (BITCSET(HwPORTCFG0,HwPORTCFG0_LCD18(0xFUL),HwPORTCFG0_LCD18(2)))  
  34.  #define SET_FUNC_AS_GPIO_C18_TO_C19()        (BITCSET(HwPORTCFG0,HwPORTCFG0_LPD19(0xFUL),HwPORTCFG0_LPD19(2)))  
  35.  #define SET_FUNC_AS_GPIO_C20()           (BITCSET(HwPORTCFG0,HwPORTCFG0_LPD20(0xFUL),HwPORTCFG0_LPD20(2)))  
  36.  #define SET_FUNC_AS_GPIO_C21()           (BITCSET(HwPORTCFG0,HwPORTCFG0_LPD21(0xFUL),HwPORTCFG0_LPD21(2)))  
  37.  #define SET_FUNC_AS_GPIO_C22()           (BITCSET(HwPORTCFG0,HwPORTCFG0_LPD22(0xFUL),HwPORTCFG0_LPD22(2)))  
  38.  #define SET_FUNC_AS_GPIO_C23()           (BITCSET(HwPORTCFG0,HwPORTCFG0_LPD23(0xFUL),HwPORTCFG0_LPD23(2)))  
  39.  #define SET_FUNC_AS_GPIO_C24()           (BITCSET(HwPORTCFG4,HwPORTCFG4_CSN_CS0(0xFUL),HwPORTCFG4_CSN_CS0(1)))  
  40.  #define SET_FUNC_AS_GPIO_C25()           (BITCSET(HwPORTCFG1,HwPORTCFG1_LDE(0xFUL),HwPORTCFG1_LDE(2)))  
  41.  #define SET_FUNC_AS_GPIO_C26()           (BITCSET(HwPORTCFG1,HwPORTCFG1_LCK(0xFUL),HwPORTCFG1_LCK(2)))  
  42.  #define SET_FUNC_AS_GPIO_C27()           (BITCSET(HwPORTCFG1,HwPORTCFG1_LHS(0xFUL),HwPORTCFG1_LHS(2)))  
  43.  #define SET_FUNC_AS_GPIO_C28()           (BITCSET(HwPORTCFG1,HwPORTCFG1_LVS(0xFUL),HwPORTCFG1_LVS(2)))  
  44.  #define SET_FUNC_AS_GPIO_C29()           (BITCSET(HwPORTCFG1,HwPORTCFG1_LCS(0xFUL),HwPORTCFG1_LCS(2)))  
  45.  #define SET_FUNC_AS_GPIO_C30()           (BITCSET(HwPORTCFG1,HwPORTCFG1_GPIOC30(0xFUL),HwPORTCFG1_GPIOC30(2)))  
  46.  #define SET_FUNC_AS_GPIO_C31()           (BITCSET(HwPORTCFG1,HwPORTCFG1_GPIOC31(0xFUL),HwPORTCFG1_GPIOC31(2)))  
  47.                                                   
  48.  #define SET_FUNC_AS_GPIO_D00()           (BITCSET(HwPORTCFG11,HwPORTCFG11_BCLK(0xFUL),HwPORTCFG11_BCLK(1)))  
  49.  #define SET_FUNC_AS_GPIO_D01()           (BITCSET(HwPORTCFG11,HwPORTCFG11_LRCK(0xFUL),HwPORTCFG11_LRCK(1)))  
  50.  #define SET_FUNC_AS_GPIO_D02()           (BITCSET(HwPORTCFG11,HwPORTCFG11_MCLK(0xFUL),HwPORTCFG11_MCLK(1)))  
  51.  #define SET_FUNC_AS_GPIO_D03()           (BITCSET(HwPORTCFG11,HwPORTCFG11_DAO(0xFUL),HwPORTCFG11_DAO(1)))  
  52.  #define SET_FUNC_AS_GPIO_D04()           (BITCSET(HwPORTCFG11,HwPORTCFG11_DAI(0xFUL),HwPORTCFG11_DAI(1)))  
  53.  #define SET_FUNC_AS_GPIO_D05()           (BITCSET(HwPORTCFG3,HwPORTCFG3_SCMD0(0xFUL),HwPORTCFG3_SCMD0(1)))  
  54.  #define SET_FUNC_AS_GPIO_D06()           (BITCSET(HwPORTCFG4,HwPORTCFG4_SCLK0(0xFUL),HwPORTCFG4_SCLK0(1)))  
  55.  #define SET_FUNC_AS_GPIO_D07()           (BITCSET(HwPORTCFG4,HwPORTCFG4_SDI0(0xFUL),HwPORTCFG4_SDI0(1)))  
  56.  #define SET_FUNC_AS_GPIO_D08()           (BITCSET(HwPORTCFG4,HwPORTCFG4_SDO0(0xFUL),HwPORTCFG4_SDO0(1)))  
  57.  #define SET_FUNC_AS_GPIO_D09()           (BITCSET(HwPORTCFG7,HwPORTCFG7_SCMD1(0xFUL),HwPORTCFG7_SCMD1(1)))  
  58.  #define SET_FUNC_AS_GPIO_D10()           (BITCSET(HwPORTCFG7,HwPORTCFG7_SCLK1(0xFUL),HwPORTCFG7_SCLK1(1)))  
  59.  #define SET_FUNC_AS_GPIO_D11()           (BITCSET(HwPORTCFG7,HwPORTCFG7_SDI1(0xFUL),HwPORTCFG7_SDI1(1)))  
  60.  #define SET_FUNC_AS_GPIO_D12()           (BITCSET(HwPORTCFG7,HwPORTCFG7_SDO1(0xFUL),HwPORTCFG7_SDO1(1)))  
  61.                                                   
  62.  #define SET_FUNC_AS_GPIO_E00()           (BITCSET(HwPORTCFG9,HwPORTCFG9_UTXD0(0xFUL),HwPORTCFG9_UTXD0(1)))  
  63.  #define SET_FUNC_AS_GPIO_E01()           (BITCSET(HwPORTCFG9,HwPORTCFG9_URXD0(0xFUL),HwPORTCFG9_URXD0(1)))  
  64.  #define SET_FUNC_AS_GPIO_E02()           (BITCSET(HwPORTCFG9,HwPORTCFG9_UCTS0(0xFUL),HwPORTCFG9_UCTS0(1)))  
  65.  #define SET_FUNC_AS_GPIO_E03()           (BITCSET(HwPORTCFG9,HwPORTCFG9_URTS0(0xFUL),HwPORTCFG9_URTS0(1)))  
  66.  #define SET_FUNC_AS_GPIO_E04()           (BITCSET(HwPORTCFG10,HwPORTCFG10_UTXD1(0xFUL),HwPORTCFG10_UTXD1(1)))  
  67.  #define SET_FUNC_AS_GPIO_E05()           (BITCSET(HwPORTCFG10,HwPORTCFG10_URXD1(0xFUL),HwPORTCFG10_URXD1(1)))  
  68.  #define SET_FUNC_AS_GPIO_E06()           (BITCSET(HwPORTCFG10,HwPORTCFG10_UCTS1(0xFUL),HwPORTCFG10_UCTS1(1)))  
  69.  #define SET_FUNC_AS_GPIO_E07()           (BITCSET(HwPORTCFG10,HwPORTCFG10_URTS1(0xFUL),HwPORTCFG10_URTS1(1)))  
  70.  #define SET_FUNC_AS_GPIO_E08()           (BITCSET(HwPORTCFG10,HwPORTCFG10_UTXD2(0xFUL),HwPORTCFG10_UTXD2(1)))  
  71.  #define SET_FUNC_AS_GPIO_E09()           (BITCSET(HwPORTCFG10,HwPORTCFG10_URXD2(0xFUL),HwPORTCFG10_URXD2(1)))  
  72.  #define SET_FUNC_AS_GPIO_E10()           (BITCSET(HwPORTCFG10,HwPORTCFG10_UTXD3(0xFUL),HwPORTCFG10_UTXD3(1)))  
  73.  #define SET_FUNC_AS_GPIO_E11()           (BITCSET(HwPORTCFG10,HwPORTCFG10_URXD3(0xFUL),HwPORTCFG10_URXD3(1)))  
  74.  #define SET_FUNC_AS_GPIO_E12()           (BITCSET(HwPORTCFG12,HwPORTCFG12_CPD0(0xFUL),HwPORTCFG12_CPD0(1)))  
  75.  #define SET_FUNC_AS_GPIO_E13()           (BITCSET(HwPORTCFG12,HwPORTCFG12_CPD1(0xFUL),HwPORTCFG12_CPD1(1)))  
  76.  #define SET_FUNC_AS_GPIO_E14()           (BITCSET(HwPORTCFG12,HwPORTCFG12_CPD2(0xFUL),HwPORTCFG12_CPD2(1)))  
  77.  #define SET_FUNC_AS_GPIO_E15()           (BITCSET(HwPORTCFG12,HwPORTCFG12_CPD3(0xFUL),HwPORTCFG12_CPD3(1)))  
  78.  #define SET_FUNC_AS_GPIO_E16()           (BITCSET(HwPORTCFG12,HwPORTCFG12_CPD4(0xFUL),HwPORTCFG12_CPD4(1)))  
  79.  #define SET_FUNC_AS_GPIO_E17()           (BITCSET(HwPORTCFG13,HwPORTCFG13_CPD5(0xFUL),HwPORTCFG13_CPD5(1)))  
  80.  #define SET_FUNC_AS_GPIO_E18()                 (BITCSET(HwPORTCFG13,HwPORTCFG13_CPD6(0xFUL),HwPORTCFG13_CPD6(1)))  
  81.  #define SET_FUNC_AS_GPIO_E19()                 (BITCSET(HwPORTCFG13,HwPORTCFG13_CPD7(0xFUL),HwPORTCFG13_CPD7(1)))  
  82.  #define SET_FUNC_AS_GPIO_E20()           (BITCSET(HwPORTCFG11,HwPORTCFG11_CCKI(0xFUL),HwPORTCFG11_CCKI(1)))  
  83.  #define SET_FUNC_AS_GPIO_E21()           (BITCSET(HwPORTCFG12,HwPORTCFG12_CVS(0xFUL),HwPORTCFG12_CVS(1)))  
  84.  #define SET_FUNC_AS_GPIO_E22()           (BITCSET(HwPORTCFG12,HwPORTCFG12_CHS(0xFUL),HwPORTCFG12_CHS(1)))  
  85.  #define SET_FUNC_AS_GPIO_E23()           (BITCSET(HwPORTCFG12,HwPORTCFG12_CCKO(0xFUL),HwPORTCFG12_CCKO(1)))  
  86.  #define SET_FUNC_AS_GPIO_E24()           (BITCSET(HwPORTCFG8,HwPORTCFG8_AIN0(0xFUL),HwPORTCFG8_AIN0(1)))  
  87.  #define SET_FUNC_AS_GPIO_E25()           (BITCSET(HwPORTCFG8,HwPORTCFG8_AIN1(0xFUL),HwPORTCFG8_AIN1(1)))  
  88.  #define SET_FUNC_AS_GPIO_E26()           (BITCSET(HwPORTCFG8,HwPORTCFG8_AIN2(0xFUL),HwPORTCFG8_AIN2(1)))  
  89.  #define SET_FUNC_AS_GPIO_E27()           (BITCSET(HwPORTCFG8,HwPORTCFG8_AIN3(0xFUL),HwPORTCFG8_AIN3(1)))  
  90.  #define SET_FUNC_AS_GPIO_E28()           (BITCSET(HwPORTCFG9,HwPORTCFG9_AIN4(0xFUL),HwPORTCFG9_AIN4(1)))  
  91.  #define SET_FUNC_AS_GPIO_E29()           (BITCSET(HwPORTCFG9,HwPORTCFG9_AIN5(0xFUL),HwPORTCFG9_AIN5(1)))  
  92.  #define SET_FUNC_AS_GPIO_E30()           (BITCSET(HwPORTCFG9,HwPORTCFG9_AIN6(0xFUL),HwPORTCFG9_AIN6(1)))  
  93.  #define SET_FUNC_AS_GPIO_E31()           (BITCSET(HwPORTCFG9,HwPORTCFG9_AIN7(0xFUL),HwPORTCFG9_AIN7(1)))  
  94.                                                   
  95.  #define SET_FUNC_AS_GPIO_F00()           (BITCSET(HwPORTCFG3,HwPORTCFG3_HPXD0(0xFUL),HwPORTCFG3_HPXD0(1)))  
  96.  #define SET_FUNC_AS_GPIO_F01()           (BITCSET(HwPORTCFG3,HwPORTCFG3_HPXD1(0xFUL),HwPORTCFG3_HPXD1(1)))  
  97.  #define SET_FUNC_AS_GPIO_F02()           (BITCSET(HwPORTCFG3,HwPORTCFG3_HPXD2(0xFUL),HwPORTCFG3_HPXD2(1)))  
  98.  #define SET_FUNC_AS_GPIO_F03()           (BITCSET(HwPORTCFG3,HwPORTCFG3_HPXD3(0xFUL),HwPORTCFG3_HPXD3(1)))  
  99.  #define SET_FUNC_AS_GPIO_F04()           (BITCSET(HwPORTCFG3,HwPORTCFG3_HPXD4(0xFUL),HwPORTCFG3_HPXD4(1)))  
  100.  #define SET_FUNC_AS_GPIO_F05()           (BITCSET(HwPORTCFG3,HwPORTCFG3_HPXD5(0xFUL),HwPORTCFG3_HPXD5(1)))  
  101.  #define SET_FUNC_AS_GPIO_F06()           (BITCSET(HwPORTCFG3,HwPORTCFG3_HPXD6(0xFUL),HwPORTCFG3_HPXD6(1)))  
  102.  #define SET_FUNC_AS_GPIO_F07()           (BITCSET(HwPORTCFG2,HwPORTCFG2_HPXD7(0xFUL),HwPORTCFG2_HPXD7(1)))  
  103.  #define SET_FUNC_AS_GPIO_F08_TO_F11()        (BITCSET(HwPORTCFG2,HwPORTCFG2_HPXD11(0xFUL),HwPORTCFG2_HPXD11(1)))  
  104.  #define SET_FUNC_AS_GPIO_F12_TO_F15()        (BITCSET(HwPORTCFG2,HwPORTCFG2_HPXD15(0xFUL),HwPORTCFG2_HPXD15(1)))  
  105.  #define SET_FUNC_AS_GPIO_F16_TO_F17()        (BITCSET(HwPORTCFG2,HwPORTCFG2_HPXD17(0xFUL),HwPORTCFG2_HPXD17(1)))        
  106.  #define SET_FUNC_AS_GPIO_F18_TO_F19_F21_TO_F23()  (BITCSET(HwPORTCFG2,HwPORTCFG2_HPCTRL(0xFUL),HwPORTCFG2_HPCTRL(1)))        
  107.  #define SET_FUNC_AS_GPIO_F20()           (BITCSET(HwPORTCFG13,HwPORTCFG13_HPCSN(0xFUL),HwPORTCFG13_HPCSN(1)))  
  108.  #define SET_FUNC_AS_GPIO_F24()           (BITCSET(HwPORTCFG2,HwPORTCFG2_HPCSN_L(0xFUL),HwPORTCFG2_HPCSN_L(1)))  
  109.  #define SET_FUNC_AS_GPIO_F25()           (BITCSET(HwPORTCFG2,HwPORTCFG2_GPIOF25(0xFUL),HwPORTCFG2_GPIOF25(1)))  
  110.  #define SET_FUNC_AS_GPIO_F26()           (BITCSET(HwPORTCFG2,HwPORTCFG2_GPIOF26(0xFUL),HwPORTCFG2_GPIOF26(1)))  
  111.  #define SET_FUNC_AS_GPIO_F27()                 (BITCSET(HwPORTCFG1,HwPORTCFG1_GPIOF27(0xFUL),HwPORTCFG1_GPIOF27(1)))  
  112.  #define SET_FUNC_AS_GPIO_F28()           (BITCSET(HwPORTCFG5,HwPORTCFG5_CSN_NOR(0xFUL),HwPORTCFG5_CSN_NOR(1)))  
  113.  #define SET_FUNC_AS_GPIO_F29_TO_F31()        (BITCSET(HwPORTCFG11,HwPORTCFG11_BM(0xFUL),HwPORTCFG11_BM(1)))  


  这些宏定义实际上都只是针对于TCC7901寄存器的操作,这里不再对寄存器操作的原理做叙述,有兴趣的朋友可以查看我的另一篇文章:《应用程序中读写TCC7901的寄存器》(http://blog.csdn.net/norains/archive/2010/07/12/5729377.aspx
  
  对于别的所调用的函数,代码也并不复杂:
 

[cpp]  view plain copy
  1. BOOL GPIO_SetDirection(GPIOPin gpioPin,GPIODirection gpioDirct)  
  2. {   
  3.  volatile DWORD *pdwReg = NULL;  
  4.  DWORD dwSetBit = 0;  
  5.    
  6.  //Get the direction register and bit.  
  7.  GetDirctReg(gpioPin,&pdwReg,dwSetBit);  
  8.    
  9.  if(pdwReg == NULL)  
  10.  {  
  11.   return FALSE;  
  12.  }  
  13.    
  14.  if(gpioDirct == GPIO_DIRCT_INPUT)  
  15.  {  
  16.   BITCLR(*pdwReg,dwSetBit);  
  17.  }  
  18.  else  
  19.  {  
  20.   if(gpioDirct >= GPIO_F29 && gpioDirct <= GPIO_F31)  
  21.   {  
  22.    //It's only used for input mode  
  23.    return FALSE;  
  24.   }  
  25.     
  26.   BITSET(*pdwReg,dwSetBit);  
  27.  }  
  28.    
  29.  return TRUE;  
  30.    
  31. }  
  32.   
  33. GPIODirection GPIO_GetDirection(GPIOPin gpioPin)  
  34. {  
  35.  volatile DWORD *pdwReg = NULL;  
  36.  DWORD dwGetBit = 0;  
  37.    
  38.  //Get the direction register and bit.  
  39.  GetDirctReg(gpioPin,&pdwReg,dwGetBit);  
  40.    
  41.    
  42.  if(pdwReg == NULL)  
  43.  {  
  44.   return GPIO_DIRCT_UNKNOW;  
  45.  }  
  46.    
  47.  if((*pdwReg & dwGetBit) == 0)  
  48.  {  
  49.   return GPIO_DIRCT_INPUT;  
  50.  }  
  51.  else  
  52.  {  
  53.   return GPIO_DIRCT_OUTPUT;  
  54.  }   
  55. }  
  56.   
  57. void GetDirctReg(GPIOPin gpioPin,volatile DWORD **ppdwReg,DWORD &dwBit)  
  58. {   
  59.  if(gpioPin >= GPIO_A00 && gpioPin <= GPIO_A12)  
  60.  {  
  61.   *ppdwReg = &HwGPAEN;  
  62.   dwBit = 0x1 << (gpioPin - GPIO_A00);    
  63.  }  
  64.  else if(gpioPin >= GPIO_B00 && gpioPin <= GPIO_B15)  
  65.  {  
  66.   *ppdwReg = &HwGPBEN;  
  67.   dwBit = 0x1 << (gpioPin - GPIO_B00);   
  68.  }  
  69.  else if(gpioPin >= GPIO_C00 && gpioPin <= GPIO_C31)  
  70.  {  
  71.   *ppdwReg = &HwGPCEN;  
  72.   dwBit = 0x1 << (gpioPin - GPIO_C00);   
  73.  }  
  74.  else if(gpioPin >= GPIO_D00 && gpioPin <= GPIO_D12)  
  75.  {  
  76.   *ppdwReg = &HwGPDEN;  
  77.   dwBit = 0x1 << (gpioPin - GPIO_D00);   
  78.  }  
  79.  else if(gpioPin >= GPIO_E00 && gpioPin <= GPIO_E31)  
  80.  {  
  81.   *ppdwReg = &HwGPEEN;  
  82.   dwBit = 0x1 << (gpioPin - GPIO_E00);   
  83.  }  
  84.  else if(gpioPin >= GPIO_F00 && gpioPin <= GPIO_F31)  
  85.  {  
  86.   *ppdwReg = &HwGPFEN;  
  87.   dwBit = 0x1 << (gpioPin - GPIO_F00);   
  88.  }  
  89. }  
  90.   
  91. BOOL GPIO_SetData(GPIOPin gpioPin)  
  92. {  
  93.  if(GPIO_GetDirection(gpioPin) != GPIO_DIRCT_OUTPUT)  
  94.  {  
  95.   return FALSE;  
  96.  }  
  97.    
  98.  volatile DWORD *pdwReg = NULL;  
  99.  DWORD dwSetBit = 0;  
  100.    
  101.  //Get the direction register and bit.  
  102.  GetDataReg(gpioPin,&pdwReg,dwSetBit);  
  103.    
  104.  if(pdwReg == NULL)  
  105.  {  
  106.   return FALSE;  
  107.  }  
  108.    
  109.  //RETAILMSG(1,(TEXT("/r/nThe data register is:%d"),pdwReg));  
  110.  //RETAILMSG(1,(TEXT("/r/nBefore setting:%d"),*pdwReg));  
  111.    
  112.  BITSET(*pdwReg,dwSetBit);  
  113.    
  114.  //RETAILMSG(1,(TEXT("/r/nAfter setting:%d"),*pdwReg));  
  115.    
  116.  return TRUE;  
  117. }  
  118.   
  119. BOOL GPIO_ClearData(GPIOPin gpioPin)  
  120. {  
  121.  if(GPIO_GetDirection(gpioPin) != GPIO_DIRCT_OUTPUT)  
  122.  {  
  123.   return FALSE;  
  124.  }  
  125.    
  126.  volatile DWORD *pdwReg = NULL;  
  127.  DWORD dwSetBit = 0;  
  128.    
  129.  //Get the direction register and bit.  
  130.  GetDataReg(gpioPin,&pdwReg,dwSetBit);  
  131.    
  132.  if(pdwReg == NULL)  
  133.  {  
  134.   return FALSE;  
  135.  }  
  136.    
  137.  //RETAILMSG(1,(TEXT("/r/nThe data register is:%d"),pdwReg));  
  138.  //RETAILMSG(1,(TEXT("/r/nBefore Clearing:%d"),*pdwReg));  
  139.    
  140.  BITCLR(*pdwReg,dwSetBit);  
  141.    
  142.  //RETAILMSG(1,(TEXT("/r/nAfter Clearing:%d"),*pdwReg));  
  143.    
  144.  return TRUE;  
  145. }  
  146.   
  147. GPIOInputData GPIO_GetData(GPIOPin gpioPin)  
  148. {   
  149.  if(GPIO_GetDirection(gpioPin) != GPIO_DIRCT_INPUT)  
  150.  {  
  151.   return GPIO_INPUT_UNKNOW;  
  152.  }  
  153.    
  154.  volatile DWORD *pdwReg = NULL;  
  155.  DWORD dwSetBit = 0;  
  156.    
  157.  //Get the direction register and bit.  
  158.  GetDataReg(gpioPin,&pdwReg,dwSetBit);   
  159.  if(pdwReg == NULL)  
  160.  {  
  161.   return GPIO_INPUT_UNKNOW;  
  162.  }  
  163.    
  164.  return static_cast<GPIOInputData>((*pdwReg & dwSetBit) != 0);  
  165. }  
  166.   
  167. void GetDataReg(GPIOPin gpioPin,volatile DWORD **ppdwReg,DWORD &dwBit)  
  168. {  
  169.  if(gpioPin >= GPIO_A00 && gpioPin <= GPIO_A12)  
  170.  {  
  171.   *ppdwReg = &HwGPADAT;  
  172.   dwBit = 0x1 << (gpioPin - GPIO_A00);    
  173.  }  
  174.  else if(gpioPin >= GPIO_B00 && gpioPin <= GPIO_B15)  
  175.  {  
  176.   *ppdwReg = &HwGPBDAT;  
  177.   dwBit = 0x1 << (gpioPin - GPIO_B00);   
  178.  }  
  179.  else if(gpioPin >= GPIO_C00 && gpioPin <= GPIO_C31)  
  180.  {  
  181.   *ppdwReg = &HwGPCDAT;  
  182.   dwBit = 0x1 << (gpioPin - GPIO_C00);   
  183.  }  
  184.  else if(gpioPin >= GPIO_D00 && gpioPin <= GPIO_D12)  
  185.  {  
  186.   *ppdwReg = &HwGPDDAT;  
  187.   dwBit = 0x1 << (gpioPin - GPIO_D00);   
  188.  }  
  189.  else if(gpioPin >= GPIO_E00 && gpioPin <= GPIO_E31)  
  190.  {  
  191.   *ppdwReg = &HwGPEDAT;  
  192.   dwBit = 0x1 << (gpioPin - GPIO_E00);   
  193.  }  
  194.  else if(gpioPin >= GPIO_F00 && gpioPin <= GPIO_F31)  
  195.  {  
  196.   *ppdwReg = &HwGPFDAT;  
  197.   dwBit = 0x1 << (gpioPin - GPIO_F00);   
  198.  }  
  199. }  


  既然是驱动,那肯定是少不了注册表了:
  [HKEY_LOCAL_MACHINE/Drivers/Builtin/Pio]
      "Prefix"="PIO"
      "Dll"="gpio.dll"
      "Order"=dword:0
      "Index"=dword:1
  
  
  当我们编译好系统,将GPIO的驱动正确加载之后,我们就可以非常简单地通过CreateFile来对GPIO进行相应的操作啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值