一.usb设备驱动注册
static inline int usb_register(struct usb_driver *driver)
{
return usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME);
}
usb_register_driver
int usb_register_driver(struct usb_driver *new_driver, struct module *owner,const char *mod_name)
{
int retval = 0;
if (usb_disabled())
return -ENODEV;
new_driver->drvwrap.for_devices = 0; //usb接口设备
new_driver->drvwrap.driver.name = (char *) new_driver->name; //设置设备名
new_driver->drvwrap.driver.bus = &usb_bus_type; //设置总线类型
new_driver->drvwrap.driver.probe = usb_probe_interface; //设置probe方法
new_driver->drvwrap.driver.remove = usb_unbind_interface; //设置remove方法
new_driver->drvwrap.driver.owner = owner; //设置模块所有者
new_driver->drvwrap.driver.mod_name = mod_name;
spin_lock_init(&new_driver->dynids.lock);
INIT_LIST_HEAD(&new_driver->dynids.list);
retval = driver_register(&new_driver->drvwrap.driver); //注册设备驱动
if (retval)
goto out;
usbfs_update_special();
retval = usb_create_newid_file(new_driver);
if (retval)
goto out_newid;
retval = usb_create_removeid_file(new_driver);
if (retval)
goto out_removeid;
pr_info("%s: registered new interface driver %s\n",usbcore_name, new_driver->name);
out:
return retval;
out_removeid:
usb_remove_newid_file(new_driver);
out_newid:
driver_unregister(&new_driver->drvwrap.driver);
printk(KERN_ERR "%s: error %d registering interface driver %s\n",usbcore_name, retval, new_driver->name);
goto out;
}
注册设备驱动后会调用总线的match方法
static int usb_device_match(struct device *dev, struct device_driver *drv)
{
if (is_usb_device(dev)) { //usb设备
if (!is_usb_device_driver(drv))
return 0;
return 1;
} else if (is_usb_interface(dev)) { //usb接口
struct usb_interface *intf;
struct usb_driver *usb_drv;
const struct usb_device_id *id;
if (is_usb_device_driver(drv))
return 0;
intf = to_usb_interface(dev); //获取usb接口结构体
usb_drv = to_usb_driver(drv); //获取usb_driver
id &#