在/drivers/usb/core/Usb.c中,subsys_initcall(usb_init)声明了usb子系统入口函数usb_init
static int __init usb_init(void)
{
int retval;
if (nousb) {
pr_info("%s: USB support disabled\n", usbcore_name);
return 0;
}
retval = usb_debugfs_init(); //1.usb debugfs初始化
if (retval)
goto out;
retval = bus_register(&usb_bus_type); //2.usb总线注册
if (retval)
goto bus_register_failed;
retval = bus_register_notifier(&usb_bus_type, &usb_bus_nb); //3.usb总线通知链注册
if (retval)
goto bus_notifier_failed;
retval = usb_major_init(); //4.注册usb主控器字符设备
if (retval)
goto major_init_failed;
retval = usb_register(&usbfs_driver); //5.注册usbfs驱动
if (retval)
goto driver_register_failed;
retval = usb_devio_init(); //6.usb设备字符设备初始化
if (retval)
goto usb_devio_init_failed;
retval = usbfs_init(); //7.usbfs初始化
if (retval)
goto fs_init_failed;
retval = usb_hub_init(); //8.usb hub初始化
if (retval)
goto hub_init_failed;
retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE); //9.usb注册同样设备驱动
if (!retval)
goto out;
usb_hub_cleanup();
hub_init_failed:
usbfs_cleanup();
fs_init_failed:
usb_devio_cleanup();
usb_devio_init_failed:
usb_deregister(&usbfs_driver);
driver_register_failed:
usb_major_cleanup();
major_init_failed:
bus_unregister_notifier(&usb_bus_type, &usb_bus_nb);
bus_notifier_failed:
bus_unregister(&usb_bus_type);
bus_register_failed:
usb_debugfs_cleanup();
out:
return retval;
}
1.usb_debugfs_init --usb debugfs初始化
static int usb_debugfs_init(void)
{
usb_debug_root = debugfs_create_dir("usb", NULL); //创建"$(debugfs)/usb"
if (!usb_debug_root)
return -ENOENT;
usb_debug_devices = debugfs_create_file("devices", 0444,usb_debug_root, NULL,&usbfs_devices_fops);
//创建"$(debugfs)/usb/device",捆绑usbfs_devices_fops结构体
if (!usb_debug_devices) { //若创建失败
debugfs_remove(usb_debug_root); //则必须把“$(debugfs)/usb”也删除掉
usb_debug_root = NULL;
return -ENOENT;
}
return 0;
}
要使用debugfs下面的usb功能,需要先挂着debugfs(mount -t debugfs none $(debugfs) ),具体初始化了啥调试接口,看下usbfs_devices_fops操作函数集
2.usb总线的注册
struct bus_type usb_bus_type = {
.name = "usb", //总线名
.match = usb_device_match, //匹配方法
.uevent = usb_uevent, //事件处理
#ifdef CONFIG_USB_SUSPEND
.pm = &usb_bus_pm_ops, //电源管理
#endif
};
这里总线的match方法是usb设备与usb驱动匹配的函数.
3.注册usb总线通知链
int bus_register_notifier(struct bus_type *bus, struct notifier_block *nb)
{
return blocking_notifier_chain_register(&bus->p->bus_notifier, nb);
}
当总线添加删除设备的时候会调用usb_bus_nb指定的notifier_cal方法,既usb_bus_notify
static int usb_bus_notify(struct notifier_block *nb, unsigned long action,void *data)
{
struct device *dev = data;
switch (action) {
case BUS_NOTIFY_ADD_DEVICE: //添加设备
if (dev->type == &usb_device_type) //usb设备
(void) usb_create_sysfs_dev_files(to_usb_device(dev));
else if (dev->type == &usb_if_de