已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
WinCE5.0/6.0知识总结WinCE5.0/6.0知识总结-BSP在此处键入文档的摘要。摘要通常是对文档内容的简短总结。在此处键入文档的摘要。摘要通常是对文档内容的简短总结。Sky Xu QQ:1781548312009-1-20WinCE5.0/6.0知识总结目录WinCE5.0知识总结2第1章WinCE5.0简介41.1嵌入式系统基础知识41.2基于WinCE的嵌入式系统开发41.3相关的开发软件及说明41.3.1WinCE自带的远程工具及简介41.3.2其他相关的工具及简介4第2章WinCE5.0的体系结构和功能52.1系统架构52.2内存管理52.3进程、线程与调度52.4存储管理与文件系统52.4.1注册表52.5名词解析5第3章Platform Buider5.0的使用93.1如何创建一个工程及生成ImagePlatform Builder5.0各部分的功能和作用Platform Builder5.0的目录结构及包含的内容93.3.19第4章WinCE5.0的Bootloader10第5章WinCE5.0的OAL11第6章WinCE5.0的驱动程序126.1WinCE5.0驱动程序的基本知识126.1.1WinCE驱动程序开发简介126.1.2WinCE5.0驱动程序的宿主126.1.3驱动程序的分类136.1.4设备管理器136.1.5驱动程序的加载过程156.2各种驱动详解166.2.1USB Host Driver166.2.2Touch Pannel Driver216.2.3NandFlash Driver276.2.4LCD Driver276.2.5Serial port Driver276.2.6Bluetooth Driver276.2.7WiFi驱动276.2.8One-wire用于电量计的驱动28第7章名词解析29第8章问题集锦30第1章 WinCE5.0简介1.1 嵌入式系统基础知识1.2 基于WinCE的嵌入式系统开发1.3 相关的开发软件及说明1.3.1 WinCE自带的远程工具及简介1. ViewbinViewbin是微软提供的一个命令行工具,在WinCE6.0中,可以在WINCE600PUBLICCOMMONOAKBINI386找到他。Viewbin工具可以用来查看NK.bin文件。它可以从NK.bin中获得这个NK image的大小,运行的起始地址等。还能查看到里面所包含的模块,应用程序及相关的信息。Viewbin的使用格式如下:viewbin parameter filename举几个例子吧:1. viewbin -nk.binViewBin. nk.binImage Start = 0xC02C0000, length = 0x00D5E380Start address = 0xC02C1006Checking record #126 for potential TOC (ROMOFFSET = 0x40000000)Found pTOC = 0x8101c8d0ROMOFFSET = 0x40000000Done.这条命令可以查看NK image的起始地址,长度等信息,这些信息应该和config.bib文件中定义的一致。2. viewbin -t nk.bin output.txt这条命令可以将NK image里面包含的模块及相关信息列成一个表并输出到output.txt里面,这样打开output.txt就可以看到里面包含了哪些模块,其中包括驱动,应用程序等。3. viewbin -r nk.bin output.txt打印记录信息到output.txt中。1.3.2 其他相关的工具及简介第2章 WinCE5.0的体系结构和功能22.1 系统架构2.2 内存管理2.3 进程、线程与调度2.4 存储管理与文件系统2.4.1 注册表1. 注册表主要键的作用HKEY_LOCAL_MACHINEDriversActive:所有已经加载的驱动信息都放在该键下;HKEY_LOCAL_MACHINEDriversActive:所有要Device.exe加载的驱动都放在该键下面;2. 驱动主要键的作用1) DLL:指明了该驱动使用的动态库;2) Prefix:表明驱动的前缀,前缀通常是3个大写的英文字母,通过前缀就知道导出的函数,例如XXX.Init();3) Index:指定驱动程序的索引。如果为1,那么是CreateFile()函数时第一个参数必须为XXX1;4) Order:指明驱动程序的加载顺序。值越小加载得越早,这有助于解决驱动程序之间的依赖关系,比如A驱动要用到B驱动,那么可以把A驱动的Order设置得比B驱动大,让B驱动先起来;5) Friendly Name:是一个字符串,方便用户更好的理解;6) Ioctl:是一个可选项,设备管理器在驱动加载完毕后会检查这个键,如果有这个键,则通过DeviceIoControl()函数给设备发送Ioctl指定的控制命令;7) IClass:是个可选项,在处理即插即用提醒时用得到。如果设置了IClass,则在加载驱动程序时,会向注册的应用程序发出此IClass的提醒;3. Hive注册表和Ram注册表WinCE支持2种注册表类型:RAM-based注册表和Hive-based注册表。开发者可以决定设备采用何种类型的注册表,这对于应用开发者和使用者是透明的。RAM-Based注册表:RAM-Based注册表把注册表信息存放在内存的Object2.5 名词解析1. 同步与异步同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等下才去吃饭。在多数情况下,线程之间难免要相互通信、相互协调才能完成任务。比如,当有多个线程共同访问同一个资源时,就必须保证一个线程正读取这个资源数据的时候,其它线程不能够修改它。这就需要线程之间相互通信,了解对方的行为。 再有当一个线程要准备执行下一个任务之前,它必须等待另一个线程终止才能运行,这也需要彼此相互通信。 实际开发过程中,线程间需要同步的情况非常多。Windows CE.NET给我们提供了很多的同步机制,熟练的掌握这些机制并合理运用会使线程之间的同步更合理、更高效。进程间的通信机制在下一篇文章中讲解。Windows CE.NET具有两种运行模式:用户模式和内核模式。并且允许一个运行于用户模式的应用程序随时切换为内核模式,或切换回来。线程同步的有些解决办法运行在用户模式,有些运行在内核模式。Windows核心编程上说从用户模式切换到内核模式再切换回来至少要1000个CPU周期。我查看过CE下API函数SetKMode的源码,这个函数用于在两种模式间切换,改变模式只需修改一些标志,至于需要多少个CPU周期很难确定。但至少可以肯定来回切换是需要一定时间的。所以在选择同步机制上应该优先考虑运行在用户模式的同步解决办法。1、 互锁函数互锁函数运行在用户模式。它能保证当一个线程访问一个变量时,其它线程无法访问此变量,以确保变量值的唯一性。这种访问方式被称为原子访问。互锁函数及其功能见如下列表:函数参数和功能InterlockedIncrement参数为PLONG类型。此函数使一个LONG变量增1InterlockedDecrement参数为PLONG类型。此函数使一个LONG变量减1InterlockedExchangeAdd参数1为PLONG类型,参数2为LONG类型。此函数将参数2加到参数1指向的变量中InterlockedExchange参数1为PLONG类型,参数2为LONG类型。此函数将参数2的值赋给参数1指向的值InterlockedExchangePointer参数为PVOID* 类型,参数2为PVOID类型。此函数功能同上。具体参见帮助InterlockedCompareExchange参数1为PLONG类型,参数2为LONG类型,参数3为LONG类型。此函数将参数1指向的值与参数3比较,相同则把参数2的值赋给参数1指向的值。不相同则不变InterlockedCompareExchangePointer参数1为PVOID* 类型,参数2为PVOID类型,参数3为PVOID。此函数功能同上。具体参见帮助2、 临界区临界区对象运行在用户模式。它能保证在临界区内所有被访问的资源不被其它线程访问,直到当前线程执行完临界区代码。除了API外,MFC也对临界区函数进行了封装。临界区相关函数:void InitializeCriticalSection ( LPCRITICAL_SECTION );void EnterCriticalSection ( LPCRITICAL_SECTION );void LeaveCriticalSection ( LPCRITICAL_SECTION );void DeleteCriticalSection ( LPCRITICAL_SECTION );举例如下:void CriticalSectionExample (void)CRITICAL_SECTION csMyCriticalSection;InitializeCriticalSection (&csMyCriticalSection); /初始化临界区变量_tryEnterCriticalSection (&csMyCriticalSection); /开始保护机制/此处编写代码_finally /异常处理,无论是否异常都执行此段代码LeaveCriticalSection (&csMyCriticalSection); /撤销保护机制MFC类使用更简单: CCriticalSection cs;cs.Lock();/编写代码cs.Unlock();使用临界区要注意的是避免死锁。当有两个线程,每个线程都有临界区,而且临界区保护的资源有相同的时候,这时就要在编写代码时多加考虑。3、事件对象事件对象运行在内核模式。与用户模式不同,内核模式下线程利用等待函数来等待所需要的事件、信号,这个等待过程由操作系统内核来完成,而线程处于睡眠状态,当接收到信号后,内核恢复线程的运行。内核模式的优点是线程在等待过程中并不浪费CPU时间,缺点是从用户模式切换到内核模式需要一定的时间,而且还要切换回来。在讲解事件对象前应该先谈谈等待函数。等待函数有四个。具体参数和功能见下表:函数参数和功能WaitForSingleObject参数1为HANDLE类型,参数2为DWORD类型。此函数等待参数1标识的事件,等待时间为参数2的值,单位ms。如果不超时,当事件成为有信号状态时,线程唤醒继续运行。WaitForMultipleObjects参数1为DWORD类型,参数2为HANDLE * 类型,参数3为BOOL类型,参数4为DWORD类型。此函数等待参数2指向的数组中包含的所有事件。如果不超时,当参数3为FALSE时,只要有一个事件处于有信号状态,函数就返回这个事件的索引。参数3为TRUE时,等待所有事件都处于有信号状态时才返回。MsgWaitForMultipleObjects参数1为DWORD类型,参数2为LPHANDLE类型,参数3为BOOL类型,参数4为DWORD类型,参数5为DWORD类型。此函数功能上同WaitForMultipleObjects函数相似,只是多了一个唤醒掩码。唤醒掩码都是和消息有关的。此函数不但能够为事件等待,还能为特定的消息等待。其实这个函数就是专为等待消息而定义的。MsgWaitForMultipleObjectsEx参数1为DWORD类型,参数2为LPHANDLE类型,参数3为DWORD类型,参数4为DWORD类型,参数5为DWORD类型。此函数是MsgWaitForMultipleObjects函数的扩展。将原来函数的参数3除掉,添加参数5为标志。标志有两个值:0或MWMO_INPUTAVAILABLE。如果一个线程既要执行大量任务同时又要响应用户的按键消息,这两个专用于等待消息的函数将非常有用。和事件有关的函数有:HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset, BOOL bInitialState, LPTSTR lpName);BOOL SetEvent(HANDLE hEvent );BOOL PulseEvent(HANDLE hEvent);BOOL ResetEvent(HANDLE hEvent);HANDLE OpenEvent(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName );事件对象是最常用的内核模式同步方法。它包含一个使用计数和两个BOOL变量。其中一个BOOL变量指定这个事件对象是自动重置还是手工重置。另一个BOOL变量指定当前事件对象处于有信号状态还是无信号状态。函数CreateEvent创建一个事件对象,参数1必须为NULL,参数2指定是否手工重新设置事件对象的状态。如果为FALSE,当等待函数接到信号并返回后此事件对象被自动置为无信号状态。这时等待此事件对象的其它线程就不会被唤醒,因为事件对象已经被置为无信号状态。如果参数2设置为TRUE,当等待函数接到信号并返回后事件对象不会被自动置于无信号状态,其它等待此事件对象的线程都能够被唤醒。用ResetEvent函数可以手工将事件对象置为无信号状态。相反SetEvent函数将事件对象置为有信号状态。PulseEvent函数将事件对象置为有信号状态,然后立即置为无信号状态,在实际开发中这个函数很少使用。OpenEvent函数打开已经创建的事件对象,一般用于不同进程内的线程同步。在调用CreateEvent创建一个事件对象时,传递一个名字给参数4,这样在其它进程中的线程就可以调用OpenEvent函数并指定事件对象的名字,来访问这个事件对象。第3章 Platform Buider5.0的使用33.1 如何创建一个工程及生成Image Platform Builder5.0各部分的功能和作用 Platform Builder5.0的目录结构及包含的内容3.3.1第4章 WinCE5.0的Bootloader第5章 WinCE5.0的OAL第6章 WinCE5.0的驱动程序4566.1 WinCE5.0驱动程序的基本知识6.1.1 WinCE驱动程序开发简介操作硬件是驱动开发的首要任务。在WinCE5.0下所有的驱动都以用户态的DLL文件形式存在。WinCE驱动程序用到的方法及工具与编写其他任何一个普通的DLL没有什么区别。与所有Win32 DLL一样,Windows CE驱动程序DLL中的代码要得以运行,必须被一些进程动态加载到地址空间。优点:1) 灵活性,运行时动态加载,这样可以轻松实现外设的即插即用。2) 稳定性,因为放在内核态虽然是程序运行的更快,但在内核态的驱动如果出现崩溃会导致系统崩溃,但处于用户态的驱动程序即使崩溃也不会影响到内核。6.1.2 WinCE5.0驱动程序的宿主上文提到DLL文件本身是无法运行的,如果要运行DLL中的代码,必须先有一个exe进程,把 DLL加载到自己的地址空间内,然后才可执行DLL中的代码。在WinCE5.0中,有3个系统的进程会加载和执行驱动程序的DLL。它们是Device.exe,GWES.exe和FileSys.exe。它们各自加载的驱动程序类型如下图。Device.exe网卡电池声卡串口NLEDPCIUSB HostHIDPrinterrNDISMass StoragePCMCIAHostATADiskSerCardGWES.exe鼠标驱动键盘驱动触摸屏驱动打印机驱动显示驱动FileSys.exe文件系统驱动系统进程与其加载的驱动程序1) Device.exe:设备管理器,负责加载WinCE下绝大多数的设备驱动程序;2) GWES.exe:加载的驱动程序是一些和图形界面相关的I/O设备驱动程序;3) FileSys.exe:负责加载所有的文件系统驱动程序。6.1.3 驱动程序的分类1. 内建的驱动程序与可安装的驱动程序内建驱动程序有时也称为本地驱动程序,它们被静态地链接到GWES;可安装的驱动程序也称为流设备驱动程序,他们是由设备管理器动态加载的用户模式的DLL。2. 分层的驱动程序和不分层的驱动程序这是根据驱动的结构来分类的。分层驱动程序GWESDDI函数DDI函数MDDDDSI函数PDD单体驱动程序Hardware单体驱动程序与分层驱动程序6.1.4 设备管理器1. 简介在WinCE中,系统进程Device.exe负责对几乎所有的外设驱动程序进行管理,它也被称为设备管理器。严格来说,设备管理器不是WinCE操作系统内核的一部分,仅仅是一个用户态下的普通进程,而且没有设备管理器WinCE也一样可以启动、运行。但设备管理器在WinCE中的作用却非常重要。在WinCE系统启动时,设备管理器会随着启动,并且在整个系统运行时都会持续运行。在Commom.reg中可以看到device.exe的启动:HKEY_LOCAL_MACHINEinitIF IMGCELOGENABLE; At most one CeLog flush app (CeLogFlush, OSCapture) can be usedIF IMGAUTOFLUSH Launch05=CeLogFlush.exeENDIFIF IMGOSCAPTURE Launch05=OSCapture.exeENDIFENDIF; CESYSGEN IF CE_MODULES_SHELLIF IMGNOKITL ! Launch10=shell.exeENDIF IMGNOKITL !; CESYSGEN ENDIF; CESYSGEN IF CE_MODULES_DEVICE Launch20=device.exe/可见device.exe是在系统启动后才被操作系统启动的。; CESYSGEN IF CE_MODULES_SHELLIF IMGNOKITL !Depend20=hex:0a,00/说明Device.exe依赖于shell.exe,只有shell.exe启动之后才能启动。ENDIF IMGNOKITL !2. Device.exe的初始化对于不同的操作系统,设备与驱动程序的初始化几乎都是不一致的。在Windows CE中,设备的初始化分两个阶段:第一阶段是Device.exe的初始化;第二阶段是外设的枚举和加载。我们这里先讲Device.exe的初始化,用下面一张图来描述:1) 当系统冷启动后,操作系统内核NK首先运行,然后NK根据注册表HKEY_LOCAL_MACHINEinit下的内容陆续启动一些其他进程,Device.exe进程也是在这个时候被启动;2) 当Device.exe启动后,进行一系列自身的初始化工作,以便完成设备管理功能。按照顺序,Device.exe会先初始化本身的一些数据结构,再初始化I/O资源管理器和电源管理器;3) 接着,Device.exe根据注册表的设置,加载c,让BusEnum.dll负责加载和初始化所有的内置设备。至此,控制权就交给了BusEnum.dll,Device.exe本身的初始化就结束了。内核Device.exeI/O资源管理器Iorm.lib电源管理器pm.dll总线枚举器BusEnum.dllPCIBUS.dllDevice.exe的初始化顺序图6.1.5 驱动程序的加载过程加载加载加载加载Device.exeBusEnum.dllBusEnum.dll(加载ISA设备驱动)PCIBus.dllNE2000.dllxxx.dll总线枚举过程驱动程序的加载过程如下:当在OAL中的OEMInit运行时,需要启动以太网调试、串口调试等调试服务;OAL可能需要配置和列举一个总线,如PCI总线,以便操作一个用于调试的设备;OAL负责将这个资源信息放到一个注册表键,并使驱动程序可访问它。然后,Device.exe被加载和启动,它加载资源管理器以从注册表读取一个可用的资源列表。Device.exe从HKEY_LOCAL_MACHINEDriversRootkKey加载注册表枚举器,注册表枚举器开始扫描注册表过程,以获得由RootKey下的子键加载的更多总线和设备。注册表枚举器被用于替代一个ISA总线驱动。所有ISA资源都必须通过注册表来分配,RegEnum.dll(BusEnum.dll)也能被列举ISA设备的注册表。Drivers的一个子键可以是PCI,通常,在PCI键下列出的DLL是PCI总线驱动PCIBUS.dll,它由注册表枚举器加载。PCI总线驱动的注册表入口是包括PCI总线可用的资源。通常设置HKEY_LOCAL_MACHINEDriversRootKeyOrder是为了在最后加载PCI总线驱动。这是为了在配置灵活的PCI设备资源之前先分配固定的资源,PCI设备驱动程序的注册表入口列在PCI键之下,它代表驻留在PCI总线上的设备。6.2 各种驱动详解6.2.1 USB Host Driver1. 简介 EHCI、OHCI、UHCIUSB有三种协议:USB2.0(高速,全速,低速),USB1.1(全速,低速),USB1.0(低速); USB1.01.5Mb/sUSB1.112Mbps12Mb/sUSB2.0480Mbps60Mb/sUSB有三种主控制器规范:EHCI,OHCI,UHCI;EHCI:是用于USB2.0的高速主机的规范OHCI:支持USB1.1的全速和低速规范,OHCI则把较多的功能定义在硬件中,软件需要处理的内容就相对容易,对系统的处理能力和系统资源的要求就低。因此,在嵌入式的USBHOST功能中,较多地选用了遵循OHCI的规范的硬件,从而简化了系统的设计。UHCI:支持USB1.1的全速和低速规范,UHCI对硬件的要求相对较少,但对系统的处理能力与软件的开发要求相对要高(PC机就较多地采用了UHCI);USB2.0中兼容了1.1s、1.0,也就是支持了高速全速低速,EHCI只支持2.0里面的高速规范,如果要兼容全速和低速规范就得添加对OHCI或UHCI的支持。2. USB Host驱动操作的硬件WinCE5.0的USB Host驱动操作的硬件就是usb的主控制器,usb的主控制器硬件有三种,分别是OHCI,UHCI,EHCI。这三种主控制器支持的协议有所不同。但主控制器的控制是通过芯片的寄存器来控制的,比如S3c2440芯片内USB部分的寄存器。3. WinCE5.0下USB Host驱动模型 USB主机和物理外设之间的结构在此图中,我们可以非常清晰的看到主机和物理外设之间的结构方式,在主机端,通过USBD模块和HCD模块使用默认的PIPE访问一个通用的逻辑设备,实际上就是说USBD和HCD是一组抽象出来的访问所有USB设备的逻辑接口,它们负责管理所有USB设备的连接、加载、移除、数据传输和通用的配置。其中HCD是主机控制驱动,是为USBD提供底层的功能访问服务,USBD是USB总线驱动,位于HCD的上层,利用HCD的服务提供较高层次抽象的功能。由于HCD和USBD都是面向的一致的逻辑设备接口,那么对于各种各样的物理设备,就需要有唯一对应的设备驱动程序,这就是上图中最上层的特殊的PIPE所连接的物理设备和USB设备驱动程序。有了对这个结构的认识,我们可以明确的是我们要写的就是最上端的USB设备驱动程序,在WINCE的样例程序中也称为USB Client Driver,它是工作于USBD之上,所以实际上我们的工作就变成了利用USBD提供的接口针对特定的物理设备来完成USB设备驱动程序,而暂时与其他的部分无关。 WinCE5.0下USB驱动的结构Client Driver(HID|Print|MassStorage)USBDHCD(OHCI|EHCI|UHCI)WinCE5.0的USB驱动结构分成两层,上层的USB设备驱动程序层(Client Driver)和下层的USB驱动函数层。USB函数层本身又由两部分组成较高的通用串行总线驱动程序(USBD)模块和较低的主控制器驱动程序(HCD)模块。依据HCD模块提供的功能,USBD模块实现高层的USBD接口函数。USB设备驱动程序使用USBD接口函数与它们的外围设备进行通讯。Client Driver调用USBD提供的函数接口实现相关的功能,HCD直接面向硬件部分,并给USBD提供相应的函数接口。USBD层一般是通用的,不管HCD层和Client层的变化;HCD层一般有三种,分别对应三种不同的寄存器(OHCI,EHCI,UHCI);Client层是USB设备的各种驱动,比如打印机驱动,存储卡驱动,鼠标键盘驱动等等。WinCE5.0 USB驱动结构4. WinCE5.0操作系统下USB驱动的工作机制 USB检测设备插入监测机制首先,在USB集线器的每个下游端口的D+和D-上,分别接了一个15K欧姆的下拉电阻到地。这样,在集线器的端口悬空时,就被这两个下拉电阻拉到了低电平。而在USB设备端,在D+或者D-上接了1.5K欧姆上拉电阻。对于全速和高速设备,上拉电阻是接在D+上;而低速设备则是上拉电阻接在D-上。这样,当设备插入到集线器时,由1.5K的上拉电阻和15K的下拉电阻分压,结果就将差分数据线中的一条拉高了。集线器检测到这个状态后,它就报告给USB主控制器(或者通过它上一层的集线器报告给USB主控制器),这样就检测到设备的插入了。USB高速设备先是被识别为全速设备,然后通过HOST和DEVICE两者之间的确认,再切换到高速模式的。在高速模式下,是电流传输模式,这时将D+上的上拉电阻断开。一个简单的实验:只用一个上拉电阻接在USB的+5V和D+或者D-上,WINDOWS也会提示发现新硬件,但是无法找到驱动程序。这时去设备管理器里面看,有显示未知USB设备,并且其VID和PID为0。根据这个,我们可以简单的判断设备是否枚举成功。如下图所示,分别是枚举不成功和枚举成功的图。 USB驱动的加载流程Device.exeBusEnum.dllOHCI.dllUSBD.dllPrintHIDMASS12如左图划分为两个部分,第一部分是随着WinCE5.0操作系统启动的,第二部分是根据总线上的设备插入而启动的。Device.exe启动后会调用BusEnum.dll来枚举DriversBuiltIn下面的驱动,这时候OHCI.dll被枚举到并启动;OHCI.dll自身启动调用初始化函数Hcd_Init()-HcdPdd_Init();初始化的过程中会调用MDD函数HcdMdd_CreateHcdObject,这个函数会启动usbd.dll,所以usbd.dll是由ohci.dll启动的,而不是放在BuiltIn下面由BusEnum.dll直接枚举启动的。如果总线上没有Device,那么USB驱动启动到这就结束。第二部分是在总线上有设备的时候才会启动的,启动的详细流程放在加载设备驱动的流程里再详细描述。USB驱动的加载流程 设备加载流程U盘插入OHCI.dll监测到USBD.dll枚举Usbmsc.dll判断Usbdisk6.dll前提假设:假设插入的是U盘;假设主控制器是OHCI。以这个假设来分析,如果换成别的控制器或者别的设备流程也是一样的。1. U盘插入后,USB接口因为D+、D-信号线状态的变化知道有设备插入,并把寄存器的标识位置为1;2. 当ohci.dll里面的监测线程监测到设备插入后,调用相关函数3. Usbd.dll对client的driver进行枚举,当枚举到存储卡驱动时调用usbmsc.dll驱动里面的USBDeviceAttach,这里对设备的信息进行判断,如果被认为是存储设备,则usbmsc.dll调用usbdisk.dll和存储设备进行匹配。补充:usbd的枚举是在注册表的Client Driver下面逐个加载调用USBDeviceAttach函数,如果和设备不匹配就继续枚举下一个。如果匹配就加载当前驱动。设备加载流程 设备控制流程Client DriverUSBD.dllOhci.dllHardware在数据传输的过程中,操作流程通常按下列的次序进行:1USB设备驱动程序进行数据传输的初始化,即通过使用USBD接口函数给USBD模块发送数据传输的请求。2基于有关总线的情况与总线相连的USB设备的特性,USBD模块将该请求分成一些单独的事务。3HCD模块排好事务通过总线的次序。4主控制器硬件执行或完成这些事务。所有的总线上的事务都是从主机一侧发出的,外围设备完全是依赖的。设备控制流程5. 样本程序结构分析Client DriverUSBDHCD1. MASS Storage(publiccommonoakdriversusbCLASSSTORAGE)2. HID(publiccommonoakdriversusbCLASSHID)3. Printer(publiccommonoakdriversusbCLASSPRINTER)USBD(WINCE500publiccommonoakdriversusbUSBD)1. OHCI(WINCE500publiccommonoakdriversusbHCD)2. UHCI(WINCE500publiccommonoakdriversusbHCD)3. EHCI(WINCE500publiccommonoakdriversusbHCD)USB样本程序结构 Mass Storage USBD OHCIHcdPddHcdMddOHCIOCHI由MDD、PDD两层组成,MDD层被Microsoft封装起来了,只需要在sources下面包含就可以。PDD层是标准的流接口驱动模式。PDD和MDD整合编译之后导出的也是标准的流接口模式;LIBRARY OHCDEXPORTS HCD_Init HCD_PowerUp HCD_PowerDown HCD_Deinit HCD_Open HCD_Close HCD_Read HCD_Write HCD_Seek HCD_IOControl1. HCD_Init初始化函数,MDD层部分看不到,但最终会调用PDD层的HcdPdd_Init()进行初始化,接下来详细分析HcdPdd_Init,总结出USB初始化的流程。6. 如何设计USB的Client Driver7. USB的相关问题 USB电流问题USB PC端供电不会超过500mA,如果需要超过500mA的供电会导致设备不稳定,解决的方法用电池给USB设备单独供电;(低电量模式100mA/及高电量模式500mA两种) USB传输数据包大小问题发送给FIFO Buff的数据包不应该大于Buff的最大值,超过了会导致数据传输速率下降,在3.5G驱动开发的时候遇到这个问题,就是由于WinCE5.0的FIFO Buff太小导致6.0移植过来的驱动传输速率很慢,但只要修改了FIFO Buff的大小就可以了; USB2.0_OTGUSB OTG(On-The-Go)是USB 2.0规范的补充,它使外设可以在无主机参与的情况下直接互连进行通信6.2.2 Touch Pannel Driver1. 简介 触摸屏工作原理触摸屏的基本原理是,用手指或其他物体触摸安装在显示器前端的触摸屏时,所触摸的位置(以坐标形式)由触摸屏控制器检测,并通过接口(如RS-232串行口)送到CPU,从而确定输入的信息。触摸屏控制器触摸检测装置CPU触摸屏系统一般包括触摸屏控制器(卡)和触摸检测装置两个部分。触摸屏控制器(卡)的主要作用是从触摸点检测装置上接收触摸信息,并将它转换成触点坐标,再送给CPU,它同时能接收CPU发来的命令并加以执行:触摸检测装置一般安装在显示器的前端,主要作用是检测用户的触摸位置,并传送给触摸屏控制卡。触摸屏的硬件组成 触摸屏的主要类型按照触摸屏的工作原理和传输信息的介质,我们把触摸屏分为四种,它们分别为电阻式、电容感应式、红外线式以及表面声波式。每一类触摸屏都有其各自的优缺点,要了解那种触摸屏适用于那种场合,关键就在于要懂得每一类触摸屏技术的工作原理和特点。下面对上述的各种类型的触摸屏进行简要介绍一下:a) 电阻式触摸屏这种触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层涂层、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘。 当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再根据模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。大部分厂商采用5v的电压。b) 电容式触摸屏是利用人体的电流感应进行工作的。电容式触摸屏是是一块四层复合玻璃屏,玻璃屏的内表面和夹层各涂有一层ITO,最外层是一薄层矽土玻璃保护层,夹层ITO涂层作为工作面,四个角上引出四个电极,内层ITO为屏蔽层以保证良好的工作环境。 当手指触摸在金属层上时,由于人体电场,用户和触摸屏表面形成以一个耦合电容,对于高频电流来说,电容是直接导体,于是手指从接触点吸走一个很小的电流。这个电流分从触摸屏的四角上的电极中流出,并且流经这四个电极的电流与手指到四角的距离成正比,控制器通过对这四个电流比例的精确计算,得出触摸点的坐标值。从使用角度看,电容式触控屏比电阻式触摸屏的性能更好。由于轻触甚至不用接触就能产生感应,用户操作时无需尖锐的触控笔,直接用手指来操作,对屏幕表面几乎没有磨损,因此电容式触摸屏的使用寿命更长。iPhone和Surface都使用了电容式触摸屏,而且我们相信,在未来的触控系统中电容式触摸屏将会有长足的进步。c) 红外触摸屏红外触摸屏是利用X、Y方向上密布的红外线矩阵来检测并定位用户的触摸。红外触摸屏在显示器的前面安装一个电路板外框,电路板在屏幕四边排布红外发射管和红外接收管,一一对应形成横竖交叉的红外线矩阵。用户在触摸屏幕时,手指就会挡住经过该位置的横竖两条红外线,因而可以判断出触摸点在屏幕的位置。任何触摸物体都可改变触点上的红外线而实现触摸屏操作。 早期观念上,红外触摸屏存在分辨率低、触摸方式受限制和易受环境干扰而误动作等技术上的局限,因而一度淡出过市场。此后第二代红外屏部分解决了抗光干扰的问题,第三代和第四代在提升分辨率和稳定性能上亦有所改进,但都没有在关键指标或综合性能上有质的飞跃。但是,了解触摸屏技术的人都知道,红外触摸屏不受电流、电压和静电干扰,适宜恶劣的环境条件,红外线技术是触摸屏产品最终的发展趋势。采用声学和其它材料学技术的触屏都有其难以逾越的屏障,如单一传感器的受损、老化,触摸界面怕受污染、破坏性使用,维护繁杂等等问题。红外线触摸屏只要真正实现了高稳定性能和高分辨率,必将替代其它技术产品而成为触摸屏市场主流。 过去的红外触摸屏的分辨率由框架中的红外对管数目决定,因此分辨率较低,市场上主要国内产品为32x32、40X32,另外还有说红外屏对光照环境因素比较敏感,在光照变化较大时会误判甚至死机。这些正是国外非红外触摸屏的国内代理商销售宣传的红外屏的弱点。而最新的技术第五代红外屏的分辨率取决于红外对管数目、扫描频率以及差值算法,分辨率已经达到了1000X720,至于说红外屏在光照条件下不稳定,从第二代红外触摸屏开始,就已经较好的克服了抗光干扰这个弱点。 第五代红外线触摸屏是全新一代的智能技术产品,它实现了1000*720高分辨率、多层次自调节和自恢复的硬件适应能力和高度智能化的判别识别,可长时间在各种恶劣环境下任意使用。并且可针对用户定制扩充功能,如网络控制、声感应、人体接近感应、用户软件加密保护、红外数据传输等。 原来媒体宣传的红外触摸屏另外一个主要缺点是抗暴性差,其实红外屏完全可以选用任何客户认为满意的防暴玻璃而不会增加太多的成本和影响使用性能,这是其他的触摸屏所无法效仿的。d) 表面声波触摸屏表面声波触摸屏的三个角分别粘贴着X、Y方向的发射和接收声波的换能器,四个边刻着反射表面超声波的反射条纹。当手指或软性物体触摸屏幕,部分声波能量被吸收,于是改变了接收信号的强度,通过控制器对接收信号的强度进行分析就可以得到触摸点的X、Y坐标。2. Touch panel driver操作的硬件驱动操作的硬件是触摸屏控制器,以s3c2440为例,内部已经集成了触摸屏的控制器,驱动通过设置相关的寄存器来操作触摸屏控制器。XMYMXPYPS3c2440Touch pannel4线电阻式触摸屏,控制器集成在s3c2440内部,通过设置内部的寄存器就可以操作触摸屏的控制器。4线电阻式触摸屏电路以S3c2440作为例子详细描述相关的寄存器:REGRemarksControlADCCONADC control registerADCTSCADC touch screen control registerADCDLYADC start delay registerDataADCDAT0ADC conversion data registerADCDAT1ADC conversion data registerADCUPDNStylus up or down interrupt status register3. WinCE5.0下Touch panel driver模型 Touch Panel模型DDIDDSIGWESMDDPDDGWESWinCE中的GWES模块负责加载和管理Touch Panel驱动,Touch Panel的MDD层向上提供DDI接口,PDD层是针对硬件的实现,对MDD层提供DDSI接口。Touch Panel驱动接收用户的触摸信息,并将其转换为屏幕上的坐标信息,传给GWES模块。在WinCE中,Touch Panel驱动是分层的,分为MDD层和PDD层,这和其他WinCE设备驱动是一样的。MDD层由微软提供,用户只需要实现MDD和PDD层间的DDSI函数就可以了。Touch Panel驱动结构4. WinCE5.0下Touch pannel工作机制5. Samples程序分析 Touch Pa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肿瘤筛查的护理个案
- 大脑前动脉狭窄的护理
- 2026年网络预约出租汽车驾驶员从业资格考试题库含答案【考试直接用】
- 2025贵州黔南州粮油储备库主任选聘笔试模拟试卷附答案解析
- 2026天津市定向同济大学招录选调生历年真题汇编附答案解析(夺冠)
- 2025北京大学人事部大数据分析与应用技术国家工程实验室招聘劳动合同制工作人员1人笔试模拟试卷带答案解析
- 全球环境基金“长江经济带生物多样性就地保护”项目招聘3人备考题库附答案
- 浙江国企招聘-2025台州市椒江城市发展投资集团有限公司台州市高铁新区开发建设有限公司公开招聘工作人员及特殊人才14人历年真题汇编带答案解析
- 2026年国家家能源投资集团有限责任公司高校毕业生直招备考题库(900人)附答案
- 2026年陕西省选调生招录(面向厦门大学)笔试模拟试卷附答案解析
- 音乐学专业就业规划
- 家电维修人员技能培训模式创新研究
- 培训机构教务老师的工作内容与职责
- 房地产精装装修培训讲师
- JJF(京) 77-2021 真空干燥箱校准规范
- 2024年人教版四年级上册道德与法治知识点(背诵资料)
- 《跨文化传播教程》全套教学课件
- SH/T 0358-199510号航空液压油
- GB/T 15597.1-2024塑料聚甲基丙烯酸甲酯(PMMA)模塑和挤出材料第1部分:命名系统和分类基础
- JTG-3830-2018公路工程建设项目概算预算编制办法
- JGJ33-2012 建筑机械使用安全技术规程
评论
0/150
提交评论