参考了LED的源代码和几篇网贴,希望对有需要的有所帮助。
以GPP8-GPP13端口为例,此6个端口在OK6410B的USERIO INTERFACE均有引出,便于验证。
愿此贴出,众困休矣。
1. 添加GPIO新流驱动项
在drivers文件夹上点击右键
选择add->New Source Subproject->WCE Dynamic-Link Library在name框中输入XXX,下一步。
选择A simple Windows Embedded CE DLL subproject
完成。
2. 检查新建的GPIO流驱动是否添加成功
打开PLATFORM/SMDK6410/src/drivers/XXX文件夹
确认如下文件已存在makefile,source,StdAfx.cpp,StdAfx.h,XXX.cpp,XXX.def
打开PLATFORM/SMDK6410/src/drivers目录下的dirs文件,确认其中包括XXX
3. 修改makefile文件(PLATFORM/SMDK6410/src/drivers/XXX下)
右键文本方式打开
添加以下一行
!INCLUDE $(_MAKEENVROOT)/makefile.def
4. 修改sources文件(PLATFORM/SMDK6410/src/drivers/XXX下)
右键文本方式打开
在TARGETLIBS=添加以下内容
(_WINCEROOT)\PLATFORM\SMDK6410\lib\ARMV4I\retail\DriverLib.lib \
5. 修改XXX.def文件(PLATFORM/SMDK6410/src/drivers/XXX下)
右键文本方式打开
添加以下内容
LIBRARY XXX_DRV
EXPORTS XXX_Init
XXX_Deinit
XXX_Open
XXX_Close
XXX_Read
XXX_Write
XXX_Seek
XXX_PowerDown
XXX_PowerUp
XXX_IOControl
6. 编写GPIO流驱动头文件
如果操作的I/O端口较多,则需要定义较多的DWORD型变量dwIoControlCode
在PLATFORM/SMDK6410/src/drivers/XXX下新建XXX.h
在其中添加自定义的控制码,如下
#define IOCTL_GIO_GPP8_ON 0x67707081
#define IOCTL_GIO_GPP8_OFF 0x67707080
#define IOCTL_GIO_GPP9_ON 0x67707091
#define IOCTL_GIO_GPP9_OFF 0x67707090
#define IOCTL_GIO_GPP10_ON 0x677070A1
#define IOCTL_GIO_GPP10_OFF 0x677070A0
#define IOCTL_GIO_GPP11_ON 0x677070B1
#define IOCTL_GIO_GPP11_OFF 0x677070B0
#define IOCTL_GIO_GPP12_ON 0x677070C1
#define IOCTL_GIO_GPP12_OFF 0x677070C0
#define IOCTL_GIO_GPP13_ON 0x677070D1
#define IOCTL_GIO_GPP13_OFF 0x677070D0
7. 编写XXX.cpp
定义映射地址
static volatile S3C6410_GPIO_REG *v_pIOPregs ;
在初始化函数DWORD XXX_Init (LPCTSTR pContext, LPCVOID lpvBusContext)中建立映射关系
DWORD GIO_Init(LPCTSTR pContext, LPCVOID lpvBusContext) {
//Virtual address mapping
v_pIOPregs = (volatile S3C6410_GPIO_REG*)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_GPIO,
sizeof(S3C6410_GPIO_REG),
FALSE);
return 1;
}
在BOOL XXX_Deinit(DWORD hDeviceContext)函数中释放资源
BOOL GIO_Deinit(DWORD hDeviceContext) {
VirtualFree((PVOID)v_pIOPregs, 0, MEM_RELEASE);
v_pIOPregs = NULL;
return TRUE;
}
在BOOL XXX_IOControl函数中添加操作方法
BOOL GIO_IOControl(DWORD Handle,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned) {
switch (dwIoControlCode) {
case IOCTL_GIO_GPP8_ON: //GPP8 ON
v_pIOPregs->GPPCON&=(~(0x03<<16));
v_pIOPregs->GPPCON|=0x1<<16;
v_pIOPregs->GPPDAT|=(0x01<<8);
OutputDebugString(L"GPP8 On - GPIO Control\n");
break;
case IOCTL_GIO_GPP8_OFF: //GPP8 OFF
v_pIOPregs->GPPCON&=(~(0x03<<16));
v_pIOPregs->GPPCON|=0x1<<16;
v_pIOPregs->GPPDAT&=~(0x01<<8);
OutputDebugString(L"GPP8 OFF - GPIO Control\n");
break;
case IOCTL_GIO_GPP9_ON: //GPP9 ON
v_pIOPregs->GPPCON&=(~(0x03<<18));
v_pIOPregs->GPPCON|=0x1<<18;
v_pIOPregs->GPPDAT|=(0x01<<9);
OutputDebugString(L"GPP9 On - GPIO Control\n");
break;
case IOCTL_GIO_GPP9_OFF: //GPP9 OFF
v_pIOPregs->GPPCON&=(~(0x03<<18));
v_pIOPregs->GPPCON|=0x1<<18;
v_pIOPregs->GPPDAT&=~(0x01<<9);
OutputDebugString(L"GPP9 OFF - GPIO Control\n");
break;
case IOCTL_GIO_GPP10_ON: //GPP10 ON
v_pIOPregs->GPPCON&=(~(0x03<<20));
v_pIOPregs->GPPCON|=0x1<<20;
v_pIOPregs->GPPDAT|=(0x01<<10);
OutputDebugString(L"GPP10 On - GPIO Control\n");
break;
case IOCTL_GIO_GPP10_OFF: //GPP10 OFF
v_pIOPregs->GPPCON&=(~(0x03<<20));
v_pIOPregs->GPPCON|=0x1<<20;
v_pIOPregs->GPPDAT&=~(0x01<<10);
OutputDebugString(L"GPP10 OFF - GPIO Control\n");
break;
case IOCTL_GIO_GPP11_ON: //GPP11 ON
v_pIOPregs->GPPCON&=(~(0x03<<22));
v_pIOPregs->GPPCON|=0x1<<22;
v_pIOPregs->GPPDAT|=(0x01<<11);
OutputDebugString(L"GPP11 On - GPIO Control\n");
break;
case IOCTL_GIO_GPP11_OFF: //GPP11 OFF
v_pIOPregs->GPPCON&=(~(0x03<<22));
v_pIOPregs->GPPCON|=0x1<<22;
v_pIOPregs->GPPDAT&=~(0x01<<11);
OutputDebugString(L"GPP11 OFF - GPIO Control\n");
break;
case IOCTL_GIO_GPP12_ON: //GPP12 ON
v_pIOPregs->GPPCON&=(~(0x03<<24));
v_pIOPregs->GPPCON|=0x1<<24;
v_pIOPregs->GPPDAT|=(0x01<<12);
OutputDebugString(L"GPP12 On - GPIO Control\n");
break;
case IOCTL_GIO_GPP12_OFF: //GPP12 OFF
v_pIOPregs->GPPCON&=(~(0x03<<24));
v_pIOPregs->GPPCON|=0x1<<24;
v_pIOPregs->GPPDAT&=~(0x01<<12);
OutputDebugString(L"GPP12 OFF - GPIO Control\n");
break;
case IOCTL_GIO_GPP13_ON: //GPP13 ON
v_pIOPregs->GPPCON&=(~(0x03<<26));
v_pIOPregs->GPPCON|=0x1<<26;
v_pIOPregs->GPPDAT|=(0x01<<13);
OutputDebugString(L"GPP13 On - GPIO Control\n");
break;
case IOCTL_GIO_GPP13_OFF: //GPP13 OFF
v_pIOPregs->GPPCON&=(~(0x03<<26));
v_pIOPregs->GPPCON|=0x1<<26;
v_pIOPregs->GPPDAT&=~(0x01<<13);
OutputDebugString(L"GPP13 OFF - GPIO Control\n");
break;
}
return TRUE;
}
8. 将新建的驱动加入编译环境中
打开\PLATFORM\SMDK6410\FILES文件夹
用文本编辑器打开platform.bib文件
加入如下语句
;------------- XXX Driver -------------------------------------------------------------
XXX.dll $(_FLATRELEASEDIR)\XXX.dll NK SHK
;-------------------------------------------------------------------------------------------
用文本编辑器打开platform.reg文件
加入如下语句
;================= XXX ==================
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\XXX]
"Prefix"="XXX"
"Dll"="XXX.dll"
"Order"=dword:OO
"Index"=dword:1
9. 编译生成