wince6下操作IO口

时间:2022-12-31 17:38:15

作者:BB高擎天的空间

转自:http://hi.baidu.com/cahbb/item/e97b76e9f470a50b65db00d1


使用6410的开发板,从示例为基础,使用其它口IO,能做到高低电平的控制。

从看示例,到最后能简单操作一个IO口,搞了二、三周时间,从网上找资料 ,但实在是太少了,大多都是说的一样的。后来在群内认识了一个朋友 ,通过他的帮助才理解了IO口驱动的作用方法,在此谢谢他。

总的思路:自己研究这个问题很长时间了,总结了一下,要在到提供的源代码中,增加一个定义1: 比如: #define IOCTL_GPP01_OPEN       0x0400 2000(这个数是不是只要没有和其它重复,就可以随便定义的?)
2:到Led的源代码中,仿照 示例中的那个四个口,做出其应的操作代码。 
3:编译系统,重写到板子上
4:再写相应的应用程序,调用相应的命令如上面定义的 IOCTL_GPP01_OPEN ,来实现IO口的高低电平的操作

1:打开开发板的BSP内核(就是开发板带的源代码包,E:\WINCE600\PLATFORM\SMDK6410\SRC\DRIVERS\LED),找到led.cpp 和led.h文件,按照它的示例,就是按照它的套路,来进行增加相应的IO口。

比如:找到 led。h

// constants define                            //下面的数字,个人理解,只要不和程序其它数字重名重和就行,多少由自己随便定义。
#define IOCTL_LED_LED1_OPEN             0x04001060
#define IOCTL_LED_LED1_CLOSE           0x04001061
#define IOCTL_LED_LED2_OPEN             0x04001070
#define IOCTL_LED_LED2_CLOSE           0x04001071
#define IOCTL_LED_LED3_OPEN             0x04001080
#define IOCTL_LED_LED3_CLOSE           0x04001081
#define IOCTL_LED_LED4_OPEN             0x04001090
#define IOCTL_LED_LED4_CLOSE           0x04001091

//my IO control 11-11-28------------------自已增加的----
#define IOCTL_GPP_01_OPEN     0x04002000
#define IOCTL_GPP_01_CLOSE     0x04002001

#define IOCTL_GPP_08_OPEN     0x04002002
#define IOCTL_GPP_08_CLOSE     0x04002003

#define IOCTL_GPP_09_OPEN     0x04002004
#define IOCTL_GPP_09_CLOSE     0x04002005

#define IOCTL_GPP_12_OPEN     0x04002006
#define IOCTL_GPP_12_CLOSE     0x04002007

#define IOCTL_GPP_13_OPEN     0x04002008
#define IOCTL_GPP_13_CLOSE     0x04002009
// my IO control ==============================================

再到led.cpp

在这个函数中BOOL LED_IOControl(DWORD Handle,
          DWORD dwIoControlCode,
          PBYTE pInBuf,
          DWORD nInBufSize,
          PBYTE pOutBuf,
          DWORD nOutBufSize,
          PDWORD pBytesReturned) {  
 switch (dwIoControlCode) {

////my IO control  11-11-28-----------------------------------------------
  case IOCTL_GPP_01_OPEN:                                       //
  v_pIOPregs->GPPCON&=(~(0x0f<<2));                          //这个设置要看操作手册,
  v_pIOPregs->GPPCON|=0x1<<2;
  v_pIOPregs->GPPDAT|=(0x01<<1);
  OutputDebugString(L"GPP01 Close- LED IO Control\n"); 
  break;
  case IOCTL_GPP_01_CLOSE:                                       //
  v_pIOPregs->GPPCON&=(~(0x0f<<2));
  v_pIOPregs->GPPCON|=0x1<<2;
  v_pIOPregs->GPPDAT&=~(0x01<<1);
  OutputDebugString(L"GPP01 Close- LED IO Control\n"); 
  break;
  case IOCTL_GPP_08_OPEN:                                       //LED4 CLOSE
  v_pIOPregs->GPPCON&=(~(0x0f<<16));
  v_pIOPregs->GPPCON|=0x1<<16;
  v_pIOPregs->GPPDAT|=(0x01<<8);
  OutputDebugString(L"GPP08 Close- LED IO Control\n"); 
  break;
  case IOCTL_GPP_08_CLOSE:                                       //LED4 CLOSE
  v_pIOPregs->GPPCON&=(~(0x0f<<16));
  v_pIOPregs->GPPCON|=0x1<<16;
  v_pIOPregs->GPPDAT&=~(0x01<<8);
  OutputDebugString(L"GPP08 Close- LED IO Control\n"); 
  break;
  case IOCTL_GPP_09_OPEN:                                       //LED4 CLOSE
  v_pIOPregs->GPPCON&=(~(0x0f<<18));
  v_pIOPregs->GPPCON|=0x1<<18;
  v_pIOPregs->GPPDAT|=(0x01<<9);
  OutputDebugString(L"GPP09 Close- LED IO Control\n"); 
  break;
  case IOCTL_GPP_09_CLOSE:                                       //LED4 CLOSE
  v_pIOPregs->GPPCON&=(~(0x0f<<18));
  v_pIOPregs->GPPCON|=0x1<<18;
  v_pIOPregs->GPPDAT&=~(0x01<<9);
  OutputDebugString(L"GPP09 Close- LED IO Control\n"); 
  break;
//my IO control ==================================================================

上面做好以后,用clear sysant 重新编译系统,生产五个系统安装用的文件,下到开发板中。

最后,在示例的应用程序基础上,增加相应的命令来(比如 IOCTL_GPP_01_OPEN     ),操作IO的高低电平。