#linux-kernel #usb #embedded-linux #hid
#linux-ядро #usb #встроенный-linux #скрытый
Вопрос:
Мне нужно обработать устройство HID (считыватель штрих-кодов) с помощью пользовательского Linux (v5.8).
У меня модульное ядро, которое работает, как и ожидалось, с другими периферийными устройствами USB (известно, что хранилище и последовательный порт работают), но, похоже, я не могу просканировать это устройство.
Подключаем его к рабочему столу (Linux Mint «Ульяна», если это имеет значение) Я получаю обычное перечисление:
[525428.367216] usb 1-11: new full-speed USB device number 9 using xhci_hcd
[525428.517071] usb 1-11: New USB device found, idVendor=05e0, idProduct=1200, bcdDevice= 1.00
[525428.517077] usb 1-11: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[525428.517080] usb 1-11: Product: Symbol Bar Code Scanner
[525428.517083] usb 1-11: Manufacturer: Symbol Technologies, Inc, 2008
[525428.517086] usb 1-11: SerialNumber: S/N:0641F625A3A943949AF00BAB171ABFE2 Rev:PAACFS00-001-R023
[525428.519932] input: Symbol Technologies, Inc, 2008 Symbol Bar Code Scanner as /devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/0003:05E0:1200.0005/input/input32
[525428.579736] hid-generic 0003:05E0:1200.0005: input,hidraw4: USB HID v1.10 Keyboard [Symbol Technologies, Inc, 2008 Symbol Bar Code Scanner] on usb-0000:00:14.0-11/input0
В то время как на моей цели я не вижу никаких признаков нового периферийного устройства; lsusb
отображает только корневой концентратор, даже когда я вручную modprobe
(как я думаю) соответствующие модули:
# lsusb
Bus 001 Device 001: ID 1d6b:0002
# lsmod
Module Size Used by Not tainted
usbhid 23296 0
usbmon 19424 0
mt7603e 38048 0
mt76 31648 1 mt7603e
mac80211 380000 2 mt7603e,mt76
sha256_generic 2240 0
libsha256 8480 1 sha256_generic
ehci_platform 4704 0
cfg80211 236736 3 mt7603e,mt76,mac80211
ehci_hcd 37936 1 ehci_platform
rfkill 8544 1 cfg80211
usbcore 143456 4 usbhid,usbmon,ehci_platform,ehci_hcd
libarc4 832 1 mac80211
mtk_eth 30208 0
usb_common 2768 3 usbmon,ehci_platform,usbcore
Я, очевидно, что-то упускаю, но, похоже, не могу понять, что.
Что я должен перепроверить?
Примечание: пожалуйста, не стесняйтесь запрашивать соответствующие детали, я не поместил здесь слишком много вещей, чтобы избежать загромождения, но я полностью готов предоставить всю информацию, которую считаю полезной.
Комментарии:
1. USB-сканеры штрих-кодов обычно выглядят как клавиатуры, которые обычно не создают узлы устройств.
2. @stark подтверждено. Этот сканер работает в «режиме эмуляции клавиатуры». Мне непонятно, что вы пытаетесь сказать; не могли бы вы уточнить, пожалуйста? на рабочем столе я вижу: «Bus 001 Device 009: ID 05e0: 1200 Symbol Technologies Сканер штрих-кода», в то время как на цели я ничего не вижу, и сканер не работает, даже звуковой сигнал при запуске, как будто он вообще не включен.
3. Вы уверены, что ваша цель обеспечивает достаточную мощность?
4. @stark: Да. Это же оборудование работает с древней версией ядра (3,18 тонны исправлений поставщика). Я пытаюсь перейти на современную сборку (для несвязанных проблем), и это одна из последних вещей, оставшихся для «переноса». К сожалению, конфигурация ядра изменилась достаточно, чтобы затруднить сравнение.
5. Можете ли вы попробовать подключить что-то еще, или это жестко подключено?
Ответ №1:
Оказывается, драйвер OHCI необходим для работы с низкоскоростными периферийными устройствами, даже если они подключены к контроллеру USB2 (EHCI).
На самом деле MT7628 имеет «вторичный» контроллер OHCI, который даже не указан в спецификации.
Это означает, что помимо выбора CONFIG_USB_OHCI_HCD=m
, а CONFIG_USB_OHCI_HCD_PLATFORM=m
также необходим следующий патч:
diff --git a/arch/mips/boot/dts/ralink/mt7628a.dtsi b/arch/mips/boot/dts/ralink/mt7628a.dtsi
index bf6b6a459bd6..b4ac008fdfdf 100644
--- a/arch/mips/boot/dts/ralink/mt7628a.dtsi
b/arch/mips/boot/dts/ralink/mt7628a.dtsi
@@ -323,6 323,17 @@ ehci@101c0000 {
interrupts = <18>;
};
ohci@101c1000 {
compatible = "generic-ohci";
reg = <0x101c1000 0x1000>;
phys = <amp;usb_phy>;
phy-names = "usb";
interrupt-parent = <amp;intc>;
interrupts = <18>;
};
ethernet: ethernet@10100000 {
compatible = "ralink,rt5350-eth";
reg = <0x10100000 0x10000>;
Примечание. Адрес 101c1000 нигде не упоминается в руководстве по программированию MT7628, и он находится «на расстоянии одной ячейки» (0x1000) от стандартной (и документированной) ячейки контроллера EHCI (в 101c0000).
Я предполагаю, что аналогичная ситуация справедлива и для других SoC, поскольку стандарт USB предписывает «передавать» низкоскоростные устройства на устаревший контроллер USB1.
Я надеюсь, что это избавит от большой головной боли тех, кто столкнется с той же проблемой.