本帖最后由 zhengningwei 于 2015-7-25 17:32 编辑
2015/7/25更新
标题:Win CE6.0流驱动开发与内核编译移植(OK210开发板) 历史进度更新记录:
1、OK210开发板使用体验报告 – 开箱(2015.7.7)
2、OK210开发板使用体验报告 – 通过串口指令操作LED和温度传感器(2015.7.12)
有关环境搭建和简单应用开发(基于WinCE6.0)
-----------------------------------------------------------------------------------------
本贴内容提要:
1)学习Win CE6.0流驱动开发的基本流程,编写简单的LED驱动;2)将编写好的驱动加入到系统内核并进行编译移植。本人初步做流驱动开发,都是自己查阅资料整理而成,中间可能会存在一些问题或者会有一些可以优化的步骤,比如如何加快镜像编译速度、如何快速调试驱动这两个问题希望能和大家一起讨论以及得到前辈们的指导。按照本文的步骤执行,可以成功加载驱动,并可以通过应用调用来进行开发调试。
一、关于开发环境
由于更换了电脑,且装的系统是Windows 7旗舰版(32位),所以原来基于XP搭建的开发环境就不用了,现在改用基于Win7来搭建VS2005 + PB6 + Windows设备中心+其它工具 ,安装和使用会遇到一些兼容性问题,查阅资料后,这些都可以解决,目前进行驱动开发、应用开发、内核编译移植、同步等这些操作暂时未遇到由于兼容性带来的问题,当然,前提是正确安装到位各个组件。以下我会简单讲一下在Win7下搭建WinCE6.0开发环境的步骤和要注意的细节,按照此步骤执行,可以在Windows7搭建好开发环境!
1、需要下载和使用的组件和补丁
1)Visual Studio 2005.(注意:中文版和英文版所要安装的补丁是不同的,本安装步骤都是基于中文版本!)
2) SP1补丁.(中文版本VS2005需要安装的补丁名字为:VS80sp1-KB926604-X86-CHS.exe)
3)Visual Studio 2005 ServicePack 1 Update for WindowsVista. (中文版本补丁名字为: VS80sp1-KB932230-X86-CHS)
4) VS2005SP1 ATL SecurityUpdate.(文件名为:VS80sp1-KB971090-X86-INTL)
5) Windows Embedded CE 6.0.( X:..WinCE6.0-Asetup.exe)
6)WIN CE6.0 SP1补丁.(X:..WinCE6.0-BWindows Embedded CE6.0 Platform Builder Service Pack1Windows Embedded CE 6.0 PlatformBuilder Service Pack 1.msi)
7)R2补丁.( X:..WinCE6.0-BWinCE6.0 R2setup.exe)
8)08年补丁.( X:..WinCE6.0-BWinCE6.0 UpdatesWinCEPB60-081231-Product-Update-Rollup-Armv4I.msi)
9) R3补丁.( X:..WinCE6.0-BWinCE6.0 R3WindowsEmbedded CE 6.0 R3.msi)
10) 09~12年补丁包. (X:..Pb6 补丁包 121231WinCEPB60-121231-Product-Update-Rollup-Armv4I.msi)
11)BSP.(用户光盘(A):WINCEBSPOK210_BSP_XXXXXXXX.msi)
12)飞凌SDK.(用户光盘(A):WIN CESDKOK210_CE6_SDK.msi)
13)Windows设备中心.( http://www.microsoft.com/zh-cn/download/details.aspx?id=14)
2、安装注意事项
按照以上软件安装顺序进行安装,请自行去微软下载补丁,下载下来的补丁名字就是以上贴出的补丁名。
注意:安装的时候<右键-以管理员身份运行>,来进行安装,安装wince6.0补丁的时候,可能会弹出安装失败的提示,此时<右键-属性-以XP SP3兼容模式运行程序-以管理员身份运行> 即可解决,其它安装细节参照官方手册OK210用户光盘(A)用户手册OK210软件手册。所有安装完成后,先不要直接打开VS2005,<右键VS2005-属性-以管理员身份运行>注意,此处不需要以XP SP3兼容模式运行,直接管理员身份运行即可,以XP运行的话编译镜像的时候会报错误导致编译失败。
上面提到的Windows设备中心,用于替代ActiveSync,用于同步,此工具需要安装驱动,驱动安装细节参考上一篇进度更新帖里关于ActiveSync驱动的安装。 另外需要注意的是实用工具里的SD_Writer
,也就是制作SD卡镜像移植的工具,使用的时候需要<右键-属性-以XP SP3兼容模式运行程序-以管理员身份运行>,否则会制作失败。
二、LED驱动开发步骤
本文LED流接口驱动开发包含以下7个步骤:
1) 打开BSP工程,创建DLL驱动项目。
2) 配置LD2.def文件。
3) 在LD2.cpp文件中编写流设备驱动的接口函数(附件)。
4) 在LD2.h文件中添加LED操作的相关操作符。
5) 配置platform.bib文件。
6) 配置platform.reg文件。
7) 配置source文件和makefile文件。
△具体流程
1.创建DLL驱动项目
①
打开BSP项目
,注意,可能点击该快捷方式后电脑会没有反应,也就是没法打开,此时直接将该快捷方式发送到桌面,然后打开时,直接将该快捷方式拖到Visual Studio 2005即可打开。打开之后,如下图配置:
②
按上图依次展开,在DRIVERS文件夹右键ADD-NewSources…创建新的DLL项目,弹出如下图窗口,按图中红框选择创建一个动态链接库,并设置好项目名字,如图并点击下一步↓;
↓点击A simple Windows …创建一个DLL模板,并点击完成。
此时在DRIVERS文件夹下就添加了LD2这个目录,里面已经建好了如下文件:makefile,source,StdAfx.cpp,StdAfx.h,XXX.cpp,XXX.def,其中StdAfx.cpp,StdAfx.h可以删除掉,如下图:
2.配置LD2.def文件
进入文件夹↓
打开LD2这个文件夹,这个文件夹就是刚才创建的DLL目录,用文本编辑器打开LD2.def文件,添加以下代码后保存↓:
- LIBRARY LD2_DRV
- EXPORTS LD2_Init
- LD2_Deinit
- LD2_Open
- LD2_Close
- LD2_Read
- LD2_Write
- LD2_Seek
- LD2_PowerDown
- LD2_PowerUp
- LD2_IOControl
3.在LD2.cpp文件中编写流设备驱动的接口函数
创建一个记事本文件并命名为LD2,将后缀名改为.cpp,文件请参考附件,此文件内容是流驱动的接口函数以及LED端口配置和操作等函数,程序太长,在此我就不列出来,以附件的形式贴出。
4.在LD2.h文件中添加LED操作的相关操作符并保存为LD2.h文件↓:
- #ifndef LD2_H
- #define LD2_H
- #define IOCTL_LD2_LED1_OPEN 0x05001060
- #define IOCTL_LD2_LED1_CLOSE 0x05001061
- #define IOCTL_LD2_LED2_OPEN 0x05001070
- #define IOCTL_LD2_LED2_CLOSE 0x05001071
- #define IOCTL_LD2_LED3_OPEN 0x05001080
- #define IOCTL_LD2_LED3_CLOSE 0x05001081
- #define IOCTL_LD2_LED4_OPEN 0x05001090
- #define IOCTL_LD2_LED4_CLOSE 0x05001091
- #endif
此文件是对LED端口操作符的相关宏定义,就是LED端口的点亮或者熄灭操作的一些动作,在驱动函数里面是通过switch语句来识别应用的操作指令,这些宏定义要与应用开发里一致,否则是无法操作LED的。
5. 配置platform.bib文件↓:
- ;------------- LD2 Driver -
- LD2.dll $(_FLATRELEASEDIR) LD2.dll NK SHK
- ;-------------
插入到两个驱动的中间即可。
6. 配置platform.reg文件
也是进入进入BSP目录PLATFORMSMDK210FILES,用记事本打开platform.reg,
在最后一行加入以下语句并保存↓:================= XXX ==================
- [HKEY_LOCAL_MACHINEDriversBuiltIn LD2]
- "Prefix"="LD2"
- "Dll"=" LD2.dll"
- "Order"=dword:32
- "Index"=dword:1
- ;========================================
注意:Order的值是自定义的,这是驱动加载的顺序,要定多大的值,参照此文件里的最后一条里的Order的值,比它大,或者按顺序往下排即可。
7. 配置source文件和makefile文件。
1)用记事本打开LD2目录下的source文件,并加入以下内容并保存↓:
- RELEASETYPE=PLATFORM
- TARGETNAME=LD2
- TARGETTYPE=DYNLINK
- SOURCES= LD2.cpp
- SOURCELIBS=
- TARGETLIBS=$(_SYSGENSDKROOT)lib$(_CPUINDPATH)coredll.lib
- $(_SYSGENOAKROOT)lib$(_CPUINDPATH)ceddk.lib
- $(_TARGETPLATROOT)lib$(_CPUINDPATH)drvlib.lib
- $(_TARGETPLATROOT)lib$(_CPUINDPATH)drvlib_mem.lib
- FILE_VIEW_INCLUDES_FOLDER=
- LD2.h
2) 用记事本打开LD2目录下的makefile文件,并加入以下内容并保存↓:
- !INCLUDE $(_MAKEENVROOT)makefile.def
-----------------------------------------------------------------------------------------
所有配置文件和驱动代码就完成了,在VS2005环境中,右键“LD2”文件夹,选择build
进行查错,此时这个LD2驱动还不会加入到nk文件中,因为驱动还未加入到内核中,如果驱动没有语法等错误,并且BSP项目是第一次编译,如下图点击Clean Sysgen进行内核编译
如果以前编译过,就直接点击“Sysgen”,编译时间非常长,编译成功会在“Release”目录生成NK和bootimage文件。如下图
将这两个文件复制出来,然后按照飞凌官方的WinCE镜像烧写方法将文件移植到开发板。在这里不在赘述。
需要注意的是:由于镜像编译时间非常的长,如果驱动做了一些修改的话,不需要重新进行“Sysgen”,直接右键该驱动的文件夹,然后选择ReBuild,编译完后VS2005会将修改后的驱动加入到NK文件中,提取NK文件烧写即可。第一次编写驱动的时候就需要“Sysgen”,修改的话直接ReBuild即可,这样做法本人也不知是否合适,毕竟这样调试驱动效率不算高,有看到一些文章说可以直接通过同步工具来远程访问修改开发板中的注册表文件来调试驱动,还在学习这种调试,知道的前辈希望不吝指导一下。
以上就完成了基本流驱动的编写和系统编译移植的所有步骤,接下来是通过上一篇进度更新里开发的应用程序来调用这次编写好的LD2驱动,使用方法与上一篇类似,在这里不在赘述。直接看一下运行效果:
编译完后,连接好USB,通过VS2005的调试仿真按钮
,然后同步工具会自动将程序同步到开发板中运行(注意,这里的项目已经不是那个BSP项目了,而是应用程序开发的了,与底层无关的,不要理解错)。 如下图,是系统打印出来的调试信息,说明LD2驱动文件被成功调用打开了,并且串口和其它的驱动也打开成功。此条提示信息也就是在应用中编写的。
摘出部分代码:
- hLed = CreateFile(TEXT("LD21:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
- if (hLed == INVALID_HANDLE_VALUE)
- {
- uart_sent_str("Open My_Led Fail!rn");
- printf("Open My_Led Fail!rn");
- }
- else
- {
- uart_sent_str("Open My_Led Success!rn");
- printf("Open My_Led Success!rn");
- }
打开串口调试工具,按照上一篇中的指令来控制LED端口的打开或者熄灭,如下图:
以下是实拍的效果图:
至此呢,驱动被调用成功,可以正常使用,驱动部分也就算简单测试完成,虽然只是简单的驱动一个发光LED,但是这里面涉及了一个Win CE6.0流驱动开发的所有流程,麻雀虽小五脏俱全,其它的流驱动不管多复杂,开发的流程也是类似,触类旁通,接下来会加入其它硬件外设,并完成驱动和应用程序的编写。文笔有限,写的不完善或者错误的欢迎提出指正,我会及时修正,谢谢大家,祝大家周末愉快!
LD2.zip
(2.4 KB)
(下载次数: 8, 2015-7-25 16:59 上传)
若有其它附件上传,会在下面的楼层上传!
By Zheng
2015/7/25