本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记
在介绍root hub usb设备和驱动的匹配时,usb_set_configuration函数会从usb设备描述符里面知道有多少个配置,多少个接口,多少个设置,多少个端点,然后会为每一个接口添加一个设备。
这里看一下root hub的接口driver的注册。
在usb_init函数初始化时:
static int __init usb_init(void)
{
……
retval = usb_hub_init();
}
usb_hub_init函数对hub进行初始化。
int usb_hub_init(void)
{
if (usb_register(&hub_driver) < 0) {
printk(KERN_ERR "%s: can't register hub driver\n",
usbcore_name);
return -1;
}
……
}
在usb_hub_init函数里面我们调用了usb_register注册了一个driver。usb_register又调用了函数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;
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;
new_driver->drvwrap.driver.remove = usb_unbind_interface;
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) {
pr_info("%s: registered new interface driver %s\n",
usbcore_name, new_driver->name);
usbfs_update_special();
usb_create_newid_file(new_driver);
} else {
printk(KERN_ERR "%s: error %d registering interface "
" driver %s\n",
usbcore_name, retval, new_driver->name);
}
return retval;
}
new_driver->drvwrap.for_devices = 0说明这个driver不是给usb设备使用的,而是给usb接口设备使用的。后面会根据这个变量判断是不是给usb设备使用的driver,调用的函数是is_usb_device_driver
static inline int is_usb_device_driver(struct device_driver *drv)
{
return container_of(drv, struct usbdrv_wrap, driver)->
for_devices;
}
注册这个driver用的函数是driver_register,传参数device_driver。传入的参数driver的总线是usb_bus_type,probe函数是usb_probe_interface。刚好前面的接口设备注册的时候总线也是usb_bus_type。
文章参考:https://blog.csdn.net/fudan_abc/article/category/325189