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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章