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 中是这样表示的
来源:CSDN
作者:还是羊脂球
链接:https://blog.csdn.net/qq_31710263/article/details/103911804