欢迎来到天天文库
浏览记录
ID:1539088
大小:66.83 KB
页数:19页
时间:2017-11-12
《vxworks-usb-mouse-driver分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Vxworksusbmouse驱动分析概述:最近在做嵌入式vxworks下usb触摸屏设计,参考了vxworks里面的usbmouse驱动的代码,分析了usbmouse驱动,根据自己的理解,写这个文档。如有任何问题请联系yxj_5421@163.com,转载请标明出处。系统资源:Vxworks6.71、USB主机驱动栈模型原理USB主机驱动栈模型下图所示:1.1硬件层在USB主机驱动栈的最底部是USB主控制器(USBHC,即USBHostController)。目前,USB主控制器可分为三类:通用型主控制器接口(UHCI)、开放型主控制器接口(OHCI)和增强型主控制接口和增
2、强型主控制接口(EHCI)。其中,UHCI和OHCl支持USBl.1低速接口,EHCl支持USB2.0高速接口。1.2主控制器驱动层对予每一类型的主控制器都有一个与硬件独立的USB主控制器驱动(HostControllerDriver,简称HCD)。WindRiver提供了两个驱动:usbHedUheiLib(UHCI主控制器库)和usbHcdohciLib(OHCl主控制器库)。该模块向下直接与USB主控制器硬件进行交互操作,向上与USBD层的功能接口,提供各种功能函数的调用,支持对上层模块封装具体的HCD驱动的实现。1.3USB核心驱动层USB核心驱动(USBhostdr
3、iver,简称USBD)模块实现USB的核心驱动,包括USB总线的枚举、总线带宽分配、传输控制等操作。该模块向下调用HCD接口模块,实现与HCD层的通信,将设备驱动的功能请求转化为相应功能模块的调用。USBD管理每一个与主机相连的USB设备,还负责自动处理USB电力管理和带宽管理及USBhub和设备的动态插拔。1.4USB设备驱动层USB设备驱动层负责管理连接到USB上的不同类型的设备,它们依靠USBD来提供与每个设备的通信路径,主要实现USB设备的一些特定初始化工作,并将上层用户应用程序的请求转化为对相应的USBD驱动程序的调用。该层通过对应用层提供API函数,从而屏蔽US
4、B实现的细节。1.5应用层应用层为用户编写的对USB设备进行读、写控制等指定功能的应用程序,应用层通过设备驱动程序和USB主机驱动程序完成指定的功能。2、USBmouse驱动分析Usbmouse驱动属于设备驱动层,在vxworks里面,把usbmouse驱动设计成两层,即文件层+驱动层,文件层对上提供read、write、ioctl等接口,对下调用驱动层提供函数进行硬件初始化,对应的源代码是usrUsbMseInit.c(targetconfigcompssrc)。驱动层则针对具体usb设备初始化,获取数据等。2.1文件层usrUsbMseInit.c分析在usrRoo
5、t(usrConfig.c(targetconfigall))调用#ifdefINCLUDE_USB_MOUSE_INITusrUsbMseInit();/*MouseDriverInitialization*/#endifusrUsbMseInit(usrUsbMseInit.c(targetconfigcompssrc))驱动程序入口点,首先检查driver是否已经安装,如果安装就退出if(usbMseDrvNum>0){printf("Mousealreadyinitilaized.");returnERROR;}接着调用usbMseDrvNum=iosD
6、rvInstall((FUNCPTR)NULL,(FUNCPTR)usbMseDevDelete,(FUNCPTR)usbMseOpen,(FUNCPTR)usbMseClose,(FUNCPTR)usbMseRead,(FUNCPTR)usbMseWrite,(FUNCPTR)usbMseIoctl);安装驱动的I/O函数,添加驱动到驱动表里面接着调用驱动层初始化函数if(usbMouseDevInit()==OK)usbMouseLib.c(targetsrcdrvusb){printf("usbMouseDevInit()returnedOK");这个函数如果
7、成功,会输出打印上面的信息表明驱动已经加载,并且和usb设备已经匹配上。接着调用驱动层动态注册函数if(usbMouseDynamicAttachRegister(usbMseDrvAttachCallback,(void*)NULL)!=OK)usbMouseLib.c(targetsrcdrvusb)这个函数会把usbMseDrvAttachCallback保存在驱动层创建的一个队列里面,当usb设备热插拔时,都会调用这个函数。如果已经插入了usbmouse,就会马上调用usbMseDrvAt
此文档下载收益归作者所有