備忘錄_20160105(定位)
修改
回首頁
程式 2025-10-31 00:59:56 1761843596 100
讓 raspberry pi zero 2 w 變成鍵盤
讓 raspberry pi zero 2 w 變成鍵盤
若要復原的話!
1./boot/firmware/config.txt 把 dtoverlay=dwc2 拿掉
2.sudo modprobe -r libcomposite
3.sudo reboot
- [micro usb] : POWER IN,就接電源
- [micro usb] : micro usb 公 - usb a 公 (接 Nintendo Switch 或 PC)
- [mini HDMI] : 空
- [micro sd] : micro sd 卡 (已安裝 raspberry pi os 64bit)
- 請用 ssh 的方式連入 pi zero 2 w 控制
sudo nano /boot/firmware/config.txt
在最後一行,通常會是 [all] 之後,加入
dtoverlay=dwc2
儲存後,重新開機 (sudo reboot)
sudo ./kb.sh
sudo python test.py
====== kb.sh (請加上 chmod +x) ======
#!/bin/bash
modprobe libcomposite
mount -t configfs none /sys/kernel/config
G=/sys/kernel/config/usb_gadget/pi_keyboard
mkdir -p $G
echo 0x1d6b > $G/idVendor # Linux Foundation
echo 0x0104 > $G/idProduct # Multifunction Composite Gadget
echo 0x0100 > $G/bcdDevice
echo 0x0200 > $G/bcdUSB
mkdir -p $G/strings/0x409
echo "fedcba9876543210" > $G/strings/0x409/serialnumber
echo "Raspberry Pi" > $G/strings/0x409/manufacturer
echo "Pi Zero Keyboard" > $G/strings/0x409/product
mkdir -p $G/configs/c.1/strings/0x409
echo "Config 1: HID Keyboard" > $G/configs/c.1/strings/0x409/configuration
echo 120 > $G/configs/c.1/MaxPower
mkdir -p $G/functions/hid.usb0
echo 1 > $G/functions/hid.usb0/protocol
echo 1 > $G/functions/hid.usb0/subclass
echo 8 > $G/functions/hid.usb0/report_length
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' \
> $G/functions/hid.usb0/report_desc
ln -s $G/functions/hid.usb0 $G/configs/c.1/
ls /sys/class/udc > $G/UDC
====== test.py ======
import time
HID_DEVICE = "/dev/hidg0"
# 鍵盤對應表: https://usb.org/sites/default/files/hut1_3_0.pdf
# 例如: a = 0x04, b = 0x05, enter = 0x28
KEY_A = 0x04
KEY_ENTER = 0x28
def send_key(hid, keycode):
report = bytearray(8)
report[2] = keycode # 第三個位元是 key code
with open(hid, "wb") as f:
f.write(report)
f.flush()
time.sleep(0.1)
# 放開按鍵
with open(hid, "wb") as f:
f.write(b'\x00'*8)
f.flush()
time.sleep(10)
for i in range(20):
send_key(HID_DEVICE, KEY_A)
time.sleep(0.01)
send_key(HID_DEVICE, KEY_ENTER)
time.sleep(0.01)