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

http://www.witech.com.cn/news/Article_Show.asp?ArticleID=447

 本产品以OK210为例,介绍如何新建和修改ce6下的gpio驱动
    只要按照步骤执行下去,即可建立一个新的GPIO驱动。并做如何修改GPIO驱动介绍。完成驱动开发的准备工作。
    硬件平台:飞凌OK210
    操作系统:飞凌光盘中的BSP,Win CE6.0
    编译工具:VS2005 + Win CE6.0 + BSP
    在上述所有工具安装完成后,直接用BSP的快捷方式打开。
    驱动主要在文件夹PLATFORM/SMDK210/src/drivers下
    建立过程:
1,建立驱动
    在drivers文件夹上点击右键,选择add->New Source Subproject->WCE Dynamic-Link Library在name框中输入XXX,下一步。
选择A simple Windows Embedded CE DLL subproject完成。
2,打开PLATFORM/SMDK210/src/drivers/XXX文件夹
    里面已经替你建好了如下文件:makefile,source,StdAfx.cpp,StdAfx.h,XXX.cpp,XXX.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。
    如果已经加载,可以制作测试程序了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值