打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[zhuan]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三个设备。

查看评论
3楼 ultimate2012 2012-01-06 11:12发表 [回复]
正在研究,学习了,感谢!以后请多多指教!
2楼 feiyueinfinite 2011-05-16 10:50发表 [回复]
好文章~我最近也在弄一个基于ARM linux平台的3G上网卡驱动,我刚起步主管就要我弄这个,囧了...还望日后能得到前辈大师的指点
Re: istone107 2012-07-30 14:02发表 [回复]
擦,咱们俩肿么遇到同样的情况回复feiyueinfinite:
1楼 yel617 2010-09-21 11:50发表 [回复]
你好:
我现在也在移植这一个3g的无线上网卡,碰到点问题,想向你请教下
我用的卡是华为的E1750,联通wcdma上网卡
内核 2.6.28
移植时我在drivers/usb/serialoption.c里添加了ID号
然后编译成模块加载
下面时我的加载信息
root@Techv_OMAP35xx:/mnt# insmod usbserial.ko
usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
root@Techv_OMAP35xx:/mnt# insmod option.ko
USB Serial support registered for GSM modem (1-port)
usbcore: registered new interface driver option
option: v0.7.2:USB Driver for GSM modems
我查看/dev下面也没有自动建立节点,然后我手动建立节点

root@Techv_OMAP35xx:/mnt# mknod /dev/ttyUSB0 c 188 0
root@Techv_OMAP35xx:/mnt# mknod /dev/ttyUSB1 c 188 1
root@Techv_OMAP35xx:/mnt# mknod /dev/ttyUSB2 c 188 2
root@Techv_OMAP35xx:/mnt# pppd call wcdma
Failed to open /dev/ttyUSB0: No such device

搞了好几天了,也没找到问题具体在哪,感觉就是usb口没有转换成串口,不知道你对这个问题有没有什么看法?
谢谢!
Re: gorilla0123 2010-09-21 13:58发表 [回复]
回复 yel617:你好, 能把你的 /proc/bus/usb/devices下面的内容复制出来给我看一下吗?
Re: yel617 2010-09-21 14:17发表 [回复]
回复 gorilla0123:我的/proc/bus/usb下面没有东西,当我insmodusbserial.ko option.ko后,cat /proc/device 后有188 ttyUSB
Re: gorilla0123 2010-09-21 14:32发表 [回复]
回复 yel617:你把卡插上后,/proc/bus/usb目录下没有devices这个文件?不太可能吧,无论是否usb转串口驱动是否正确,这个文件都应该有的,如果真没有,可否考虑换个内核版本试试。另外,你的cpu是什么?ARM还是powerpc?
Re: yel617 2010-09-21 16:39发表 [回复]
回复 gorilla0123:刚才我可能没mount
能不能提供个邮箱啊 我贴在这里,你估计看不清楚 /proc/bus/usb/deviece里有3G网卡的信息,但是是转换前的 好像就是没做转换
Re: gorilla0123 2010-09-28 09:05发表 [回复]
回复 yel617:

I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=usbserial_generic
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=usbserial_generic
E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
I:* If#= 2 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=usbserial_generic
E: Ad=84(I) Atr=03(Int.) MxPS= 64 Ivl=2ms
E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms

希望对你有帮助!
Re: gorilla0123 2010-09-28 09:04发表 [回复]
回复 yel617:

下面是我运行完usb_modeswitch后 cat /proc/bus/usb/devices内容:
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 4 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=19d2 ProdID=0031 Rev= 0.00
S: Manufacturer=ZTE,Incorporated
S: Product=ZTE WCDMA Technologies MSM
S: SerialNumber=P673M2UCCM010000
C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA
Re: gorilla0123 2010-09-28 09:02发表 [回复]
回复 yel617:

如果你的数据卡插上后,在/proc/bus/usb/devices下面看到的是mass storage设备,那就一定要用这个软件。
需要将usb_modeswitch/目录下的usb_modeswitch.conf文件做修改,DefaultVendor和DefaultProduct中要填写u盘的PID,而TargetProduct和TargetVendor中要填写modem设备的PID,MessageContent中要填写适合你这款数据卡的SCSI指令。

这些都修改好后,编译,在板子中插入数据卡后就运行,就会将U盘设备转换为modem设备,这时会进入usb-serial驱动。我觉得你应该先运行usb-modemswitch,再去make node。
Re: gorilla0123 2010-09-28 09:02发表 [回复]
回复 yel617:

邮箱发不了外网,只好又贴到这里了

不知道你为什么要用 usb_modeswitch, 我觉得这个软件是因为数据卡插到主机后首先表现出来的是一个U盘设备,需要向其发送特定的SCSI指令才能使其变成Modem设备。
Re: yel617 2010-09-21 16:05发表 [回复]
回复 gorilla0123:
root@Techv_OMAP35xx:/mnt# insmod usbserial.ko
ok0
usbcore: registered new interface driver usbserial
usbserial: USB Serial Driver core
root@Techv_OMAP35xx:/mnt# insmod option.ko
USB Serial support registered for GSM modem (1-port)
ok1
usbcore: registered new interface driver option
option: v0.7.2:USB Driver for GSM modems
root@Techv_OMAP35xx:/mnt# cd /proc/bus/usb/
root@Techv_OMAP35xx:/proc/bus/usb# ls
root@Techv_OMAP35xx:/proc/bus/usb#
这下面什么文件也没有
Re: yel617 2010-09-21 16:04发表 [回复]
回复 gorilla0123:我用的2.6.28的内核 CPU是TI的omap3530
这个没有会不会是与文件系统有关啊
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
usb设备如何检测
Linux 系统下USB设备检测
Linux下的硬件驱动——USB设备(下)(驱动开发部分)
Linux下,查看USB设备信息
USB转串口分析
如何在LINUX下实现硬件的自动检测(下)-Linux伊甸园----Linux|Unix|新闻|下载|论坛|人才|教程|自由软件|嵌入式|安装|开源|qq|RedHat|SUSE|命令|Mandriv
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服