实验五WinCE中的驱动程序开发
Windows ce驱动程序设计

小 内存 体 积 占用进 行 的优化 , 具有 实 时 内核 , 健 的 内 强
存 管 理 , 进 的 电源 管理 , 先 开放 的通 信平 台 , 程 系统 远 管理 , 标 准 的支 持 , 泛 的存 储 和 文 件系 统 , 对 广 预先 构 建 的服务 器服务 , 加安 全可 靠 的连接 。 更 要 使 基 于 W id wsc n o a的 系 统 能 正 常工 作 , 须 必
t oc s ofd veop ng de ie d ie a n he i t nc fs ra rve . he pr es e l i vc rv r t ki g t ns a e o e ild i r
KEYW ORDS W i d ws c , d i e r g a , s r a it ra e,s ra n o a rv r p o r m t e m n e fc e il
维普资讯
W id ws a驱 动 程 序 设 计 no c
文 苹 编 号 : 0 35 5 ( 0 8 0 — 0 4 0 10 -8 0 2 0 ) 70 1— 3
Wid wsc 动 程序 设 计 n o e驱
Pr g a m i f De i e Dr v r b s d o i o e o rm ng o v c i e a e n W nd ws c
为 系统的 各种 设备 提供 驱动 程序 。有 时 硬件 厂商 不提 供 基 于 Wid wsc n o a的驱 动 程 序 , 软 提 供 的 样 本 驱 微
动 程 序也 不 能 满 足需 求 , 时 就需 要 根 据 自己特 定 的 这 硬件平 台进行 基于 Wid wsc n o a的驱动 程 序开发 。 当要解 决硬 件平 台同操 作 系统 内核 和应用 程序 调
WINCE 流接口驱动程序开发

Softeem Consultancy Service
BOOL XXX_Deinit(DWORD hDeviceContext); ; 参数: hDeviceContext 参数 由XXX_Init创建时生成的设备句柄 创建时生成的设备句柄 . 返回值:调用成功 返回TURE,调用失败 返回FALSE. 返回值 调用成功,返回 调用失败,返回 调用成功 返回 调用失败 返回 当用户需要卸载一个驱动程序时,设备管理器会调用这个 描 述:当用户需要卸载一个驱动程序时 设备管理器会调用这个 当用户需要卸载一个驱动程序时 函数来卸载这个驱动程序.应用程序不能直接调用这个函数 设备 函数来卸载这个驱动程序 应用程序不能直接调用这个函数,设备 应用程序不能直接调用这个函数 管理器通过DeactivateDevice()函数来调用这个函数 函数来调用这个函数. 管理器通过 函数来调用这个函数 DWORD XXX_Open(DWORD hDeviceContext, DWORD AccessCode , DWORD ShareMode); ; 参数:hDeviceContext XXX_Init的返回值. 的返回值. 参数 的返回值 AccessCode 访问模式标志,读,写或其他. 访问模式标志 读 写或其他. ShareMode:驱动的共享方式标志 例如串口通迅中将设备 :驱动的共享方式标志,例如串口通迅中将设备 设置为可读可写模式. 设置为可读可写模式. 返回值:返回驱动程序引用实例句柄 返回驱动程序引用实例句柄. 返回值 返回驱动程序引用实例句柄 描述:本函数用于打开一个设备驱动程序 当应用程序准备对某一 描述 本函数用于打开一个设备驱动程序,当应用程序准备对某一 本函数用于打开一个设备驱动程序 个设备进行读或写操作时,应用程序必须先执行 应用程序必须先执行CreateFile()函数 个设备进行读或写操作时 应用程序必须先执行 函数 用于打开这个设备.本函数执行了以后 系统才能执行读写操作. 本函数执行了以后,系统才能执行读写操作 用于打开这个设备 本函数执行了以后 系统才能执行读写操作
嵌入式Windows CE 5.0驱动程序开发及测试

2 0 年 第 7 期 07
计 算 机 系 统 应 用
嵌 入 式 W id wsC . o E5 0驱 动程 序 开 发 及 测 试 n
T e d v l p e ta d t s fdr e p o e ur n W i d ws CE h e e o m n n e to i r c d e i n o v
计 算 机 系 统 应 用
2 0 年 第 7 期 07
建后 , 展开 Po c rj t e s树 显示 tx源代码 , 图 1 u 如 所示。
程序 公开的。
图 2
另外 使 用 T re o t l 口的 V w e u ag tC nr 窗 o i I bg e D
Wid w Mo u sa dSmb l , n o s I d l n y o e s后 显示 了此过 程的
计时器 , A T 网络 适配 器等 , U R和 而文件 系统 是逻 辑设
ba/ rn ()或 La Di r o d re ()来加载驱动程序 。La Di v o d r— v
e 不仅将 D L r L 加载到 父进程地址 空 间中 , 而且还 要确 保 D L没 有 “ a e u” 父 进 程 调 用 G trc d L pg dot 。 eP A — o
一
de s , rs () 后者 可 以获取 函数 名称和 所加 载 的 DL的 L h s ne l t c 。如 果函数 存在 , na 调用返 回该 函数 指针 ; 如果 没有从 D L L 公开该 函数 , 则返 回 N L。 U L 流 驱动程序也公开 了一个众所 周知 的函数集。对 于流驱 动程序 , 开发者希望能够将字节流 写入 设备 中, 或者从 设备中读取字节流。开发者可 以将现有 的操作 系统映 像用于模拟器平台。然后就可 以将 D L 动程 L驱 序 项 目添加到该平台 了。 在构建 并下载 了该平 台之后 , 开发 者需要 创建 主
Win CE驱动程序开发及测试流程

6、ห้องสมุดไป่ตู้模拟器下面调试驱动程序
内核编译完毕后就可以在模拟器下面调试的驱动程序了, 首先单击菜单中的 “Target”并在弹出的菜单中选择“Configure Remote connection” ,弹出“Remote connection”设置对话框如图 9.8 所示。
图 9.8 “Remote Connection”属性对话框 在“Download”和“Kernel”下面都选择“Emulator”选项,设置完毕后单 击“确定”按钮,这个时候就可以使用模拟器来启动编译的内核了。单击菜单中 的“Target” ,在弹出的菜单中选择“Download Initialize” ,启动模拟器运行编 译的内核,这个时候就可以在 Debug 窗体内看到流接口驱动程序加载的情况 了。 打开 Remote Process Viewer, 定位到 device.exe, 从图 9.9 可以看到 mydriver.dll 已经在 device.exe 的模块列表中了。这说明 mydriver.dll 已经被作为一个驱动加 载了。
增加对驱动程序进行操作的函数,代码如下:
void WriteToDriver( ) { DWORD dwWritten; TCHAR *tcString=L"Demo String..."; HANDLE hDrv=CreateFile(L"DEM1:",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ ATTRIBUTE_NORMAL,NULL); if (INVALID_HANDLE_VALUE == hDrv) { OutputDebugString(L"Failed to open Driver...\n"); } else { WriteFile(hDrv,(LPVOID)tcString,lstrlen(tcString)*sizeof(TCHAR ),&dwWritten,NULL); } CloseHandle(hDrv); } void ReadFromDriver( ) { DWORD dwRead; TCHAR tcTemp[30]; HANDLE hDrv=CreateFile(L"DEM1:",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_A TTRIBUTE_NORMAL,NULL); if (INVALID_HANDLE_VALUE == hDrv) { OutputDebugString(L"Failed to open Driver...\n"); } else { memset(tcTemp,0x00,30*sizeof(TCHAR)); ReadFile(hDrv,tcTemp,30,&dwRead,NULL); MessageBox(NULL,tcTemp,L"Demo Data",MB_OK); } CloseHandle(hDrv); } void HandleIOCTL( ) { HANDLE hDrv=CreateFile(L"DEM1:",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ ATTRIBUTE_NORMAL,NULL); TCHAR tcBuffer[10];
WinCE 触摸屏驱动程序的研究与开发

WinCE 触摸屏驱动程序的研究与开发摘要本文首先阐述了Windows 的体系结构及中断处理、驱动程序模型,在介绍触摸屏工作原理的基础上,以基于S3C2410触摸屏驱动程序为例,系统讲述了如何使用分层的驱动程序模型来实现Windows CE的驱动程序设计。
本文介绍了触摸屏驱动程序开发的软硬件细节,介绍的方法可移植性强,可方便的移植到其它的硬件设备中。
关键词Windows ; 驱动程序; 触摸屏; S3C24100 引言Windows 是一个抢先式多任务并具有强大通信能力的Windows 32位嵌入式操作系统,是微软专门为信息设备、移动应用、消费类电子产品、嵌入式应用等非PC领域而从头设计的战略性操作系统产品。
可以看出 Windows CE并不是Windows桌面操作系统的一部分或缩减版本。
CE系统与其它操作系统一样,也提供了设备驱动程序,以驱动内部或者外围硬件设备。
驱动程序将操作系统和设备链接起来,使得操作系统能够识别设备,并为应用程序提供相应的服务[1]。
要想真正了解驱动程序必须结合一些驱动程序的实际开发,本文以基于ARM9核心硬件平台的触摸屏驱动程序为例,讲解如何在不同的硬件设备上实现Windows CE的驱动开发。
1 Windows CE的体系结构Windows CE是由许多离散模块组成的,每一模块都提供特定的功能。
这些模块中的一部分被划分成组件。
组件使Windows CE变得非常紧凑,只占不到200KB 的RAM,因此只占用了运行设备所需的最小的ROM、RAM以及其它的硬件资源。
图1 Windows CE的体系结构Windows CE包含提供操作系统最关键功能的4个模块:内核模块;对象存储模块;图形、窗口和事件子系统(GWES)模块以及通信模块。
Windows CE还包含一些附加的可选择模块,这些模块可支持的任务有管理流设备驱动程序、支持COM等。
内核是OS的核心,通过Core Dll模块表示。
驱动程序 windows ce嵌入式系统开发课程课件

中断处理线程的典型结构如下
IsrThreadProc()
{ DWORD dwStatus,dwValue
int iPriority=123
;定义线程的优先级为123
dwStatus=RegQueryValueEx(-,_T(“SysIntr”),-,-
,&dwValue,-)
;读取本IST的SYSINTR
驱动程序的编写
Windows CE5.0自带了很多硬件驱动程序, 但在一些特定的情况下,还需要程序员 自已开发驱动程序。常见的情况是
操作系统没有该硬件的驱动程序 这是比较常见的情况,需要用户自己编写。
扩展已有驱动 已有的驱动功能不完整,需要扩存或重写。
实现伪驱动 实现一些特定的软件功能。
驱动程序的编写要素
把设备及驱动程序进行分类,然后把某一类设 备的共性提取出来,作为独立的一层。
这些通过提取共性而被抽象出来的接口和层称 做驱动程序模型。
本机设备驱动程序
适用于集成到Windows CE平台的设备, 如键盘、显示器、PC卡插槽等。
操作系统启动时加载。
流接口驱动程序
一般类型的设备驱动程序,支持几乎所 有可连接在Windows CE平台上的外部设 备。
项目13:驱动程序的编制(1)
本节课程主要知识点 驱动程序模型 驱动程序的中断处理
驱动程序
驱动程序是硬件与操作系统间的底层软 件。由于驱动程序的存在,应用程序可 以使用标准函数来访问硬件,而不必关 心硬件是如何工作的。
操作系统提供了一组标准的接口,驱动 程序就是要实现这组接口,并将这些接 口的实现映射到具体的对硬件的操作上。
IST差异性很大,与具体的设备和需要中断处 理完成的工作有关。
WINCE编写驱动程序

WINCE编写驱动程序(原创)转/lxzznn/blog/item/d5308ccbbdb56f1abf09e690.htmlWINCE添加驱动程序,目的为响应S3C2410的EINT7中断,使用了rGB2作为LED状态输出1.Kernel\Hal\cfw.cOEMInitInterrupts()使能EINT7、LED(Output)、触发方式2.Inc\oalintr.h(Inc\oalintr.inc)增加:#define SYSINTR_BEEP (SYSINTR_FIRMWARE+19)修改:_inline DWORD MapIrq2SysIntr(DWORD _Irq){if( _Irq<=18 )// 这里18改为19return ( SYSINTR_FIRMWARE + _Irq );elsereturn (0xffffffff);}3.Kernel\Hal\Arm\armint.cOEMInterruptHandler()//传说中的ISR此函数中添加:else if(IntPendVal == INTSRC_EINT4_7) // by xiaoyunsoft 2007-07-04 BEEP EINT7{s2410INT->rINTMSK |= BIT_EINT4_7;submask = s2410IOP->rEINTPEND;if (submask & (1<<7)){s2410IOP->rEINTMASK |= (1<<7);s2410IOP->rEINTPEND = (1<<7);s2410INT->rSRCPND = BIT_EINT4_7;if (s2410INT->rINTPND & BIT_EINT4_7){s2410INT->rINTPND = BIT_EINT4_7;}RETAILMSG(1,(TEXT("BEEP INTERRUPT HANDLERED! by xiaoyunsoft\r\n")));return SYSINTR_BEEP;}else{s2410INT->rSRCPND = BIT_EINT4_7;if (s2410INT->rINTPND & BIT_EINT4_7){s2410INT->rINTPND = BIT_EINT4_7;}RETAILMSG(1,(TEXT("ERR INT4_7 Handler! by xiaoyunsoft\r\n")));return SYSINTR_NOP;}}4.Kernel\Hal\cfw.cOEMInterruptEnable()增加:case SYSINTR_BEEP:s2410IOP->rEINTPEND = 0x80;s2410INT->rSRCPND = BIT_EINT4_7;if (s2410INT->rINTPND & BIT_EINT4_7){s2410INT->rINTPND = BIT_EINT4_7;}RETAILMSG(1,(TEXT("Beep Interrupt Enable Called by xiaoyunsoft \r\n")));s2410IOP->rEINTMASK &= ~0x80;s2410INT->rINTMSK &= ~BIT_EINT4_7;break;OEMInterruptDisable()增加:case SYSINTR_BEEP:s2410INT->rINTMSK |= BIT_EINT4_7;s2410IOP->rEINTMASK |= 0x80;break;OEMInterruptDone()增加:case SYSINTR_BEEP:s2410INT->rINTMSK &= ~BIT_EINT4_7;s2410IOP->rEINTMASK &= ~0x80;5.编写Beep流驱动程序:打开PB工程,File->New Project or File Name->Project->Deynamic Library源程序见下面的附16.编辑注册表Platform.reg,系统启动时自动加载Beep.dll添加:;=============== Beep by xiaoyunsoft 2007-08-04 ============================ [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Beep]"Index"=dword:1"Prefix"="BEP""Dll"="Beep.dll""Order"=dword:07.编辑Platform.bib文件添加:;Beep Driver xiaoyunsoft 2007-08-04Beep.dll $(_FLATRELEASEDIR)\Beep.dll NK SH注:EVC与PB环境都有查看远程CE注册表的功能,在Tools菜单下。
WinCE系统下的驱动开发知识

WinCE第三方驱动安装之二——CAB安装包制作Microsoft Windows CE是紧凑的,高效的操作系统,它被广泛的应用在从手持电脑到专门的工业控制器或消费用电子产品等各种嵌入工业产品中。
英创公司ARM9系列工控主板预装了正版Windows CE5.0操作系统,并对板上所有硬件资源提供了完备的驱动支持。
随着WinCE操作系统的广泛应用,越来越多的在PC上使用的硬件设备提供了对WinCE系统的支持,如3G模块,Wi-Fi等。
第三方驱动一般以两种形式提供,一是动态链接库(*.dll)加对应的注册表文件(*.reg),另一种是可直接安装的CAB文件(*.cab)。
与动态链接库加注册表文件形式的驱动相比,CAB文件安装十分方便,不需要了解繁杂的WinCE INF文件格式或REG文件格式。
本文介绍通过WinCE CAB Manager工具将以动态链接库usbser.dll和注册表文件usbser.reg 形式提供的USB转串口驱动程序压缩为可直接在英创主板上安装的CAB压缩包的方法。
1、打开WinCE CAB Manager,选择File->New,运行New Cabinet wizard(CAB新建向导),选择“next”直至完成如图1。
2、在CAB Information上点击右键,选择Properties(属性)选项(如图2),打开CAB 包属性设置对话框,如图3。
3、在CAB Properties对话框中(如图3),填写Company Name(公司名称)和Application Name(CAB包名称)。
4、切换至CAB Properties->Installation Directory对话框,设置CAB包默认安装路径,此处设置为NandFlash\USBDriverDll目录,如图4。
5、切换至CAB Properties->Cabinet对话框,设置处理器类型,Processor可直接选择为ALL/CEF,如图5。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WinCE中的驱动程序开发一.实验目的1、熟悉WinCE中流式接口驱动程序的12个接口的功能。
2、掌握流式驱动程序的工作过程。
3、能够编写出流式接口的驱动程序。
二.实验内容使用VS2005的智能设备应用程序开发方法,进行网络通信的编程,并通信多线程技术实现服务器与客户端之间的文件传输。
三.实验设备及工具硬件:PC机一台;软件:Windows XP操作系统,VS2005开发环境,WinCE 6.0开发环境,或Windows Mobile 5.0 SDK四.实验步骤及说明(1)写出流式接口驱动程序的12个接口,及每个接口的功能。
答:见教材515页(2)写出流式驱动程序的工作过程。
答:第一步:加载驱动程序,主要有两种加载方式:(1)当系统启动时,设备管理器搜寻注册表的HKEY_LOCAL_MACHINE\Drivers\BuiltIn键下面的子键,并逐一加载该子键下的每一个驱动,此过程称为BusEnum;(2)应用程序可调用ActivateDeviceEx()函数动态地加载驱动程序。
第二步:设备管理器从注册表的dll键值中获取驱动程序所在的DLL文件名。
第三步:设备管理器调用LoadDriver()函数把该DLL加载到自己的虚拟地址空间中。
第四步:设备管理器在注册表的HKEY_LOCAL_MACHINE\Drivers\Active下,记录所有已经加载的驱动程序。
第五步:设备管理器调用驱动程序中的COM_Init函数,并把上一步中添加的注册表项的完整路径作为COM_Init函数的第1个参数传入驱动程序内。
第六步:在COM_Init中,通常须对硬件进行一些最基本的初始化操作。
通过以上的操作完成流式驱动程序的加载任务。
对驱动程序的操作:第一步:应用程序使用该设备。
首先,应用程序调用CreateFile(TEXT(“COM1”)….)打开设备。
然后,文件系统判断打开的是文件还是设备。
最后,如果打开的是设备,就将控制权交回设备管理器。
第二步:设备管理器调用驱动程序的COM_Open()函数打开设备。
第三步:COM_Open()函数把打开设备的结果返回给设备管理器。
第四步:设备管理器把SMP_open()的返回结果,返回给应用程序的CreateFile()函数调用。
通过第七步到第十步,设备已被成功打开,接下来可对设备进行读/写和控制操作。
下面将以从设备中读取数据为例。
第一步:应用程序使用CreateFile()调用返回的句柄,调用函数ReadFile(),向设备发送读请求。
第二步:设备管理器调用驱动程序的COM_Read()函数,读取设备的数据信息。
在此过程中,COM_Read()函数可与硬件交互,从硬件中读取必要的信息。
然后返回给设备管理器,再返回给应用程序。
最后,当应用程序不再使用该设备时,它可调用CloseHandle()将设备关闭。
(3)实验过程及主要代码分析:a. 写出两种导出动态链接库接口的方法答:导出动态链接库接口的方法,主要有以下两种:第一种,使用动态链接库的导出文件,即.DEF文件LIBRARY GenDriverEXPORTSGEN_InitGEN_DeinitGEN_PreDeinitGEN_OpenGEN_CloseGEN_PreCloseGEN_ReadGEN_WriteGEN_SeekGEN_PowerDownGEN_PowerUpGEN_IOControl第二种,使用__declspec(dllexport)关键字__declspec(dllexport) DWORD GEN_Init (DWORD dwContext);__declspec(dllexport) BOOL GEN_PreDeinit (DWORD dwContext);__declspec(dllexport) BOOL GEN_Deinit (DWORD dwContext);__declspec(dllexport) DWORD GEN_Open (DWORD dwContext, DWORD dwAccess,DWORD dwShare);__declspec(dllexport) BOOL GEN_PreClose (DWORD dwOpen);__declspec(dllexport) BOOL GEN_Close (DWORD dwOpen);__declspec(dllexport) DWORD GEN_Read (DWORD dwOpen, LPVOID pBuffer,DWORD dwCount);__declspec(dllexport) DWORD GEN_Write (DWORD dwOpen, LPVOID pBuffer,DWORD dwCount);__declspec(dllexport) DWORD GEN_Seek (DWORD dwOpen, long lDelta,WORD wType);__declspec(dllexport) DWORD GEN_IOControl (DWORD dwOpen, DWORD dwCode,PBYTE pIn, DWORD dwIn,PBYTE pOut, DWORD dwOut,DWORD *pdwBytesWritten);__declspec(dllexport) void GEN_PowerDown (DWORD dwContext);__declspec(dllexport) void GEN_PowerUp (DWORD dwContext);b.写出示例代码进行驱动程序的打开,并分析代码答:打开驱动程序GenDriver的示例代码如下:HWND hWnd = hMain;DWORD dwwritten;int count;int ret;//加载驱动HANDLE HandleDriver = INVALID_HANDLE_VALUE; //驱动程序句柄HANDLE hFile = INVALID_HANDLE_VALUE; //设备文件操作句柄HKEY hDrvKey = NULL; //注册表操作句柄HandleDriver = ActivateDeviceEx(L"Drivers\\BuiltIn\\GEN", NULL, 0, NULL);/* 加载SimpleDriver 驱动*/if (HandleDriver == INVALID_HANDLE_VALUE)Add2List(hWnd,TEXT("加载SimpleDriver失败."));elseAdd2List(hWnd,TEXT("加载SimpleDriver成功."));HANDLE hDrv =CreateFile(TEXT("GEN0:"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORM AL,NULL);//以打开文件的方式打开流式驱动程序if(INVALID_HANDLE_VALUE == hDrv){OutputDebugString(L"Failed to open driver...\r\n");Add2List (hWnd, TEXT("Failed to open driver."));return 0;}else{OutputDebugString(L"succeed to open driver...\r\n");Add2List (hWnd, TEXT("File sent successfully."));}(4)实验结果及分析:答:(1)用VS 2008生成GenDriver.dll,位于CHS Windows Mobile 5.0 PocketPC R2 Emulator 仿真器中,具体位置: \我的设备\Program files\GenDriver.dll。
如图1所示。
将GenDriver.dll 复制到根目录下(\)图1生成的GenDriver.dll(2)修改CHS Windows Mobile 5.0 PocketPC R2 Emulator的注册表。
第一步:打开VS2008的远程注册表编辑器,打开设备CHS Windows Mobile 5.0 PocketPC R2 Emulator。
如图2所示图2VS2008的注册表远程编辑器第二步:在HKEY_LOCAL_MACHINE\Drivers\BuiltIn\下增加GenDriver,具体内容如下所示:HKEY_LOCAL_MACHINE\Drivers\BuiltIn\GENPrefix=GENDll=\GenDriver.dllFriendlyName=Simple DriverIndex=dword:0Order=dword:0最后,更新注册表(3)运行流式驱动程序的加载测试程序MySquit,运行结果如图3所示:图3GenDriver加载成功(4)通过VS2008的远程进程查看器,也可以证明驱动程序已经运行,如图4所示五.实验总结。