Linux的USB-Serial驱动(从系统初始化到生成tty设备的全过程)

 真正做完了USB驱动,看了《Linux那些事》之后,才知道Linux的USB host驱动有多复杂。我做的还只是USB驱动中的一小部分USB转串口。而且还只是读代码和做小的改动,真正写这些的都是天才。

    有关USB驱动的部分在我会在别的文章中逐步的介绍,这里介绍的是从Linux内核初始化到USB设备插入USB口到虚拟出tty设备的过程。先上一个原创的图,画的还挺丑的,不过应该能把过程说清楚:



一,Linux系统初始化阶段:
1 在usb.c中的usb_init()函数会调用bus_register(&usb_bus_type)注册一条USB总线。
2 在usb.c中会在这条总线上注册一个驱动程序:usb_generic_driver{
                                                              generic_probe()
                                                              device_id
                                                              }
  在这个驱动中包含自己的probe函数和USB设备的ID(注意,这里是设备ID而不是接口的ID)。
3 在usb_serial.c中的usb_serial_init()函数会再次调用bus_register(&usb_serial_bus_type)注册USB转串口总线。
4 usb_serial_init()函数会调用tty_register_driver(usb_serial_tty_driver)向内核注册tty类的设备驱动,并在USB转串口总线上添加这个驱动。
5 option.c中的option_init()函数调用usb_register(&option_driver){
                                                                usb_serial_probe()
                                                                ids_table{0x19d2,0x0031}
                                                                }
在USB总线上注册USB驱动,该驱动是接口的驱动
6 option.c中的option_init()函数调用usb_serial_register(&option_1port_device)在USB转串口总线上注册驱动option_1port_device(注意,这仅仅是在总线上注册,并不向内核注册)。

到这里,总线跟驱动都已经注册完毕了,就等着设备过来了。

二 从设备插入到进入自己的probe函数——usb_serial_probe()的过程
7 当我们的USB Modem设备插入USB端口时,要调用bus_add_device()在USB总线上添加一个USB设备。
8 该USB设备由于有USB设备号,会找到刚才注册的usb_generic_driver中的generic_probe()函数,在这个函数中经过一系列的函数调用最后会  进入usb_set_configuration()。
9 usb_set_configuration()函数会根据HOST和Device沟通的情况,进行总线枚举,这个我们的设备会生成3个interface,该函数会依次将这三个interface添加到USB总线上。
10 每个interface会根据VID和PID找到合适自己的probe函数,这里我们设备的三个接口会依次进入usb_serial_probe()。

三 从进入自己的probe到虚拟出ttyUSB设备
11 在usb_serial_probe()中,首先生成三个usb_serial_port,port1,port2,port3。接着调用device add()函数 。。。。。。。。(这段有待考证)调用tty_register_device()。
12 tty_register_device()函数主要做了三件事:
(1)向系统注册这三个串口设备。
(2)将串口设备,次设备号,串口驱动usb_serial_tty_driver绑定到一起。
(3)在/dev目录下生成/dev/ttyUSB1,/dev/ttyUSB2,/dev/ttyUSB3三个设备。


  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
嵌入式系统tty设备驱动框架如下: 1. tty设备驱动的注册 在Linux内核中,tty设备驱动的注册是通过调用tty_register_driver()函数来实现的。该函数会将tty_driver结构体中的成员变量进行初始化,并将其加入到tty_drivers链表中。 2. tty设备的打开 当用户空间应用程序调用open()函数打开tty设备时,内核会调用tty_driver结构体中的open()函数。在open()函数中,会创建tty_struct结构体,并将其加入到tty_driver结构体中的tty_structs链表中。同时,还会调用tty_driver结构体中的start()函数,该函数会启动tty设备的数据传输。 3. tty设备的读写 当用户空间应用程序调用read()或write()函数读写tty设备时,内核会调用tty_driver结构体中的read()或write()函数。在read()函数中,会从tty_struct结构体中读取数据并返回给用户空间应用程序。在write()函数中,会将用户空间应用程序传递的数据写入到tty_struct结构体中。 4. tty设备的关闭 当用户空间应用程序调用close()函数关闭tty设备时,内核会调用tty_driver结构体中的close()函数。在close()函数中,会释放tty_struct结构体,并将其从tty_driver结构体中的tty_structs链表中移除。同时,还会调用tty_driver结构体中的stop()函数,该函数会停止tty设备的数据传输。 5. tty设备驱动的注销 当不再需要使用tty设备驱动时,可以通过调用tty_unregister_driver()函数将其从tty_drivers链表中移除,并释放相应的资源。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值