Я пытаюсь подключить сотовый USB GOBI 3000 MODEM в режиме QMI к порту хоста.Хост-подсистема 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
Это сообщение генерируется "drivers / usb / core / config.c" в функции "usb_parse_interface".Когда я перечисляю устройство на USB, я вижу его (ни один драйвер не был связан):
C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=01(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=83(I) Atr=03(Int.) MxPS= 64 Ivl=5ms
E: Ad=84(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=03(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
I:* If#= 8 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=85(I) Atr=03(Int.) MxPS= 64 Ivl=5ms
E: Ad=86(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=04(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
Как видно из строки «C:», устройство имеет 4 интерфейса.Затем в строках «I:» он перечисляет 4 интерфейса как «0, 2, 3 и 8».В «include / linux / usb.h» говорится, что «стандарт USB гласит, что интерфейсы должны быть пронумерованы от 0 до desc.bNumInterfaces-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. Теперь этот модем работает в других системах мира.Что за хитрость заставляет драйверы привязываться к устройству с непоследовательными нумерованными интерфейсами?
Я был бы рад лишь некоторыми подсказками, где искать этот ответ.Я не нашел ответа ни в «драйверах устройств Linux» О'Рейли, ни в исходном коде, и я искал больше дня.
Вот установка:
Пользовательская платформа ARM Cortex A8 под управлением Android Gingerbread с ядром 2.6.35.7.Для этого это то же самое, что и стандартный Linux ARM.Он просто не имеет всех наворотов полноценной системы Ubuntu.