作者:BB高擎天的空间
转自:http://hi.baidu.com/cahbb/item/e97b76e9f470a50b65db00d1
从看示例,到最后能简单操作一个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的高低电平。