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

Linux USB subsystem -- initialize

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

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

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

USB作為Linux系統的一個子系統,其初始化函數被subsys_initcall修飾。

其初始化代碼如下:

  1. /*
  2. * Init
  3. */
  4. static int __init usb_init(void)
  5. {
  6. int retval;
  7. if (nousb) {
  8. pr_info("%s: USB support disabled\n", usbcore_name);
  9. return 0;
  10. }
  11. retval = usb_debugfs_init();
  12. if (retval)
  13. goto out;
  14. retval = bus_register(&usb_bus_type);
  15. if (retval)
  16. goto bus_register_failed;
  17. retval = bus_register_notifier(&usb_bus_type, &usb_bus_nb);
  18. if (retval)
  19. goto bus_notifier_failed;
  20. retval = usb_major_init();
  21. if (retval)
  22. goto major_init_failed;
  23. retval = usb_register(&usbfs_driver);
  24. if (retval)
  25. goto driver_register_failed;
  26. retval = usb_devio_init();
  27. if (retval)
  28. goto usb_devio_init_failed;
  29. retval = usbfs_init();
  30. if (retval)
  31. goto fs_init_failed;
  32. retval = usb_hub_init();
  33. if (retval)
  34. goto hub_init_failed;
  35. retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE);
  36. if (!retval)
  37. goto out;
  38. usb_hub_cleanup();
  39. hub_init_failed:
  40. usbfs_cleanup();
  41. fs_init_failed:
  42. usb_devio_cleanup();
  43. usb_devio_init_failed:
  44. usb_deregister(&usbfs_driver);
  45. driver_register_failed:
  46. usb_major_cleanup();
  47. major_init_failed:
  48. bus_unregister_notifier(&usb_bus_type, &usb_bus_nb);
  49. bus_notifier_failed:
  50. bus_unregister(&usb_bus_type);
  51. bus_register_failed:
  52. usb_debugfs_cleanup();
  53. out:
  54. return retval;
  55. }

如果在boot參數(對u-boot是在bootargs裡面加:nousb)裡面有nousb,輸出: usbcore: USB support disabled,然後退出。

如果在boot參數()裡面沒有nousb,則進行USB的初始化工作。

初始化的主要內容如下:

1. usb debug 文件系統初始化: usb_debugfs_init()。

2. 注冊USB總線 :bus_register(&usb_bus_type)。

3. 給USB總線注冊一個通知鏈 : bus_register_notifier(&usb_bus_type, &usb_bus_nb)。

4. usb_major_init

5. 注冊usbfs驅動: usb_register(&usbfs_driver)

usbfs_driver在<drivers/usb/core/devio.c中定義

6. usb_devio_init

7. USB文件系統注冊:usbfs_init()。

注:如果沒有CONFIG_USB_DEVICEFS,此函數為inline空函數。如果定義CONFIG_USB_DEVICEFS,則在<drivers/usb/core/inode.c>實現。

8. 對USB HUB進行初始化:usb_hub_init()

usb_hub_init()在<driver/usb/core/hub.c>中實現。

9. 注冊一個generic的USB驅動:usb_register_device_driver(&usb_generic_driver, THIS_MODULE);

下面文章會依次對每個部分進行詳細描述。

Copyright © Linux教程網 All Rights Reserved