资源描述:
《usb鼠标驱动注解及测试》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、usb鼠标驱动注解及测试收藏参考2.6.14版本屮的driver/usb/input/usbmouse.Co鼠标驱动可分为儿个部分:驱动加载部分、probe部分、open部分、urb回调函数处理部分。下文阴影部分为注解。一、驱动加载部分staticint_initusb_mouse_init(void){intretval=usb_register(&usb_mouse_driver);//注册鼠标驱动if(retval==0)info(DRIVER_VERSIONDRIVER_DESC);returnretval;}其中usb_mouse_driver的定义为:
2、staticstructusbdriverusbmousedriver={.owner・name.probe.disconnect.id_table=THIS_MODULE,=,'usbmouseH/=usb_mouse_probe,=usbmousedisconnect.=usbmouseidtable,如果注册成功的话,将会调用usb_mouse_probe0那么什么时候才算注册成功呢?和其它驱动注册过程一样,只有在其对应的“总线”上发现匹配的“设备”才会调用probeo总线兀配的方法和具体总线相关,如:platform_bus_type中是判断驱动名称和平台
3、设备名称是否相同;那如何确认usb总线的匹配方法呢?Usb设备是注册在usb_bus_type总线下的。查看usb_bus_type的匹配方法。structbus_typeusb_bus_type={.name=.match=.hotplug=.suspend=.resume=};"usb1;usbdevicematch,usb^hotplug,usb_generic_suspend,usb_generic_resume,其中usb_device_match建义了匹配方法staticintusb_device_match(structdevice*dev,stru
4、ctdevice_driver*drv)structusbjnterface*intf;structusbdriver*usbdrv;conststructusb_device_id*id;/*checkforgenericdriver,whichwedon'tmatchanydevicewith*/if(drv==&usb_generic_driver)return0;intf=to_usb」nterface(dev);usb_drv=to_usb_driver(drv);id=usb_match_id(intf,usb_drv->id_table);if(id
5、)return1;return0;}可以看出usb的匹配方法是usb_match_id(intf,usb_drv->id_table),也就是说通过比对“dev屮intf信息”和“usb_drv->id_table信息”,如果匹配则说明驱动所对应的设备已经添加到总线上了,所以接下了就会调用drv中的probe方法注册usb设备驱动。usb_mouse_id_table的定义为:staticstructusb_device_idusb_mouse_id_table[]={#defineUSB」NTERFACE」NFO(cl,sc,pr).match_flags=U
6、SB_DEVICE_ID_MATCH_INT_INFO,.blnterfaceClass=(cl),.blnterfaceSubClass=(sc),.blnterfaceProtocol=(pr)鼠标设备遵循USB人机接口设备(HID),在HID规范中规定鼠标接口类码为:接口类:0x03接口子类:0x01接口协议:0x02这样分类的好处是设备厂商可以直接利用标准的驱动程序。除了HID类以外还有Massstorage>printer^audio等#defineUSB_DEVICE_ID_MATCH_INT_INFO(USBDEVICEIDMATCHINTC
7、LASSUSBDEVICEIDMATCHINTSUBCLASS
8、USBDEVICEIDMATCHINTPROTOCOL)兀配的过程为:usb_match_id(structusb_interface*interface,conststructusb_device_id*id){structusb_host_interface*intf;structusb_device*dev;/*proc_connectinfoindevio.cmaycalluswithid==NULL.*/if(id==NULL)returnNULL;intf=interface->cur_a
9、ltset