Pi Zero 作为 HID 设备 - 没有大写字母

Pi Zero as HID Device - no capital letters

我目前正在尝试按照几个准则(例如 https://www.rmedgar.com/blog/using-rpi-zero-as-keyboard-setup-and-device-definition (all 3 parts) or this https://randomnerdtutorials.com/raspberry-pi-zero-usb-keyboard-hid/)用我的 pi 零 w 模拟键盘。

它似乎可以工作,但我只能让它输入小写字符,我不知道为什么。因此,例如,使用此代码行(取自 rmedgar 指南)

write_report(chr(32)+NULL_CHAR+chr(11)+NULL_CHAR*5)

它只是输入了一个小写 "h" - 所以似乎忽略了 chr(32) - 它应该是 SHIFT。我试图用 "showkeys -s" 跟踪 SHIFT 的 scancod,它向我显示 0x2a(推送)和 0xaa(释放)。然后我将上面代码中的 32 替换为 42(dec 中的 0x2a),但这没有任何改变。

我正在使用旧的 Thinkpad x230,会不会是 shift 的扫描码不同?

还有什么我遗漏的吗?

非常感谢 :)

当您发送包含大写字母的 HID 报告时,您需要确保将 Shift 键的修改位设置为 1,就像在您首先键入大写字母的真实键盘上一样按下 Shift。它通常表示为报告中固定位置的单个位,而不是 8 位代码。我不知道您正在使用的 API 的详细信息,但您应该在其文档中搜索 "modifier"、"shift"、"ctrl" 和 [=15= 等关键字].

答案正如 aja 所指出的那样 - 我使用了错误的描述符,应该是

echo -ne \x05\x01\x09\x06\xa1\x01\x05\x07\x19\xe0\x29\xe7\x15\x00\x25\x01\x75\x01\x95\x08\x81\x02\x95\x01\x75\x08\x81\x03\x95\x05\x75\x01\x05\x08\x19\x01\x29\x05\x91\x02\x95\x01\x75\x03\x91\x03\x95\x06\x75\x08\x15\x00\x25\x65\x05\x07\x19\x00\x29\x65\x81\x00\xc0 > functions/hid.usb0/report_desc

因此,在 raspberry pi 零上启用 HID 设备的完整脚本如下所示(主要从我的第一个问题中提到的链接复制)。

#!/bin/bash

# Create gadget
mkdir /sys/kernel/config/usb_gadget/mykeyboard
cd /sys/kernel/config/usb_gadget/mykeyboard

# Add basic information
echo 0x0100 > bcdDevice # Version 1.0.0
echo 0x0200 > bcdUSB # USB 2.0
echo 0x00 > bDeviceClass
echo 0x00 > bDeviceProtocol
echo 0x00 > bDeviceSubClass
echo 0x08 > bMaxPacketSize0
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x1d6b > idVendor # Linux Foundation

# Create English locale
mkdir strings/0x409

echo "My manufacturer" > strings/0x409/manufacturer
echo "My virtual keyboard" > strings/0x409/product
echo "0123456789" > strings/0x409/serialnumber

# Create HID function
mkdir functions/hid.usb0

echo 1 > functions/hid.usb0/protocol
echo 8 > functions/hid.usb0/report_length # 8-byte reports
echo 1 > functions/hid.usb0/subclass
echo -ne \x05\x01\x09\x06\xa1\x01\x05\x07\x19\xe0\x29\xe7\x15\x00\x25\x01\x75\x01\x95\x08\x81\x02\x95\x01\x75\x08\x81\x03\x95\x05\x75\x01\x05\x08\x19\x01\x29\x05\x91\x02\x95\x01\x75\x03\x91\x03\x95\x06\x75\x08\x15\x00\x25\x65\x05\x07\x19\x00\x29\x65\x81\x00\xc0 > functions/hid.usb0/report_desc

# Create configuration
mkdir configs/c.1
mkdir configs/c.1/strings/0x409

echo 0x80 > configs/c.1/bmAttributes
echo 200 > configs/c.1/MaxPower # 200 mA
echo "Example configuration" > configs/c.1/strings/0x409/configuration

# Link HID function to configuration
ln -s functions/hid.usb0 configs/c.1

#Sleep for 10 seconds
sleep 10

# Enable gadget
ls /sys/class/udc > UDC