问题描述
我需要使用自定义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=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 = <&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控制器。
我希望这会给那些陷入同一问题的人带来很多麻烦。