LINUX.ORG.RU

Сообщения r702

 

Проблемы с внешним USB-хабом в ARM linux.

Здравствуйте. Вдруг опытные люди найдутся?

Суть:

Устройство на основе SoC Allwinner F1C200s. Эта SoC имеет 1 USB OTG порт. Необходимо подключать как минимум клавиатуру и мышь, поэтому используется внешний USB хаб *4 на чипе HS8836A .

Любые USB устройства подключаются без ошибок, но в некоторых комбинациях работают неправильно.

Если подключить 2 USB Flash диска, то работают оба, но если любое из устройств USB клавиатура или мышь, то возникают проблемы, например:

1 случай. Подключаем USB Flash - работает (монтируется). Подключаем второй USB Flash - работают оба.

2 случай . Подключаем USB Flash - работает. Подключаем клавиатуру (мышь) : USB Flash работает, клавиатура (мышь) не работает, хотя определяется без ошибок.

3 случай. Подключаем клавиатуру (мышь) - работает. Любое второе подключенное устройство - не работает.

«не работает» - это значит, счетчик прерываний от контроллера USB (cat /proc/interrupts) не изменяется, если на подключенной вторым устройством клавиатуре (мыши) нажимать кнопки (двигать).

Похоже, второе подключенное устройство в случаях 2 и 3 не опрашивается правильно, даже если подключено без ошибок.

В F1C200s USB контроллер это Inventra MUSB HDRC (Highspeed Dual Role Controller ). Система собрана в Buildroot, init - BusyBox. Ядро 5.4.66 .

В другом устройстве на той же SoC внешний USB-хаб на чипе FE1.1s . Проблемы те же.

Я не знаю, что влияет на работу при подключении USB клавиатуры или мыши, в отличие от USB Flash:

- это «устройство ввода» - это «устройство HID» - это «устройство 'low speed' »

Вопрос, какой модуль в USB-фреймворке ядря linux фактически осуществляет опрос устройств? Core ? hub ? или драйвера (HID, SCSI ...) ? или контроллер на аппаратном уровне? Я попытался для локализации проблемы вставить в исходники ядра в драйвера ветки USB строки printk, в места, где упоминается 'poll', но так и не нашел место с циклом опроса.

 , ,

r702
()

GCC: как защититься от «оптимизации» конструкторов?

Здравствуйте.

Часть кода у меня в проекте выполенена в виде «модулей», то есть, исходник содержит функцию с __attribute__ ((constructor (xx))), выполняемую один раз при старте, которая помещает точки входа модуля в таблицу вызовов. Поскольку ни одна из функций модуля не вызывается явно из других частей программы, оптимизатор при линковке весь это модуль успешно выкидывает. Как сказать линкеру, чтобы он этого не делал?

 

r702
()

Отключить консоль

Вопрос к знатокам:

Имеется: «мобильный» Линукс, в котором запущено несколько консолей: 1. ttyAM0 - терминал на последовательном порту(getty). Сюда же debug ядра. 2. tty0 - клавиатура+фреймбуфер 3.ttyX... telnet,etc...

Вопрос: можно ли каким-то образом _без перезагрузки на время_ отключить консоль ttyAM0, и , желательно, вывод debug , для использования устройства /dev/ttyAM0 приложениями?

r702
()

MotoTRBO RNDIS linux драйвер

Вопрос к опытным людям.

Имеется: цифровая радиостанция стандарта MotoTRBO
с интерфейсом USB.

Есть драйвер под Windows XP, при установке которого образуется
сетевой интерфейс, подключенный к сети. IP адрес выдается
автоматически,но всегда один и тот же. Можно его задать и руками.
К примеру, IP адрес 192.168.10.11, основной шлюз 192.168.10.10
(заносится в радиостанцию вручную спец. программой)
Драйвера под Linux нет.

В документации на радиостанцию указано, что используется RNDIS.
Под Windows драйвер именно такой.

Но lsusb -v
выдает:
====================================

Bus 001 Device 003: ID 0cad:1021 Motorola CGISS
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 2 Communications
bDeviceSubClass 2 Abstract (modem)
bDeviceProtocol 0 None
bMaxPacketSize0 8
idVendor 0x0cad Motorola CGISS
idProduct 0x1021
bcdDevice 1.00
iManufacturer 1 Motorola Corporation
iProduct 2 Motorola LTD Device
iSerial 3 038THQ3788
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 67
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 4mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 0
CDC Header:
bcdCDC 1.10
CDC Call Management:
bmCapabilities 0x00
bDataInterface 0
CDC ACM:
bmCapabilities 0x00
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Device Status: 0x0001
=============

Непонятно.   
Поле bInterfaceProtocol = 1 : AT-commands (v.25ter)
(для RNDIS оно должно быть равно 0xff.)

linux( Fedora 14) соответственно использует драйвер cdc_acm,
появляется устройство /dev/ttyACM0

Но никакого модема там нет!
Если открыть устройство терминалом, ответы на AT-команды отсутствуют.

Хорошо, верим документации, ищем в драйверах RNDIS.
В дистрибутиве есть 2 упоминания RNDIS:
в ветке /drivers/usb/gadget/
и
/drivers/net/usb - rndis_host.

Для rndis_host нужно загрузить cdc_ether. Он не «видит» устройства
по причине несоответствия bInterfaceProtocol.

Эксперимент:
Патчим cdc_ether, чтобы устройство 0cad:1021 распознавалось, как
поддерживающее RNDIS.
Понятно, что никакой гарантии работы нет.

Устанавливаем:
rmmod cdc_acm
modprobe usbnet
insmod cdc_ether.ko - тут появляется сетевой интерфейс usb0
insmod rndis_host.ko

Конфигурим:
ifconfig usb0 192.168.10.11 netmask 255.255.255.0 up

Ну и собственно на этом всё.
----
ping 192.168.10.10 -I usb0
Warning: cannot bind to specified iface, falling back: Операция не позволяется
---


Куда копать?

В железе, USB, низкоуровневых драйверах разбираюсь, как работает
usbnet и rndis host понимаю плохо.

r702
()

RSS подписка на новые темы