歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux USB subsystem -- initialize

目的:對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.   
  12.     retval = usb_debugfs_init();  
  13.     if (retval)  
  14.         goto out;  
  15.   
  16.     retval = bus_register(&usb_bus_type);  
  17.     if (retval)  
  18.         goto bus_register_failed;  
  19.     retval = bus_register_notifier(&usb_bus_type, &usb_bus_nb);  
  20.     if (retval)  
  21.         goto bus_notifier_failed;  
  22.     retval = usb_major_init();  
  23.     if (retval)  
  24.         goto major_init_failed;  
  25.     retval = usb_register(&usbfs_driver);  
  26.     if (retval)  
  27.         goto driver_register_failed;  
  28.     retval = usb_devio_init();  
  29.     if (retval)  
  30.         goto usb_devio_init_failed;  
  31.     retval = usbfs_init();  
  32.     if (retval)  
  33.         goto fs_init_failed;  
  34.     retval = usb_hub_init();  
  35.     if (retval)  
  36.         goto hub_init_failed;  
  37.     retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE);  
  38.     if (!retval)  
  39.         goto out;  
  40.   
  41.     usb_hub_cleanup();  
  42. hub_init_failed:  
  43.     usbfs_cleanup();  
  44. fs_init_failed:  
  45.     usb_devio_cleanup();  
  46. usb_devio_init_failed:  
  47.     usb_deregister(&usbfs_driver);  
  48. driver_register_failed:  
  49.     usb_major_cleanup();  
  50. major_init_failed:  
  51.     bus_unregister_notifier(&usb_bus_type, &usb_bus_nb);  
  52. bus_notifier_failed:  
  53.     bus_unregister(&usb_bus_type);  
  54. bus_register_failed:  
  55.     usb_debugfs_cleanup();  
  56. out:  
  57.     return retval;  
  58. }  

如果在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