Как связать USB-устройство с непоследовательными номерами интерфейса - PullRequest
1 голос
/ 06 декабря 2011

Я пытаюсь подключить сотовый 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.

1 Ответ

1 голос
/ 08 декабря 2011

Проблема решена, и хотя она выглядела так, как было объяснено в вопросе, она не имела к этому никакого отношения.Даже если в коде ядра есть несколько мест, в которых говорится, что интерфейсы USB должны быть последовательно пронумерованы, он может обрабатывать их практически в любом порядке.Моей настоящей проблемой была сломанная система сборки.По крайней мере один файл не обновлялся, и когда я добавил следы в другой файл, он инициировал обновление модуля.Это решило проблему, заставив ее работать как "магия".Я думаю, я начну делать «чистку», когда буду испытывать очень странные вещи.В конце концов, на машине с большим количеством оперативной памяти и убийственным жестким диском перекомпиляция ядра занимает не так много времени.

...