歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux USB subsystem --- USB bus registration

Linux USB subsystem --- USB bus registration

日期:2017/3/1 10:25:42   编辑:Linux編程

目的:對USB作深入學習,在此留下筆記。歡迎討論。

[Linux 3.2] [driver/usb/core/driver.c]

定義:usb_bus_type

  1. struct bus_type usb_bus_type = {
  2. .name = "usb",
  3. .match = usb_device_match,
  4. .uevent = usb_uevent,
  5. };

[Linux 3.2] [driver/base/bus.c]

函數:bus_register(struct bus_type *bus)

  1. /**
  2. * bus_register - register a bus with the system.
  3. * @bus: bus.
  4. *
  5. * Once we have that, we registered the bus with the kobject
  6. * infrastructure, then register the children subsystems it has:
  7. * the devices and drivers that belong to the bus.
  8. */
  9. int bus_register(struct bus_type *bus)
  10. {
  11. int retval;
  12. struct subsys_private *priv;
  13. priv = kzalloc(sizeof(struct subsys_private), GFP_KERNEL);
  14. if (!priv)
  15. return -ENOMEM;
  16. priv->bus = bus;
  17. bus->p = priv;
  18. BLOCKING_INIT_NOTIFIER_HEAD(&priv->bus_notifier);
  19. retval = kobject_set_name(&priv->subsys.kobj, "%s", bus->name);
  20. if (retval)
  21. goto out;
  22. priv->subsys.kobj.kset = bus_kset;
  23. priv->subsys.kobj.ktype = &bus_ktype;
  24. priv->drivers_autoprobe = 1;
  25. retval = kset_register(&priv->subsys);
  26. if (retval)
  27. goto out;
  28. retval = bus_create_file(bus, &bus_attr_uevent);
  29. if (retval)
  30. goto bus_uevent_fail;
  31. priv->devices_kset = kset_create_and_add("devices", NULL,
  32. &priv->subsys.kobj);
  33. if (!priv->devices_kset) {
  34. retval = -ENOMEM;
  35. goto bus_devices_fail;
  36. }
  37. priv->drivers_kset = kset_create_and_add("drivers", NULL,
  38. &priv->subsys.kobj);
  39. if (!priv->drivers_kset) {
  40. retval = -ENOMEM;
  41. goto bus_drivers_fail;
  42. }
  43. klist_init(&priv->klist_devices, klist_devices_get, klist_devices_put);
  44. klist_init(&priv->klist_drivers, NULL, NULL);
  45. retval = add_probe_files(bus);
  46. if (retval)
  47. goto bus_probe_files_fail;
  48. retval = bus_add_attrs(bus);
  49. if (retval)
  50. goto bus_attrs_fail;
  51. pr_debug("bus: '%s': registered\n", bus->name);
  52. return 0;
  53. bus_attrs_fail:
  54. remove_probe_files(bus);
  55. bus_probe_files_fail:
  56. kset_unregister(bus->p->drivers_kset);
  57. bus_drivers_fail:
  58. kset_unregister(bus->p->devices_kset);
  59. bus_devices_fail:
  60. bus_remove_file(bus, &bus_attr_uevent);
  61. bus_uevent_fail:
  62. kset_unregister(&bus->p->subsys);
  63. out:
  64. kfree(bus->p);
  65. bus->p = NULL;
  66. return retval;
  67. }
  68. EXPORT_SYMBOL_GPL(bus_register);

bus_register的目的主要是處理Linux設備模型的相關事宜。

此函數的主要作用如下:

1. line 21 : 初始化一個blocking的通知鏈。

2. line 23 ~ 31: 將USB總線加入總線集,並在/sys/bus下面創建usb子目錄。

3. line 35 : 在/sys/bus/usb/下面創建uevent的屬性文件。

4. line 39 ~ 51: 在usb總線子集上面創建devices, drivers兩個子集,同時創建目錄。

5. line 53 ~54 : 初始化兩條鏈表:klist_devices, klist_drivers。

6. line 56 : 添加bus的drivers_probe,drivers_autoprobe屬性文件。(需要CONFIG_HOTPLUG的支持)

7. line 60 : 添加bus的其余屬性文件,對USB來說,沒有。

這些完成之後,可以在/sys/bus下面看到usb目錄,

在USB目錄下面可以看到:

# ls /sys/bus/usb

devices drivers_autoprobe uevent drivers drivers_probe

Copyright © Linux教程網 All Rights Reserved