查看: 2487|回复: 3

[Wince技术] Win CE6.0下如何新建和修改GPIO驱动

[复制链接]
  • TA的每日心情

    2014-4-10 13:56
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-1-21 10:24:04 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 forlinx2013 于 2014-1-24 09:45 编辑

    欢迎大家来到飞凌爱板网专区,对嵌入式技术感兴趣的朋友不妨多多关注一下,我们提供了公司所有开发板的所有资料,也会更新大量技术文章,欢迎大家一块学习提高!!!

    以我的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
    如果已经加载,可以制作测试程序了。


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-8-4 10:56
  • 签到天数: 242 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-1-21 12:35:34 | 显示全部楼层
    这贴子 ........
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2014-4-10 13:56
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

     楼主| 发表于 2014-1-21 17:24:44 | 显示全部楼层
    木林森 发表于 2014-1-21 12:35
    这贴子 ........

    ??????????????????????????
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-8-4 10:56
  • 签到天数: 242 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-1-21 18:27:25 | 显示全部楼层
    铜板的知识点
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 10:41 , Processed in 0.142412 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.