S3C6410+WinCE+GPIO+流驱动+详细过程

来源:互联网 发布:安徽易众网络工作 编辑:程序博客网 时间:2024/05/16 12:31
本帖旨在列出编写6410+WinCE+GPIO+流驱动的详细过程。
参考了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
在其中添加自定义的控制码,如下

#defineIOCTL_GIO_GPP8_ON0x67707081#defineIOCTL_GIO_GPP8_OFF0x67707080#defineIOCTL_GIO_GPP9_ON0x67707091#defineIOCTL_GIO_GPP9_OFF0x67707090#defineIOCTL_GIO_GPP10_ON0x677070A1#defineIOCTL_GIO_GPP10_OFF0x677070A0#defineIOCTL_GIO_GPP11_ON0x677070B1#defineIOCTL_GIO_GPP11_OFF0x677070B0#defineIOCTL_GIO_GPP12_ON0x677070C1#defineIOCTL_GIO_GPP12_OFF0x677070C0#defineIOCTL_GIO_GPP13_ON0x677070D1#defineIOCTL_GIO_GPP13_OFF0x677070D0

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 mappingv_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 ONv_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 OFFv_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 ONv_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 OFFv_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 ONv_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 OFFv_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 ONv_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 OFFv_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 ONv_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 OFFv_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 ONv_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 OFFv_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. 编译生成

0 0