最少的Linux内核选项可启用隐藏输入

问题描述

我需要使用自定义Linux(v5.8)处理HID设备(条形码读取器)。

我有一个模块化内核,可以与其他USB外围设备(存储和串行工作正常)一起使用,但是我似乎无法扫描该设备。

将其插入台式机(如果需要的话,将其放入Linux Mint“ Ulyana”),我会得到一个普通的枚举:

[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,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,2008 Symbol Bar Code Scanner] on usb-0000:00:14.0-11/input0

在我的目标上,我看不到新外围设备的迹象;即使我手动lsusb(我认为是)相关模块,modprobe也仅显示根HUB:

# 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,usbcore

我显然缺少一些东西,但是我似乎无法理解。 我应该怎么检查?

注意:请随时询问相关细节,为了避免混乱,我在这里没有做太多说明,但是我已经准备好提供所有认为有用的信息。

解决方法

事实证明,即使将低速外围设备连接到USB2(EHCI)控制器,也需要 来处理OHCI驱动程序。

实际上,MT7628具有一个“二级” OHCI控制器,甚至在数据表中也没有公布。

这意味着,除了选择CONFIG_USB_OHCI_HCD=mCONFIG_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 = <&usb_phy>;
+       phy-names = "usb";
+
+       interrupt-parent = <&intc>;
+       interrupts = <18>;
+   };
+
    ethernet: ethernet@10100000 {
        compatible = "ralink,rt5350-eth";
        reg = <0x10100000 0x10000>;

MT7628编程手册中未提及注释地址101c1000,它与标准(且有记录)EHCI控制器单元(101c0000)“相隔一个单元”(0x1000)。

我认为对于其他SoC来说也是如此,因为USB标准要求将低速设备“移交给”传统USB1控制器。

我希望这会给那些陷入同一问题的人带来很多麻烦。