Здравствуйте. Вдруг опытные люди найдутся?
Суть:
Устройство на основе 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', но так и не нашел место с циклом опроса.