vxworks-usb-mouse-driver分析.doc

上传人:pu****.1 文档编号:555046926 上传时间:2022-11-29 格式:DOC 页数:19 大小:66.83KB
返回 下载 相关 举报
vxworks-usb-mouse-driver分析.doc_第1页
第1页 / 共19页
vxworks-usb-mouse-driver分析.doc_第2页
第2页 / 共19页
vxworks-usb-mouse-driver分析.doc_第3页
第3页 / 共19页
vxworks-usb-mouse-driver分析.doc_第4页
第4页 / 共19页
vxworks-usb-mouse-driver分析.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《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;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 服装配饰

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号