《vxworks-usb-mouse-driver分析.doc》由会员分享,可在线阅读,更多相关《vxworks-usb-mouse-driver分析.doc(19页珍藏版)》请在金锄头文库上搜索。
1、Vxworks usb mouse 驱动分析概述:最近在做嵌入式vxworks下usb触摸屏设计,参考了vxworks里面的usb mouse驱动的代码,分析了usb mouse驱动,根据自己的理解,写这个文档。如有任何问题请联系yxj_,转载请标明出处。系统资源:Vxworks6.71、USB主机驱动栈模型原理 USB主机驱动栈模型下图所示: 1.1硬件层 在USB主机驱动栈的最底部是USB主控制器(USB HC,即USB Host Controller)。目前,USB主控制器可分为三类:通用型主控制器接口(UHCI)、开放型主控制器接口(OHCI)和增强型主控制接口和增强型主控制接口(EH
2、CI)。其中,UHCI和OHCl支持USBl1低速接口,EHCl支持USB20高速接口。1.2主控制器驱动层对予每一类型的主控制器都有一个与硬件独立的USB主控制器驱动(Host Controller Driver,简称 HCD)。WindRiver提供了两个驱动:usbHedUheiLib (UHCI主控制器库)和usbHcdohciLib(OHCl主控制器库)。该模块向下直接与USB主控制器硬件进行交互操作,向上与USBD层的功能接口,提供各种功能函数的调用,支持对上层模块封装具体的HCD驱动的实现。1.3 USB核心驱动层USB核心驱动(USB host driver,简称USBD)模块
3、实现USB的核心驱动,包括USB总线的枚举、总线带宽分配、传输控制等操作。该模块向下调用HCD接口模块,实现与HCD层的通信,将设备驱动的功能请求转化为相应功能模块的调用。USBD管理每一个与主机相连的USB设备,还负责自动处理USB电力管理和带宽管理及USB hub和设备的动态插拔。1.4 USB设备驱动层USB设备驱动层负责管理连接到USB上的不同类型的设备,它们依靠USBD来提供与每个设备的通信路径,主要实现USB设备的一些特定初始化工作,并将上层用户应用程序的请求转化为对相应的USBD驱动程序的调用。该层通过对应用层提供API函数,从而屏蔽USB实现的细节。1.5应用层应用层为用户编写
4、的对USB设备进行读、写控制等指定功能的应用程序,应用层通过设备驱动程序和USB主机驱动程序完成指定的功能。2、USB mouse 驱动分析Usb mouse驱动属于设备驱动层,在vxworks里面,把usb mouse驱动设计成两层,即文件层+驱动层,文件层对上提供read、write、ioctl等接口,对下调用驱动层提供函数进行硬件初始化,对应的源代码是usrUsbMseInit.c (targetconfigcompssrc)。驱动层则针对具体usb设备初始化,获取数据等。2.1 文件层usrUsbMseInit.c分析在usrRoot (usrConfig.c (targetconfi
5、gall))调用#ifdef INCLUDE_USB_MOUSE_INIT usrUsbMseInit (); /* Mouse Driver Initialization */#endifusrUsbMseInit (usrUsbMseInit.c (targetconfigcompssrc))驱动程序入口点,首先检查driver是否已经安装,如果安装就退出if (usbMseDrvNum 0)printf (Mouse already initilaized.n); return ERROR;接着调用usbMseDrvNum = iosDrvInstall (FUNCPTR) NULL,
6、(FUNCPTR) usbMseDevDelete, (FUNCPTR) usbMseOpen, (FUNCPTR) usbMseClose, (FUNCPTR) usbMseRead, (FUNCPTR) usbMseWrite, (FUNCPTR) usbMseIoctl);安装驱动的I/O函数,添加驱动到驱动表里面接着调用驱动层初始化函数if (usbMouseDevInit () = OK) usbMouseLib.c (targetsrcdrvusb) printf (usbMouseDevInit() returned OKn);这个函数如果成功,会输出打印上面的信息表明驱动已经加
7、载,并且和usb设备已经匹配上。接着调用驱动层动态注册函数if (usbMouseDynamicAttachRegister (usbMseDrvAttachCallback, (void *) NULL) != OK) usbMouseLib.c (targetsrcdrvusb)这个函数会把usbMseDrvAttachCallback保存在驱动层创建的一个队列里面,当usb设备热插拔时,都会调用这个函数。如果已经插入了usb mouse,就会马上调用usbMseDrvAttachCallback,参数为USB_MSE_ATTACH, 如果没有插入,那么驱动加载已经完成了。看usbMseD
8、rvAttachCallback (usrUsbMseInit.c (targetconfigcompssrc))因为第一次参数是USB_MSE_ATTACH,就会进入if (attachCode = USB_MSE_ATTACH)这个分支:首先调用驱动层的if (usbMouseSioChanLock (pChan) != OK),标记SIO_CHAN structure已经在使用接着调用sprintf (mseName, %s%d, USB_MSE_NAME, mseCount); if (usbMseDevCreate (mseName, pChan) != OK)创建设备文件,即创建/
9、usbMo/X,X由mseCount决定,同时创建文件层设备结构,并放在链表里面,调用iosDevAdd将设备添加到系统设备列表里面接着调用if (usbMseDevFind (pChan, &pUsbMseDev) != OK)printf(usbMseDevFind() returned ERRORn);return;根据pchan在链表里面找到这个usb设备的文件层设备结构接着调用if (*pChan-pDrvFuncs-callbackInstall) (pChan, SIO_CALLBACK_PUT_MOUSE_REPORT,(STATUS (*) (void *, .) usbMs
10、eRptCallback, (void *) pUsbMseDev) != OK)pChan-pDrvFuncs-callbackInstall是usbMouseLib.c里面的usbMouseCallbackInstall函数,它安装回调函数,当usb接受到数据后就会调用usbMseRptCallback这个函数。如果上面都执行成功,会输出打印下面信息printf(USB Mouse attached as %sn, mseName);至此,驱动加载完成,并且设备文件也已经创建好了。2.2 驱动层usbMouseLib.c分析在文件层usrUsbMseInit会调用usbMouseDevIn
11、it-驱动层初始化入口if (initCount = 0) 表明还没有进行初始化,初始化内部结构体,并链接在usbd上if (usbdClientRegister (MSE_CLIENT_NAME, &usbdHandle) != OK |usbdDynamicAttachRegister (usbdHandle, USB_CLASS_HID,USB_SUBCLASS_HID_BOOT, USB_PROTOCOL_HID_BOOT_MOUSE,FALSE,usbMouseAttachCallback) != OK)return doShutdown (S_usbMouseLib_USBD_FA
12、ULT);usbdClientRegister (usbTransUnitInit.c (targetsrcusb))生成usb设备驱动的usbdHandleif ( !usbtuInitCount) /* usbdInitialize() not called */ USBTU_LOG(usbdClientRegister returns ERROR:usbdInitialize not calledn); return ERROR; 检查usbd是否初始化了,如果没有就出错退出。/* allocate structure for client */ if ( !(pDriver = OSS
13、_CALLOC ( sizeof (USBTU_DEVICE_DRIVER) USBTU_LOG ( usbdClientRegister returns ERROR : malloc failed n); return ERROR; 创建client driver结构体if (pClientHandle != NULL) *pClientHandle = pDriver;将client driver赋给usbdHandle usbdDynamicAttachRegister (usbTransUnitInit.c (targetsrcusb))填充usb设备驱动的usbdHandle,并且注
14、册usbMouseAttachCallback函数,当有热插拔发生时,会调用这个函数,并且将usb设备client注册到usbd上。这三个参数USB_CLASS_HID,USB_SUBCLASS_HID_BOOT, USB_PROTOCOL_HID_BOOT_MOUSE是类代码、子类代码和协议代码,会被填充在usbdHandle上,后面usb驱动就会根据这三个参数把驱动和相应的设备联系起来。pDriverData-bFlagVendorSpecific = vendorSpecific; pDriverData-uVendorIDorClass = deviceClass; pDriverData-uProductIDorSubClass = deviceSubClass;pDriverData-uBCDUSBorProtocol = deviceProtocol;