#define subsys_initcall(fn) module_init(fn)
subsys_initcall(usb_init);
bus_register(&usb_bus_type);//注释1
__bus_register(subsys, &__key);
retval = kset_register(&priv->subsys);
kobject_add_internal(&k->kobj);
kobj_kset_join(kobj);
//将usb总线加入到总线链表里面,sys/bus目录下就是所有的总线目录
list_add_tail(&kobj->entry, &kobj->kset->list);
create_dir(kobj);
sysfs_create_dir(kobj);
//具体的目录在这里创建
//在总线下创建了devices目录,据我分析这里并没有添加设备链表,因为还没有去发现设备
priv->devices_kset = kset_create_and_add("devices", NULL,&priv->subsys.kobj);
//在总线下创建了drivers目录,据我分析这里并没有添加驱动链表,因为还没有去注册驱动
klist_init(&priv->klist_devices, klist_devices_get, klist_devices_put);
//初始化设备链表
klist_init(&priv->klist_drivers, NULL, NULL);
//初始化驱动链表
retval = usb_major_init();//这里面注册了一个字符设备
//#define USB_MAJOR  180,cat /proc/devices可以观察到
register_chrdev(USB_MAJOR, "usb", &usb_fops);
retval = usb_hub_init();
usb_register(&hub_driver)
//将hub.c里面的
hub_driver加入到usb总线下的驱动链表里
usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
driver_register(&new_driver->drvwrap.driver);
bus_add_driver(drv);
driver_attach(drv);
//匹配devices与drivers,调用
__driver_attach
bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
__driver_attach
driver_match_device(drv, dev)
//调用总线上的match,检测驱动与设备是否匹配
drv->bus->match ? drv->bus->match(dev, drv) : 1;
driver_probe_device(drv, dev);
really_probe(dev, drv);
drv->probe(dev);
//调用hub.c里面的驱动的probe函数,这里的drv是device_driver结构体,其在usb_register_driver过程中通过new_driver->drvwrap.driver.probe = usb_probe_interface;来设置,这个probe会调用driver中的probe
hub_probe
hub_configure(hub, endpoint)
//这里注册了中断,一旦接入新的usb设备就会调用
hub_irq
usb_fill_int_urb(hub->urb, hdev, pipe, *hub->buffer, maxp,
hub_irq,hub, endpoint->bInterval);
khubd_task = kthread_run(hub_thread, NULL, "khubd");
//启动
hub_thread这个线程
hub_thread
//#define wait_event_freezable(wq, condition)   wait_event_interruptible(wq, condition)
//将当前进程加入到等待队列中,进程在这里停下来了,我们需要看看那里唤醒进程
wait_event_freezable(khubd_wait,!list_empty(&hub_event_list) ||kthread_should_sto());
//一旦接入新的usb设备,就会调用
hub_irq
hub_irq
kick_khubd(hub);
wake_up(&khubd_wait);
//唤醒等待队列里面的进程,执行hub_events();
hub_events();
hub_port_connect_change(hub, i,portstatus, portchange);
hub_port_init(hub, udev, port1, i);
udev = usb_alloc_dev(hdev, hdev->bus, port1);
choose_devnum(udev);
//选择usb设备地址
hub_set_address(udev, devnum);
//将选择的地址告诉usb设备
usb_get_device_descriptor(udev, 8);
//获得设备描述符
usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);
//再次获得设备描述符
usb_new_device(udev);
usb_enumerate_device(udev);
usb_get_configuration(udev);
//获得配置信息
//获得产品信息
udev->product = usb_cache_string(udev, udev->descriptor.iProduct);
//获得制造商信息
udev->manufacturer = usb_cache_string(udev,udev->descriptor.iManufacturer);
//获得序列号信息
udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
device_add(&udev->dev);
bus_add_device(dev);
//将usb设备加入到usb总线旗下的设备列表里面
bus_probe_device(dev);
device_attach(dev);
//对所有的驱动,调用
__device_attach判断设备与驱动是否匹配
bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
driver_match_device(drv, dev)
//调用总线下的match函数来判断设备与驱动时候是否匹配
drv->bus->match ? drv->bus->match(dev, drv) : 1;
driver_probe_device(drv, dev);
really_probe(dev, drv);
//说明:
//调用hub.c里面的驱动的probe函数,这里的drv是device_driver结构体,其在usb_register_driver过程中通过new_driver->drvwrap.driver.probe = usb_probe_interface;来设置,这个probe会调用driver中的probe
#drv->probe(dev);
//一旦匹配的话就会调用驱动的probe函数(有问题)
//将generic
.c里面的 usb_generic_driver 加入到usb总线下的驱动链表里
retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE);
下面我们来看看usb总线的match函数:
usb_device_match
usb_match_id(intf, usb_drv->id_table)
usb_match_one_id(interface, id)
usb_match_device(dev, id)
根据驱动id和设备信息是否匹配来判断是否匹配