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 中是这样表示的