Linux kernel 如何使用非顺序接口号绑定USB设备

Linux kernel 如何使用非顺序接口号绑定USB设备,linux-kernel,usb,linux-device-driver,Linux Kernel,Usb,Linux Device Driver,我尝试在主机端口上以QMI模式连接USB蜂窝GOBI 3000调制解调器。USB主机子系统可以工作,因为我已经连接了其他设备(电容式触摸屏等)。所需的驱动程序是通常的“usbnet.ko”,还有一个“GobiSerial.ko”和一个“GobiNet.ko”。 启动后,我看到USB集线器上的设备具有正确的、制造商的、VID的、PID的4个接口。 当我插入调制解调器时,终端上显示以下消息: [352326.921871] usb 1-1.4: new full speed USB device u

我尝试在主机端口上以QMI模式连接USB蜂窝GOBI 3000调制解调器。USB主机子系统可以工作,因为我已经连接了其他设备(电容式触摸屏等)。所需的驱动程序是通常的“usbnet.ko”,还有一个“GobiSerial.ko”和一个“GobiNet.ko”。 启动后,我看到USB集线器上的设备具有正确的、制造商的、VID的、PID的4个接口。 当我插入调制解调器时,终端上显示以下消息:

[352326.921871] usb 1-1.4: new full speed USB device using s5p-ohci and address 8
[352327.038871] usb 1-1.4: config 1 has an invalid interface number: 8 but max is 3
[352327.044804] usb 1-1.4: config 1 has no interface number 1
此消息由函数“usb_parse_interface”中的“drivers/usb/core/config.c”生成。 当我在USB上列出设备时,我看到了它(没有绑定驱动程序):

正如我们在“C:”行中看到的,该设备有4个接口。然后,在“I:”行中,它将4个接口列为“0、2、3和8”。在“include/linux/usb.h”中,有人说“usb标准规定接口的编号应该是从0到desc.bNuminInterfaces-1,但很多设备都弄错了。”事实上,如果我连接另一个品牌的调制解调器,它会连接,因为它遵循这条规则。看看这个:

C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=GobiNet
E:  Ad=81(I) Atr=03(Int.) MxPS=  64 Ivl=5ms
E:  Ad=82(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=01(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E:  Ad=83(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=GobiSerial
E:  Ad=84(I) Atr=03(Int.) MxPS=  64 Ivl=5ms
E:  Ad=85(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
I:* If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=GobiSerial
E:  Ad=86(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=04(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
如您所见,4个接口的编号从0到3。现在,该调制解调器正在世界上其他系统上工作。让驱动程序绑定到具有非顺序编号接口的设备的诀窍是什么

我很乐意知道在哪里可以找到答案。我在O'Reilly的“Linux设备驱动程序”和源代码中都没有找到答案,我已经寻找了一天多了

以下是设置:

定制ARMCortex A8平台,运行内核为2.6.35.7的Android姜饼。因此,它与标准的Linux ARM相同。它只是没有一个完整的ubuntu系统的所有功能

问题解决了,尽管看起来像问题中解释的那样,但与此无关。即使内核代码中有几个地方说USB接口应该按顺序编号,它也可以按任意顺序处理。我真正的问题是一个坏的构建系统。至少有一个文件没有得到更新,当我在另一个文件中添加跟踪时,它触发了模块的更新。这解决了问题,使它像“魔术”一样工作。我想,当我经历非常奇怪的事情时,我会开始做一个“清理”。毕竟,在一台拥有大量RAM和杀手级硬盘的机器上,重新编译内核并不需要那么长时间

问题解决了,尽管看起来像问题中解释的那样,但与此无关。即使内核代码中有几个地方说USB接口应该按顺序编号,它也可以按任意顺序处理。我真正的问题是一个坏的构建系统。至少有一个文件没有得到更新,当我在另一个文件中添加跟踪时,它触发了模块的更新。这解决了问题,使它像“魔术”一样工作。我想,当我经历非常奇怪的事情时,我会开始做一个“清理”。毕竟,在一台拥有大量RAM和杀手级硬盘的机器上,重新编译内核并不需要那么长时间

C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=GobiNet
E:  Ad=81(I) Atr=03(Int.) MxPS=  64 Ivl=5ms
E:  Ad=82(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=01(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E:  Ad=83(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=GobiSerial
E:  Ad=84(I) Atr=03(Int.) MxPS=  64 Ivl=5ms
E:  Ad=85(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
I:* If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=GobiSerial
E:  Ad=86(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=04(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms