S3C6410+WinCE+GPIO+流驱动+详细过程
来源:互联网 发布:安徽易众网络工作 编辑:程序博客网 时间:2024/05/16 12:31
参考了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. 编译生成
- S3C6410+WinCE+GPIO+流驱动+详细过程
- S3C6410的GPIO流驱动(WINCE600)
- s3c6410 GPIO驱动总结
- s3c6410 GPIO驱动总结
- s3c6410 GPIO驱动总结
- Android底层驱动验证过程(S3C6410 gpio)
- S3C6410 Wince 启动过程
- s3c6410的GPIO驱动总结
- S3C2410-GPIO驱动(WINCE)
- wince GPIO 驱动 学习
- S3C6410 GPIO 驱动(二) --- LED驱动
- WinCE流设备驱动简介及GPIO驱动的实现
- WinCE流设备驱动简介及GPIO驱动的实现
- WinCE流设备驱动简介及GPIO驱动的实现
- WinCE流设备驱动简介及GPIO驱动的实现
- WinCE流设备驱动简介及GPIO驱动的实现
- WinCE流设备驱动简介及GPIO驱动的实现
- WinCE流设备驱动简介及GPIO驱动的实现
- FTP的两种工作方式
- windows ZendDebugger配置(5.2 5.3 5.4 5.5)
- INV: Transactions库存事务处理
- [NOI2012] 美食节 费用流
- 类的多个继承
- S3C6410+WinCE+GPIO+流驱动+详细过程
- nagios插件之监控MQA日志文件--检查ERROR
- Sqrt(x)
- 是时候静下心来学点东西了
- linux中vi编辑器没有颜色
- 【Linux文件目录】的一点小结
- 关于su下bash:xxx :command not found
- 重回ubutntu12.04小记(装完ubuntu做的几件事)
- javascript 数值与字符传相互转换