wince音频驱动 usb驱动

当前位置:
在WinCE 6.0系统下实现USB功能定制
USB的广泛应用就不用多说了,相信目前的各个领域的嵌入式产品中,很少有不用USB的。USB是主从结构的,分为USB Host和USB Slave,从USB1.0,USB1.1到现在的USB2.0,基于USB2.0还有USB OTG,也就是同时支持Host和Slave设备。
  USB OTG:  USB OTG控制器上层是USB OTG控制器的驱动,USB OTG Core Driver是协议层,如果做Host,它会使用USB Host协议栈,如果做Device,它会使用USB Device协议栈。  在WinCE中,根据需要来选择所需的USB功能,创建WinCE工程,然后在Catalog Items View中选择&Core OS&-》&CEBASE&-》&Core OS Services&-》&,如图:    ◆USB Function Driver:用于支持USB Device驱动。  ◆USB Host Support:用于支持USB Host控制器驱动。  ◆USB Human Input Device (HID) Class Driver:用于支持USB Host外接HID设备,可选择同时支持USB鼠标键盘,也可以分开选择。  ◆USB Printer Class Driver:用于支持USB Host打印功能。  ◆USB Remote NDIS Class Driver:用于支持USB Host连接RNDIS设备。  ◆USB Storage Class Driver:用于支持USB Host外接U盘的功能。  上面的选项除了USB Function Driver以外,都是用于支持USB Host应用的,可以根据自己平台的需要,选择相应的USB应用,也可以都选择。如果是USB Device设备,那么首先要选择上面提到的USB Function Driver,然后在Catalog Items View中选择&Device Drivers&-》&USB Function&-》& ,如图:    Mass Storage:用于支持USB Device作为U盘功能。  RNDIS Client:用于支持USB Device作为RNDIS设备。  Serial:用于支持USB Device作为串口设备。  对于USB Device设备,可以支持Mass Storage,RNDIS和Serial功能,不过同一个USB Device在系统启动以后只能支持某一个功能。  总结一下,无论是USB Host还是USB Device,只要驱动做好了,上层的应用在WinCE系统定制的时候,选择相应的组件就可以了。对于USB Device来说,根据组件的不同,还需要进行一些注册表的配置,我会在以后的blog中进行介绍。
责任编辑:Kevin
免责声明:
本文仅代表作者个人观点,与
OFweek电子工程网
无关。其原创性以及文中陈述文字和内容未经本站证实,
对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅
作参考,并请自行核实相关内容。
邮箱/用户名:
忘记密码?
用其他账号登录: QQ
请输入评论
上海市/黄浦区
江苏省/苏州市
广东省/深圳市
广东省/深圳市
江苏省/无锡市
江苏省/无锡市
江苏省/无锡市
广东省/深圳市
广东省/深圳市
广东省/深圳市21ic官方微信
WinCE的USB Camera流接口驱动开发
DWORD CAM_Init(LPCTSTR pContext,LPCVOIDIp VBusContext)
其中,pContext是系统自动传入的字符串内容,也是上面的键名,即[HKEY_LOCAL_MACHINE\Drivers\Active\N];CAM_Init要完成的就是在此键下读出设备上下文的指针,将其作为DWORD返回;IpvBusContext不用考虑。
在USBDeviceAttach()中,最后要完成的工作是在此函数内调用USBD模块的RegisterNotificationRoutine函数登记注册DeviceNotify函数。这个DeviceNotify函数是必需的,在设备被移走后,系统调用这个函数完成相应的善后工作。
BOOL WINAPI DeviceNotify(LPVOID lpvNotifyPa-rameter DWORD dwCode.LPDWORD
dwInf01.LPDW0RDdwlnfo2.LPDWORD dwlnfo3.LPDWORD dwlnfo4)
其中,IpvNotifyParameter是设备的上下文句柄,在RegisterNoticationRoutine中作为参数传入;dwCode是系统调用此函数的原因,如设备被移走,dwcode的值就为USB_CLOSE_DEVICE,相应的,用户进行卸载DLL工作;dwInfol,&,dwInfo4没有使用。
自此,系统在USBDeviceAttach中完成对所加USB外设的驱动加载。当有用户调用CreateFile函数,系统会将用户填入CreateFile()的参数值,直接传到CAM_Open()。
DWORD CAM_Open(DWORD hDeviceContext,DWORDAccessCode,DWORD ShareMode)
其中,hDeviceContext是驱动上下文句柄,由系统自动填充;AccessCode是访问模式,ShareMode是共享模式,均由CreateFile()传递过来;CAM_Open的工作是将hDe-viceContext以DWORD的形式返回,再作为CreateFile()的句柄值返回给用户。当用户调用CloseHandle()时,系统将直接调用CAM_Close(),用于关闭一个驱动程序。
B00L CAM_Close(DWORD hOpenContext)
其中,hOpenContext是设备驱动的引用事例句柄,由CAM_Open创建。本驱动中,所有对USB
Camera的操作均通过IOControl()映射到CAM_IOControl来完成。下面是CAM_IOControl的部分源码分析:
由于本驱动是针对USBCamera的,因此CAM_Write、CAM_Read、CAM_PowerUp、CAM_PowerDown并没有内容;但是只要用户调用WriteFile,系统就将映射到CAM_Write。其他函数类似。通常,Camera对图像的压缩采用标准是MJPEG算法。在Zc030x上正是采用这一算法完成对数据压缩的。只要在驱动上增加MJPEG的解码算法,还原压缩数据,就可以正确显示图像了。至此,整个USB
Camera的驱动编写工作完成。经过实验验证,已经实现了最高为25帧/s,大小为320&240的图片的传输。
本文介绍了WinCE5.0下USB设备驱动框架,结合USB
Camera的驱动开发实例说明了在USB驱动框架中驱动数据的流动方向,并已在中星微公司的301PLUS和303这两个系列的摄像头上得到成功运用和实践。所采用的程序设计方法及思想,对其他类似系统软件的设计也有较高的参考价值。WinCE第三方驱动安装之二——CAB安装包制作--技术天地
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。
  6、切换至CAB Properties-&Operating System对话框,设置操作系统版本,设置为支持CE4.0~CE5.0,如图6。设置完成后选择确认完成CAB包属性设置。
  7、为CAB包增加DLL文件,如图7,在File标签上点击右键,选择Add…添加USB转串口驱动的动态链接库文件usbser.dll。
  8、修改usbser.dll的安装路径,在图8中所示USBSER.DLL上点右键,选择Properties,在弹出的USBSER.DLL Properties对话框中设置usbser.dll的安装路径,如图9,选择%InstallDir%表示使用在第4点中设置的默认安装路径,即将usbser.dll安装到NandFlash\USBDriverDll目录。
  9、选择File-&Import-&Import form RGE...导入USB转串口驱动程序对应的注册表文件usbser.reg。在导入注册表时需要注意,第三方驱动默认安装目录往往是windows目录,因此需要在注册表文件中将动态链接库安装目录修改为在第4点中指定的目录NandFlash\USBDriverDll 。图10是注册表修改前后的对比。
  将上面的工作保存后,一个可在英创主板上安装的CAB包PL2303_Driver.CAB就制作完成了,下面结合英创工控主板EM9161,介绍PL2303_Driver.CAB的安装方法。  1、在EM9161的Nandflash目录下新建UsbDriverDll文件夹。  2、将制作好的CAB安装包PL2303_Driver.CAB拷贝到EM9161 Nandflash,双击运行,如图11,点击OK完成驱动程序的安装。
  对于英创公司其它没有WinCE标准显示界面的嵌入式主板EM9160、EM9260、EM9360可通过WinCE远程桌面实现CAB包安装,安装过程与EM9161一致。
产品及服务
英创手机网站
英创官方微信
英创淘宝店
英创新浪微博博客访问: 207148
博文数量: 72
博客积分: 2010
博客等级: 大尉
技术积分: 734
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: WINDOWS
随着USB2.0设备的不断增加,USB设备驱动开发在嵌入式开发中变的越来越重要。Windows CE支持USB 2.0更是对这一波新技术浪潮产生巨大的推动。近期我负责一个这样的项目,在WinCE下开发USB接口的外围设备驱动。当时做这个项目花费了我相当多的时间和精力,错走许多冤枉路使我精疲力尽。
& 项目需求是在已调好的ARM9板子上开发USB WiFi无线网卡的驱动程序,具体要求是驱动程序平台是WinCE,CPU类型支持ARM构架,要能比较方便地移植到X86;驱动接口类型是USB2.0和Wlan 802.11b。后来因为连接效率一直有问题,就东改西改,最后改的是一塌糊涂。幸好老板比较宽容,给了我充裕的时间和支持,这里将关于USB驱动开发的点滴理解与大家分享。
1.&什么是WinCE设备驱动程序?& (1)从驱动加载方式来区分& 在深入探讨Windows CE所支持的外围设备驱动程序之前,先了解在WinCE平台上使用的两种设备:内建设备和可安装设备。因此,从驱动加载方式来看WinCE可分为本机设备驱动(Built-In Driver)、可加载驱动(Loadable Driver)以及混合型驱动。
& ①本机设备驱动& 本机设备驱动即Native Device Drivers。WinCE设计成可直接使用内建设备,这些设备由本机驱动过程控制,而本机驱动程序又与WinCE的核心组件紧密相连。这些驱动对应的设备通常在系统启动时,在GWES的进程空间内被加载,因此它们不是以独立的DLL形式存在,也因此
要求每一个本机驱动程序都必须与称为设备驱动程序接口(DDI)的特定接口一致。
& 本机设备是指整合进平台的设备,其中包括显示、触摸面板、音频、串行埠、LED、电池和PC卡插座等。如果没有这些本机设备整个系统就不能和用户信息交流,例如触摸面板和显示等。本机驱动程序一般设计为动态链接库,但有两个例外:电池和LED驱动程序由于小而设计为静态库(当建立CE图像时与GWES模块链接)。这些设备相应的驱动程序是在WinCE平台开发过程中由OEM开发的,它们储存在ROM或闪存内。通常只有OEM才会对本机设备驱动程序进行修改,其它自由设备生产商只提供附加的硬件设备,对本机设备驱动程序不会有过多涉及。
& ②可加载设备驱动& 可加载设备是指可与平台连接和分离的第三方接口设备,可由用户随时安装和卸载。这种外围设备的驱动也被称为流驱动,这些驱动可以在系统启动时或者和启动后的任何时候由设备管理器动态加载。通常这类驱动是以DLL动态链接库的形式存在,系统加载后这些驱动程序也只是以用户态的角色运行。可加载驱动程序是通过文件操作API来从设备管理器和应用程序获得命令。在WinCE典型的可加载驱动有:PCMCIA driver(PCMCIA.dll)、Serial driver(SERIAL.dll)、ATAFLASH driver(ATA.dll)、Ethernet driver(NE2000.dll,SMSC100FD.dll)。
& 与本机驱动程序不同的是,所有可加载流驱动程序都共享一个公用接口。该接口由每个驱动程序内的10个功能或记录点组成,这些功能与应用程序所用的文件API中的功能匹配。因此,控制可加载设备的流接口驱动程序一般由应用程序存取,流接口驱动程序由一个特殊文件来将设备功能展现给应用程序的,该文件可被打开、读取、写入和关闭。例如,用户将一个GPS设备与平台相连后,就可启动有GPS功能的应用程序来存取并使用该设备。WinCE是使用已有的API来让应用程序存取这些驱动程序,而不是建立新的API。
(2)从驱动程序层次上分类& 一般可以分为独立驱动和层次型驱动两类。独立驱动程序是指将驱动程序编写成同时包含Model Device Driver(MDD)和Platform Dependent Driver(PDD)层的独立驱动。使用独立驱动的好处在于可以省去MDD和PDD层驱动之间的信息传递,这一点在实时处理中非常重要。独立驱动的代码包括中断服务例程和平台相关处理函数。另外,如果设备的操作和MDD驱动层的接口描述相吻合,用独立驱动程序可以提高处理性能。
& 层次型驱动是指分为两层,较上层的MDD和比较下层的PDD。MDD实现的是和平台无关的功能,它描述了一个通用的驱动程序框架;而PDD是和硬件以及平台相关的代码组成。MDD调用PDD中特定的接口来获取硬件相关的信息。当使用层次型驱动的时候,一般只需要基于相近的样列驱动程序,针对特定的硬件只修改PDD程序,MDD建立的框架可继续使用。但由于层次间接口的层层调用以及消息的传递,使得处理速度相对于独立驱动程序要慢。因此,在嵌入式实时要求苛刻的环境下,层次型驱动显得不是很适合。
& 简单的说,独立驱动是把PDD与MDD写在一起,没有做严格的区分,通常这种驱动比较简单,比如ATADISK。至于本机驱动和加载式流驱动是从驱动与系统其它模块(调用者)的接口形式上做的分类。所以,一个加载式驱动程序可以是独立的流式驱动,例如ATADISK;也可以是分层的流式驱动,例如OHCI。也就是说,独立和分层是驱动实现方式上的分类,而本机和加载流式则是驱动模型上的分类。所谓本机驱动就是操作系统有保留专门的接口,而加载流式驱动是指编写DLL文件导出各种流式接口函数的接口。
2. USB加载式流接口驱动要点分析& 为了支持不同类型的外围设备,WinCE平台提供了具有定制接口的流接口驱动程序模型。因为大部分USB外围设备由于功能性更适合流接口驱动的结构,所以一般都采用加载式流接口驱动程序模型来开发USB设备驱动程序。
& (1)USB系统结构分析& WinCE下USB系统软件由两层组成:较高USB设备驱动程序层和较低的USB函数层。较低的USB函数层本身又由两部分组成:较高的通用串行总线驱动程序(USBD)模块和较低的主控制器驱动程序(HCD)模块。通过HCD模块功能和USBD模块实现高层的USBD接口函数,USB设备驱动程序就能与外围设备进行通讯。
& 在数据传输的过程中,操作流程通常按下列的次序进行:①USB设备驱动程序进行数据传输的初始化,即通过USBD接口函数给USBD模块发送数据传输的请求。②USBD模块将该请求分成一些单独的事务。③HCD模块排出事务次序。④主控制器硬件执行事务。这里需要提醒的是,所有的事务都是从主机发出的,外围设备完全是被动接受型的。
& (2)USB设备驱动程序入口点函数& 从结构分析我们可知,所有的USB设备驱动程序必须在它们的DLL库设置一定的入口点与USBD模块进行适当的交互。设置入口点函数有两个作用:一是使得 USBD 模块能与外部设备
交互;二是使得驱动程序能创建和管理任何可能需要的注册键。
& 下面简要介绍相关函数的作用:USBDeviceAttach是当 USB 设备连接到主计算机时运行,USBD模块会调用这个函数初始化USB设备,取得USB设备信息和配置USB设备,并且申请必需的资源。USBInstallDrive是在第一次加载USB设备驱动程序时首先被调用,它使得驱动程序能创建需要的注册键,用于将一个驱动程序所需的注册表信息写入到HKEY_LOCAL_MACHINE\Drivers\USB\ClientDrivers目录下,例如设备名称等。需要注意的是,USB设备驱动程序不使用标准的注册表函数,而是使用RegisterClientDriverID()、RegisterClientSettings()函数来注册相应的设备信息。
& USBUninstallDriver是在用户删除USB设备驱动程序时调用,负责删除注册键并释放其它相关资源。它通过调用UnRegisterClientSettings()和UnRegisterClientDriverID()函数来删除由驱动程序的USBInstallDriver()函数创建的所有注册键。因此,我们在驱动程序中就需要严格按照这三个函数的原型来实现,否则就不能为设备管理器所识别。&
3.USB设备流接口驱动的实现步骤& 从WinCE USB设备驱动模型及结构分析中,我们可以清晰的看到主机和外设之间的实现方式。在主机端,通过USBD模块和HCD模块使用默认的PIPE访问一个通用的逻辑设备,实际上就是说USBD和HCD是一组访问所有USB设备的逻辑接口,它们负责管理所有USB设备的连接、加载、移除、数据传输和通用配置。其中HCD是主机控制驱动,是为USBD提供底层的功能访问服务,USBD是USB总线驱动,位于HCD的上层,利用HCD的服务提供较高层次的功能。因此,实现USB加载流驱动程序大致需要完成以下步骤:
& (1)选择代表设备的文件名前缀。前缀非常重要,设备管理器在注册表中通过前缀来识别
设备。同时,在流接口命名时也将这个前缀作为入口点函数的前缀,如果设备前缀为XXX,那么流接口对应为XXX_Close,XXX_Init等。
& (2)设置驱动的各个入口点函数。所谓入口点是指提供给设备管理器的标准文件I/O接口。在生成一个DLL后,就用设备文件名前缀替换名字中的XXX。因此,每个加载式流接口驱动程序必须实现XXX_Init()、XXX_IOControl()以及XXX_PowerUp()等一组标准的函数,用来完成标准的文件I/O函数和电源管理等。
& (3)建立.DEF文件。当设备管理器初始化USB设备编译出来的流接口函数后,还必须建立一个.def文件。DEF文件定义了DLL要导出的接口集,而且加载式流驱动大多是以DLL形式存在的,所以应将DLL和DEF的文件名统一起来。DEF文件告诉链接程序需要输出什么样的函数,最后将驱动程序编译到内核中去,这样这个USB设备流接口驱动程序就可以被应用程序调用。
& (4)在注册表中为驱动程序建立表项。在注册表中建立驱动程序入口点,这样设备管理器才能识别和管理这个驱动。此外,注册表中还能存储额外的信息,这些信息可以在驱动运行之后被使用到。
& 在这次USB驱动开发过程中,错走许多冤枉路使我叫苦连天。我感受最深的是由于WinCE提供了通用串行总线驱动程序(USBD)模块、USBD接口函数全集、样本主机控制器驱动程序(HCD)模块。所以,我们只需要根据USB设备硬件特性,利用USBD提供的不同函数,实现流接口函数与外围设备的交互。在没有特别的情况下,我最大的收获经验是把这些公用的源程序照搬过来,能极大的缩短开发周期,从而能更快速地进行嵌入式开发。
阅读(865) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 wince音频驱动 的文章

 

随机推荐