Win CE6.0下如何新建和修改GPIO驱动

本产品以OK210为例,介绍如何新建和修改ce6下的gpio驱动

只要按照步骤执行下去,即可建立一个新的GPIO驱动。并做如何修改GPIO驱动介绍。完成驱动开发的准备工作。

硬件平台:飞凌OK210

操作系统:飞凌光盘中的BSPWin CE6.0

编译工具:VS2005 + Win CE6.0 + BSP

在上述所有工具安装完成后,直接用BSP的快捷方式打开。

驱动主要在文件夹PLATFORM/SMDK210/src/drivers

建立过程:

1,建立驱动

drivers文件夹上点击右键,选择add->New Source Subproject->WCE Dynamic-Link Libraryname框中输入XXX,下一步。

选择A simple Windows Embedded CE DLL subproject完成。

2,打开PLATFORM/SMDK210/src/drivers/XXX文件夹

里面已经替你建好了如下文件:makefilesourceStdAfx.cppStdAfx.hXXX.cppXXX.def

用文本编辑器打开XXX.def文件,添加如下代码

 

注意:一下均不能直接复制粘贴到开发环境下,否则编译报错。

 

LIBRARY         XXX_DRV

EXPORTS         XXX_Init
                XXX_Deinit
                XXX_Open
                XXX_Close
                XXX_Read
                XXX_Write
                XXX_Seek
                XXX_PowerDown
                XXX_PowerUp
                XXX_IOControl

 打开XXX.cpp文件加入如下代码

 

加上头文件:

#include <windows.h>

#include <ceddk.h>

#include <nkintr.h>

#include <pm.h>

#include <drvmsg.h>

#include <drvlib_mem.h>

#include "pmplatform.h"

#include "Pkfuncs.h"

#include <types.h>

#include <bsp.h>

#include "xxx.h"

 

在xxx.cpp设置操作变量:

static volatile GPIO_REG * g_pGPIOReg = NULL;

加上入口驱动函数:

BOOL WINAPI  

DllEntry(HANDLE hinstDLL, 

DWORD dwReason, 

LPVOID /* lpvReserved */)

{

switch(dwReason)

{

case DLL_PROCESS_ATTACH:

DEBUGREGISTER((HINSTANCE)hinstDLL);

return TRUE;

case DLL_THREAD_ATTACH:

break;

case DLL_THREAD_DETACH:

break;

case DLL_PROCESS_DETACH:

break;

#ifdef UNDER_CE

case DLL_PROCESS_EXITING:

break;

case DLL_SYSTEM_STARTED:

break;

#endif

}

 

return TRUE;

}

在xxx_Init函数中写入如下代码:

g_pGPIOReg = (GPIO_REG*)DrvLib_MapIoSpace(BASE_REG_PA_GPIO, sizeof(GPIO_REG), FALSE);

 

继续增加如下代码:

BOOL  xxx_Deinit(DWORD hDeviceContext) { 

return TRUE; 

DWORD xxx_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { 

OutputDebugString(L"LED - LED Open\n");

return 1; 

BOOL xxx_Close(DWORD hOpenContext) {

OutputDebugString(L"LED - LED Close\n");

return TRUE; 

DWORD xxx_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) { 

return 1;

DWORD xxx_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count) { 

return 1; 

VOID xxx_PowerUp(DWORD hDeviceContext) {   

VOID xxx_PowerDown(DWORD hDeviceContext) {   

}  

DWORD xxx_Seek(DWORD hOpenContext, long Amount, DWORD Type) {   

  return 0;   

 

增加io控制函数(ok210-a中的led为例,具体操作参考210数据手册,如果要修改gpio驱动,则应该在如下代码中修改相应的寄存器,并在xxx.h,中加上相应的操作符,操作符不能和其他的一样):

BOOL xxx_IOControl(DWORD hOpenContext, 

   DWORD dwCode, 

   PBYTE pBufIn, 

   DWORD dwLenIn, 

   PBYTE pBufOut, 

   DWORD dwLenOut, 

   PDWORD pdwActualOut)

{

switch(dwCode)

{

case IOCTL_LED_LED_OPEN:

g_pGPIOReg->GPH2.GP_CON = (g_pGPIOReg->GPH2.GP_CON & ~0xFFFF)  | 0x00001111; //设置所有led灯的引脚为输出

g_pGPIOReg->GPH2.GP_DAT |= 0x0;//led灯的引脚置低,根据原理图,低电平led灯亮

OutputDebugString(L"Led Open- LED IO Control\n"); 

break;

case IOCTL_LED_LED_CLOSE:

g_pGPIOReg->GPH2.GP_CON = (g_pGPIOReg->GPH2.GP_CON & ~0xFFFF)  | 0x00001111; 

g_pGPIOReg->GPH2.GP_DAT |= 0xf;

OutputDebugString(L"Led Close- LED IO Control\n"); 

break;

}

    return TRUE;

在xxx.h中,增加如下代码:(若增加驱动则应该在如下位置加上相应的操作符,格式和下面一样)

#ifndef LCD_H

#define LCD_H

#define IOCTL_LED_LED_OPEN           0x04002060

#define IOCTL_LED_LED_CLOSE         0x04002061

#endif

打开\PLATFORM\SMDK210\SRC\DRIVER\XXX\sources 文件,用写字板或记事本加入如下代码:$(_SYSGENOAKROOT)\lib\$(_CPUINDPATH)\ceddk.lib \

    $(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\drvlib.lib \

    $(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\drvlib_mem.lib

 

 

3,打开\PLATFORM\SMDK210\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

同样注意位置,写到两个已有的驱动中间吧。OO代表加载顺序,请自己定义。

保存,clean sysgen

我第一次编译时出错了。第二次成功。

重编译下XXX

将生成的NK.bin烧写到板子上。

vs2005的远程工具中的进程查看器查看板子运行中的NK.EXE下是否已经加载了XXX.dll

如果已经加载,可以制作测试程序了。

 

飞凌嵌入式 发表于12-27 17:02 浏览65213次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

飞凌嵌入式
金币:15个|学分:110167个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号