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 中是這樣表示的