Linux USB串口驅動代碼分析

4、USB serial 驅動代碼分析

文件:

drivers/usb/serial/usb-serial.c

 

usb_serial_init(void)
    |---alloc_tty_driver  /*分配serial驅動,最多支持512個USB Serial*/
    |       |---tty_alloc_driver
    |           |---__tty_alloc_driver
    |               |---kzalloc
    |
    |---bus_register  /*註冊USB Serial 總線*/
    |
    |---usb_serial_tty_driver /*設置驅動名、設備名、主次設備號、傳輸模式、速率*/
    |
    |---tty_set_operations /*設置Serial的操作方法*/
    |   |---tty_operations
    |
    |---tty_register_driver /*註冊tty驅動*/
    |   |---tty_register_device
    |   |   |---tty_register_device_attr  /*註冊一個tty設備*/
    |   |
    |   `---proc_tty_register_driver /*註冊到/proc/tty/driver/*/
    |
    |---usb_register /*註冊USB驅動*/
    |
    `---usb_serial_generic_register /*註冊通用驅動*/

當插入設備,device與driver配對成功,內核將調用指定驅動中的probe函數。

usb_serial_probe
    |---search_serial_device 
    |   |---to_usb_driver /*標記USB設備驅動到USB core*/
    |   `---list_for_each_entry /*檢查USB ID是否與已知設備匹配*/
    |
    |---create_serial
    |   |---kzalloc /*給Serial分配內存*/
    |   |---usb_get_dev /*返回設備指針*/
    |   `---usb_get_intf  /*返回接口指針*/
    |
    |---kzalloc /*給端點分配內存*/
    |
    |---find_endpoints /*匹配描述符,找到所需端點*/
    |
    |---dev_info /*查找其他需要的device信息*/
    |   /*設置端點信息*/
    |---setup_port_bulk_in 
    |---setup_port_bulk_out
    |---setup_port_interrupt_in
    |---setup_port_interrupt_out
    |
    |---usb_set_intfdata /*設置驅動數據*/
    |   |---dev_set_drvdata
    |       |---driver_data
    |   /*向USB core 註冊所有的端口*/
    |---device_enable_async_suspend
    |---device_add
    |
    `---usb_serial_console_init /*usb 串行控制檯初始化*/
        `---register_console /*註冊USB串行控制檯*/

 

linux USB驅動程序需要做的第一件事件就是在linux usb子系統裏註冊,這個子系統就是usb-core,同事提供一些相關信息,例如這個驅動程序支持哪種設備,當被支持的設備從系統插入或者拔出時,會有哪些動作,所有這些信息都傳送到usb子系統中,在usb-skeleton.c 中是這樣表示的

發佈了42 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章