ЗАО «ЗЭО»
Техническая поддержка пользователей => Тион, Тион-Про, Тион-Про v2, Сириус => Тема начата: MOHOMAX от 15 Сентября, 2011, 00:52:22
-
Здравствуйте!
Я налаживаю связь тиона с USB-модемом (ОС Линукс). Не могу привязать USB модем к драйверу. Тион видит модем:
# lsusb
Bus 001 Device 007: ID 22b8:2d99 Motorola PCS
Bus 001 Device 001: ID 0000:0000
Драйвер usbserial загружен
usbcore: registered new interface driver usbserial
drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
drivers/usb/serial/usb-serial.c: USB Serial Driver core
Но при подключении модема он не вызывает драйвер usbserial
usb 1-2: new full speed USB device using ep93xx-usb and address 3
usb 1-2: not running at top speed; connect to a high speed hub
usb 1-2: configuration #1 chosen from 1 choice
При попытке привязать драйвер к устройству, вижу такое:
# usbserial vendor=0x22b8 product=0x2b99
-sh: usbserial: not found
НО: если в исходниках драйвера в файле generic.c прописать нужный вендор и продукт, пересобрать ядро и прошить, то модем определяется и я вижу долгожданное:
usbserial_generic 1-2:1.0: generic converter detected
usbserial_generic 1-2:1.0: Generic device with no bulk out, not allowed.
usbserial_generic: probe of 1-2:1.0 failed with error -5
usbserial_generic 1-2:1.1: generic converter detected
usb 1-2: generic converter now attached to ttyUSB0
usbserial_generic 1-2:1.2: generic converter detected
usb 1-2: generic converter now attached to ttyUSB1
usbserial_generic 1-2:1.3: generic converter detected
usb 1-2: generic converter now attached to ttyUSB2
Вопрос: как динамически подключать драйвер usbserial к нужному мне устройству с нужными вендором и продуктом ID?
-
http://www.google.com/search?q=usbserial+vendor+id
-
я уже это пробовал. Не работает:
# modprobe usbserial vendor=0x22b8 product=0x2d99
modprobe: chdir(2.6.20.21): No such file or directory
такое ощущение, что modprobe работает как то криво. Причем chdir(2.6.20.21)?
-
modprobe работает как и должен. Если вы по какой-то причине не можете предоставить ему требуемые файлы/директории, используйте insmod.
http://zao-zeo.ru/dokuwiki/doku.php/linux#модули_ядра
-
по поводу модулей понятно. modprobe не мог их найти в папке /lib/modules/версия ядра. И если бы usbserial был бы модулем, то надо было бы посемтить его в указанную папку и все было бы хорошо. Но usbserial не является модулем. Он является компонентов ядра. Более того, когда конфигурируется ядро перед компиляцией, компонент Device Drivers->USB support->USB serial converter support->USB generic serial driver даже нельзя сделать модулем. Он либо отключен, либо включается в состав ядра. Что делать в этом случае? Как сказать линуксу, что надо использовать драйвер usbserial для устройства с нужными vendor и product? команда usbserial vendor=0xXXXX product=0xXXXX не выполняется
-
<linux-src>/Documentation/kernel-parameters.txt
-
в этом документе написано
Module parameters for modules that are built into the kernel image
are specified on the kernel command line with the module name plus
'.' plus parameter name, with '=' and value if appropriate, such as:
usbcore.blinkenlights=1
Но c usbserial это не проходит.
# usbserial.vendor=0x22b8
-sh: usbserial.vendor=0x22b8: not found
Больше ничего полезного в этом документе по usbserial я не нашел. Там описаны параметры ядра, но ничего относящегося к моему драйверу я не нашел.
В инете пишут, что привязать драйвер можно выполнив команду
echo -n "1-1:1.0" > /sys/bus/usb/drivers/usbserial/bind
, где надо подставить номер USB устройства.
У меня эта команда выполняется, но ничего не происходит.
Все-таки смог вынести usbserial в отдельный модуль. Пересобрал ядро, скопировал в папку /lib/modules/ полученные модули. Выполняю
# modprobe usbserial vendor=0x22b8 product=2d99
usbserial: unknown relocation: 40
modprobe: failed to load module usbserial: invalid module format
Где то прочитал, что в конфигурации ядра надо установить параметр CONFIG_MODVERSIONS. Установил. Пересобрал ядро, заменил модули. Но реакция на modprobe такая же. insmod так же не хочет работать:
# insmod usbserial.ko vendor=0x22b8 product=0x2d99
usbserial: unknown relocation: 40
insmod: can't insert 'usbserial.ko': invalid module format
В чем проблема? Что это за ошибка?
-
> -sh: usbserial.vendor=0x22b8: not found
Это не имеет отношения к консоли.
> Там описаны параметры ядра
Именно и если драйвер не собран модулем, то его параметры указываются в параметрах ядра. Где указываются параметры ядра?
> insmod: can't insert 'usbserial.ko': invalid module format
Видимо ядро или модуль не одного типа OBI/EABI.
-
в инете описывают несколько вариантов сметы параметров ядра. Как правило все они работают с папкой /proc
1. Использование sysctl. Я так понял, что надо выполнить что то вроде
# sysctl -w usbserial.vendor=0x22b8
sysctl: error: 'usbserial.vendor' is an unknown key
Команда sysctl -a выдает список, в котором нет ничего про USB
2. Теоретически в папке /proc/sys/kernel должен быть файл usbserial, который конфигурирует этот параметр. Но в этой папаке файлов совсем не много и usbserial там нет
3. Заслать значение параметра в определенный файл в папке /proc/
В папаке /proc я нашел только один файл, имеющий отнгошение к usbserial. Это /proc/tty/driver/usbserial
Я пытался отправить в него что то вроде
echo "vendor=0x22b8"
Но ничего не происходило. Потом заметил, что файл usbserial доступен только для чтения
Где то я не там ищу?
>Видимо ядро или модуль не одного типа OBI/EABI.
Но собираются то они вместе. Модули собираются вместе с ядром, потом переносятся в папку ./lib/modules. Как они могут быть не одного типа?
-
Я знаю только такой вариант:
http://zao-zeo.ru/dokuwiki/doku.php/u-boot#параметры_ядра
> собираются то они вместе
И вы перезаписываете на Тионе полученное при этом ядро?
-
Да, по вашему способу получилось.
То есть в загрузчике поменял значение bootargs c
setenv bootargs 'console=ttyAM0,57600n8 root=/dev/mtdblock2 rootfstype=jffs2'
на
setenv bootargs 'console=ttyAM0,57600n8 root=/dev/mtdblock2 rootfstype=jffs2 usbserial.vendor=0x22b8 usbserial.product=0x2d99'
И драйвер, собранный в составе ядра заработал с моим устройством.
По поводу модулей остается не понятно. Модули и ядро я собирал одновременно, перепрошивал ядро и копировал модули в папку /lib/modules, но при этом при загрузке модуля выскакивала ошибка "invalid module format". Было бы неплохо с этим разобраться, так как в случае если несколько устройств потребуют драйвер usbserial, фокус с bootargs может не прокатить.