参考2.6.14版本中的driver/usb/input/usbmouse.c。鼠标驱动可分为多个
部分:驱动加载部分、probe部分、open部分、urb回调函数处理部分。
下文阴影部分为注解。
一、 驱动加载部分
static int __init usb_mouse_init(void)
{
int retval = usb_register(&usb_mouse_driver);//注册鼠标驱动
if (retval == 0)
info(DRIVER_VERSION ":" DRIVER_DESC);
return retval;
}
其中usb_mouse_driver的定义为:
static struct usb_driver usb_mouse_driver = {
.owner = THIS_MODULE,
.name = "usbmouse",
.probe = usb_mouse_probe,
.disconnect = usb_mouse_disconnect,
.id_table = usb_mouse_id_table,
};
假如
注册成功的话,将会调用usb_mouse_probe。那么什么时刻
才算注册成功呢?
和其它驱动注册流程
一样,只有在其对应的“总线”上发觉
匹配的“装备
”才会调用probe。总线匹配的要领
和细致
总线有关
,如:platform_bus_type中是判断驱动名称和平台装备
名称能不能
相似
;那如何
确认usb总线的匹配要领
呢?
Usb装备
是注册在usb_bus_type总线下的。查看usb_bus_type的匹配要领
。
struct bus_type usb_bus_type = {
.name = "usb",
.match = usb_device_match,
.hotplug = usb_hotplug,