3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspy Zero WH でキー変換器を作る

Posted at

はじめに

Mac使いとしては、Windowsのキーボードの配置にはどうやっても馴染めません。
通常ならばChange Keyのお世話になりますが、借り物のPCなどではインストールできない場合があります。
なので、物理的に変換してやろうと思います。

(Apple Keyboardを使う案もありますが、どのみちドライバーをいれたりは借り物はダメなので。また、キーボードはThinkpad Tracpoint Keyboardを使いたいので)

使うもの

  • Raspberry Pi Zero WH:秋月電子で購入
  • USB micro B OTGケーブル
  • Thinkpad Tracpoint Keyborad(USBではなくてBluetoothの方)

途中で分かったのですがRaspiZeroWをUSBデバイスとして動作させるとホストにはなれないのでUSBキーボードはつながりません。Bluetoothキーボードを準備することにします。

作り方

Raspberry Pi Zero WHのセットアップ

micro SDの準備

ここに従って作業を進める

  • Raspberry Pi Imager For MacOSをダウンロードしてインストール

  • Raspberry Pi Imagerを起動して、OSとSDカードを選択
    RaspiImager.png
    RaspiImagerSelectOS.png
    RaspiImagerSelectSD.png

  • 書込み
    RaspiImagerWriting.png

  • "boot"がマウントされる

この辺を参考にしてSSHの有効かとWiFiの設定をしておく

  • SSHを有効にする
# cd /Volumes/boot
# touch ssh
  • WiFiを有効にする
    • 2.4GHzのアクセスポイントを選択(5GHzを指定していてハマった)
    • ステルスモードの時は"scan_ssid=1"を使う
# nano wpa_supplicant.conf
wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        ssid="接続したいSSID"
        psk="SSIDのパスワード"
        scan_ssid=1
}
  • 生のパスワードが嫌な人は"wpa_passphrase"コマンドを使うといい(この辺を参考に)

起動

単体

  1. USBケーブルで母艦(Mac)につなぐ

Desktop

  1. HDMIでモニターつなぐ
  2. Thinkpad Tracpoint Keyboardをつなぐ
  3. 電源を入れる

母艦(Mac)からSSHで接続する

$ ssh pi@raspberrypi.local

TODO: 母艦からシリアルでコンソールに接続する

RaspiをUSB Keyboard(ThinkPad Tracpoint Keyboard)に見せる

Keyboard、Tracpoint操作をモニターする

参考

USBにKeyboardを接続して、認識状況を確認する

(この結果は使わないかも。。。)

pi@raspberrypi:~ $ lsusb 
Bus 001 Device 002: ID 17ef:6047 Lenovo 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $ usb-devices 
(省略)
T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=17ef ProdID=6047 Rev=03.30
S:  Manufacturer=Lenovo
S:  Product=ThinkPad Compact USB Keyboard with TrackPoint
C:  #Ifs= 2 Cfg#= 1 Atr=a0 MxPwr=100mA
I:  If#=0x0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=01 Driver=usbhid
I:  If#=0x1 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=usbhid

interface0がキーボード、1がtracpoint

pi@raspberrypi:~ $ cat /proc/bus/input/devices 
I: Bus=0003 Vendor=17ef Product=6047 Version=0100
N: Name="Lenovo ThinkPad Compact USB Keyboard with TrackPoint"
P: Phys=usb-20980000.usb-1/input0
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1:1.0/0003:17EF:6047.0005/input/input14
U: Uniq=
H: Handlers=sysrq kbd leds event0 
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff800000 7ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=1f

I: Bus=0003 Vendor=17ef Product=6047 Version=0100
N: Name="Lenovo ThinkPad Compact USB Keyboard with TrackPoint Mouse"
P: Phys=usb-20980000.usb-1/input1
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1:1.1/0003:17EF:6047.0006/input/input15
U: Uniq=
H: Handlers=mouse0 event1 
B: PROP=0
B: EV=17
B: KEY=1f0000 0 0 0 0 0 0 0 0
B: REL=143
B: MSC=10

(省略)
  • tracpointを動かしてみる
pi@raspberrypi:~ $ hexdump /dev/input/mouse0 
0000000 ff18 0800 0100 ff18 1801 01fd ff18 1801
0000010 01ff ff18 0801 0100 0008 1801 03ff 0008
0000020 1803 03ff ff18 0803 0100 ff18 1803 03ff
0000030 0008 1803 01ff ff18 0803 0300 ff18 0803
0000040 0100 0008 0801 0100 0008 1803 01ff ff18
0000050 0803 0300 ff18 0803 0300 ff18 1803 03ff
0000060 ff18 0803 0400 ff18 1803 04ff ff18 1804
  • キー入力してみる
pi@raspberrypi:~ $ hexdump /dev/input/event0
0000000 a065 5eae 5f51 0009 0004 0004 0009 0007
0000010 a065 5eae 5f51 0009 0001 0021 0001 0000
0000020 a065 5eae 5f51 0009 0000 0000 0000 0000
0000030 a065 5eae 3639 000a 0004 0004 0009 0007
0000040 a065 5eae 3639 000a 0001 0021 0000 0000
0000050 a065 5eae 3639 000a 0000 0000 0000 0000
  • USBのディスクリプターを確認
pi@raspberrypi:~ $ sudo usbhid-dump 
001:002:001:DESCRIPTOR         1588590895.130327
 05 01 09 02 A1 01 85 01 05 09 19 01 29 05 15 00
 25 01 75 01 95 05 81 02 75 03 95 01 81 01 05 01
 09 01 A1 00 09 30 09 31 15 81 25 7F 75 08 95 02
 81 06 C0 09 38 95 01 81 06 05 0C 0A 38 02 81 06
 C0 05 0C 09 01 A1 01 85 10 15 00 26 3C 02 19 00
 2A 3C 02 75 10 95 01 81 00 C0 06 A3 FF 09 01 A1
 01 85 11 19 00 2A FF 00 15 00 26 FF 00 75 08 95
 02 81 02 C0 06 A0 FF 09 01 A1 01 85 15 1A F1 00
 2A FC 00 15 00 25 01 75 01 95 0D 81 02 95 03 81
 01 C0 06 A1 FF 09 01 A1 01 85 16 19 00 2A FF 00
 15 00 26 FF 00 75 08 95 02 81 02 C0 06 00 FF 09
 01 A1 01 85 13 09 01 15 00 26 FF 00 75 08 95 08
 81 02 09 02 75 08 95 08 91 02 09 03 75 08 95 08
 B1 02 C0

001:002:000:DESCRIPTOR         1588590895.133830
 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01
 75 01 95 08 81 02 95 01 75 08 81 01 95 05 75 01
 05 08 19 01 29 05 91 02 95 01 75 03 91 01 95 06
 75 08 16 00 00 26 AF 00 05 07 1A 00 00 2A AF 00
 81 00 05 0C 09 00 15 80 25 7F 75 08 95 08 B1 02
 C0

https://eleccelerator.com/usbdescreqparser/#で内容を調べてみる

interface1 -> tracpoint

0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
0x09, 0x02,        // Usage (Mouse)
0xA1, 0x01,        // Collection (Application)
0x85, 0x01,        //   Report ID (1)
0x05, 0x09,        //   Usage Page (Button)
0x19, 0x01,        //   Usage Minimum (0x01)
0x29, 0x05,        //   Usage Maximum (0x05)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x01,        //   Logical Maximum (1)
0x75, 0x01,        //   Report Size (1)
0x95, 0x05,        //   Report Count (5)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x75, 0x03,        //   Report Size (3)
0x95, 0x01,        //   Report Count (1)
0x81, 0x01,        //   Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01,        //   Usage Page (Generic Desktop Ctrls)
0x09, 0x01,        //   Usage (Pointer)
0xA1, 0x00,        //   Collection (Physical)
0x09, 0x30,        //     Usage (X)
0x09, 0x31,        //     Usage (Y)
0x15, 0x81,        //     Logical Minimum (-127)
0x25, 0x7F,        //     Logical Maximum (127)
0x75, 0x08,        //     Report Size (8)
0x95, 0x02,        //     Report Count (2)
0x81, 0x06,        //     Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              //   End Collection
0x09, 0x38,        //   Usage (Wheel)
0x95, 0x01,        //   Report Count (1)
0x81, 0x06,        //   Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x0C,        //   Usage Page (Consumer)
0x0A, 0x38, 0x02,  //   Usage (AC Pan)
0x81, 0x06,        //   Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              // End Collection
0x05, 0x0C,        // Usage Page (Consumer)
0x09, 0x01,        // Usage (Consumer Control)
0xA1, 0x01,        // Collection (Application)
0x85, 0x10,        //   Report ID (16)
0x15, 0x00,        //   Logical Minimum (0)
0x26, 0x3C, 0x02,  //   Logical Maximum (572)
0x19, 0x00,        //   Usage Minimum (Unassigned)
0x2A, 0x3C, 0x02,  //   Usage Maximum (AC Format)
0x75, 0x10,        //   Report Size (16)
0x95, 0x01,        //   Report Count (1)
0x81, 0x00,        //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              // End Collection
0x06, 0xA3, 0xFF,  // Usage Page (Vendor Defined 0xFFA3)
0x09, 0x01,        // Usage (0x01)
0xA1, 0x01,        // Collection (Application)
0x85, 0x11,        //   Report ID (17)
0x19, 0x00,        //   Usage Minimum (0x00)
0x2A, 0xFF, 0x00,  //   Usage Maximum (0xFF)
0x15, 0x00,        //   Logical Minimum (0)
0x26, 0xFF, 0x00,  //   Logical Maximum (255)
0x75, 0x08,        //   Report Size (8)
0x95, 0x02,        //   Report Count (2)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              // End Collection
0x06, 0xA0, 0xFF,  // Usage Page (Vendor Defined 0xFFA0)
0x09, 0x01,        // Usage (0x01)
0xA1, 0x01,        // Collection (Application)
0x85, 0x15,        //   Report ID (21)
0x1A, 0xF1, 0x00,  //   Usage Minimum (0xF1)
0x2A, 0xFC, 0x00,  //   Usage Maximum (0xFC)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x01,        //   Logical Maximum (1)
0x75, 0x01,        //   Report Size (1)
0x95, 0x0D,        //   Report Count (13)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x03,        //   Report Count (3)
0x81, 0x01,        //   Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              // End Collection
0x06, 0xA1, 0xFF,  // Usage Page (Vendor Defined 0xFFA1)
0x09, 0x01,        // Usage (0x01)
0xA1, 0x01,        // Collection (Application)
0x85, 0x16,        //   Report ID (22)
0x19, 0x00,        //   Usage Minimum (0x00)
0x2A, 0xFF, 0x00,  //   Usage Maximum (0xFF)
0x15, 0x00,        //   Logical Minimum (0)
0x26, 0xFF, 0x00,  //   Logical Maximum (255)
0x75, 0x08,        //   Report Size (8)
0x95, 0x02,        //   Report Count (2)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              // End Collection
0x06, 0x00, 0xFF,  // Usage Page (Vendor Defined 0xFF00)
0x09, 0x01,        // Usage (0x01)
0xA1, 0x01,        // Collection (Application)
0x85, 0x13,        //   Report ID (19)
0x09, 0x01,        //   Usage (0x01)
0x15, 0x00,        //   Logical Minimum (0)
0x26, 0xFF, 0x00,  //   Logical Maximum (255)
0x75, 0x08,        //   Report Size (8)
0x95, 0x08,        //   Report Count (8)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x02,        //   Usage (0x02)
0x75, 0x08,        //   Report Size (8)
0x95, 0x08,        //   Report Count (8)
0x91, 0x02,        //   Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x09, 0x03,        //   Usage (0x03)
0x75, 0x08,        //   Report Size (8)
0x95, 0x08,        //   Report Count (8)
0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0xC0,              // End Collection

// 211 bytes

interface0 -> keyboard

0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
0x09, 0x06,        // Usage (Keyboard)
0xA1, 0x01,        // Collection (Application)
0x05, 0x07,        //   Usage Page (Kbrd/Keypad)
0x19, 0xE0,        //   Usage Minimum (0xE0)
0x29, 0xE7,        //   Usage Maximum (0xE7)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x01,        //   Logical Maximum (1)
0x75, 0x01,        //   Report Size (1)
0x95, 0x08,        //   Report Count (8)
0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x01,        //   Report Count (1)
0x75, 0x08,        //   Report Size (8)
0x81, 0x01,        //   Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x05,        //   Report Count (5)
0x75, 0x01,        //   Report Size (1)
0x05, 0x08,        //   Usage Page (LEDs)
0x19, 0x01,        //   Usage Minimum (Num Lock)
0x29, 0x05,        //   Usage Maximum (Kana)
0x91, 0x02,        //   Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x01,        //   Report Count (1)
0x75, 0x03,        //   Report Size (3)
0x91, 0x01,        //   Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0x95, 0x06,        //   Report Count (6)
0x75, 0x08,        //   Report Size (8)
0x16, 0x00, 0x00,  //   Logical Minimum (0)
0x26, 0xAF, 0x00,  //   Logical Maximum (175)
0x05, 0x07,        //   Usage Page (Kbrd/Keypad)
0x1A, 0x00, 0x00,  //   Usage Minimum (0x00)
0x2A, 0xAF, 0x00,  //   Usage Maximum (0xAF)
0x81, 0x00,        //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x0C,        //   Usage Page (Consumer)
0x09, 0x00,        //   Usage (Unassigned)
0x15, 0x80,        //   Logical Minimum (-128)
0x25, 0x7F,        //   Logical Maximum (127)
0x75, 0x08,        //   Report Size (8)
0x95, 0x08,        //   Report Count (8)
0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0xC0,              // End Collection

// 81 bytes

たくさんある。。。

Thinkpad Trackpoint Keyboard Bluetoothを繋げてみる

こちらに記述しました。

USBデバイスになる

起動時にUSB Composite Driver を有効にします

pi@raspberrypi:~/hid_test $ echo "dtoverlay=dwc2" | sudo tee -a 
/boot/config.txt
pi@raspberrypi:~/hid_test $ echo "dwc2" | sudo tee -a /etc/modules
pi@raspberrypi:~/hid_test $ echo "libcomposite" | sudo tee -a /etc/modules
pi@raspberrypi:~/hid_test $ sudo reboot

KeyboardとMouseの複合デバイスを有効にします。

pi@raspberrypi:~/hid_test $ sudo sh ./hid.sh 
pi@raspberrypi:~/hid_test $ ls /dev/ | grep hidg
hidg0
hidg1

hidg0がmouseに、hidg1がkeyboardになります

keyboardとmouseを同時に有効にするのはこちらを参考にしました。

hid.sh
#!/bin/bash
# Snippet from https://github.com/girst/hardpass-sendHID/blob/master/README.md . In which, the following notice was left:

# this is a stripped down version of https://github.com/ckuethe/usbarmory/wiki/USB-Gadgets - I don't claim any rights

cd /sys/kernel/config/usb_gadget/
mkdir -p g1
cd g1
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2
mkdir -p strings/0x409
echo "0" > strings/0x409/serialnumber
echo "sushisuhiBoo" > strings/0x409/manufacturer
echo "USB Gadget (Keyborad and Mouse)" > strings/0x409/product

C=1
mkdir -p configs/c.$C/strings/0x409
echo "Config $C: ECM network" > configs/c.$C/strings/0x409/configuration 
echo 250 > configs/c.$C/MaxPower 

## Mouse
N2="usb0"
mkdir -p functions/hid.$N2
echo 2 > functions/hid.$N2/protocol
echo 1 > functions/hid.$N2/subclass
echo 8 > functions/hid.$N2/report_length
echo -ne \\x05\\x01\\x09\\x02\\xa1\\x01\\x09\\x01\\xa1\\x00\\x05\\x09\\x19\\x01\\x29\\x03\\x15\\x00\\x25\\x01\\x95\\x03\\x75\\x01\\x81\\x02\\x95\\x01\\x75\\x05\\x81\\x01\\x05\\x01\\x09\\x30\\x09\\x31\\x15\\x81\\x25\\x7f\\x75\\x08\\x95\\x02\\x81\\x06\\xc0\\xc0 > functions/hid.$N2/report_desc
ln -s functions/hid.$N2 configs/c.$C/
# End functions

## Keyboard
N1="usb1"
mkdir -p functions/hid.$N1
echo 1 > functions/hid.$N1/protocol
echo 1 > functions/hid.$N1/subclass
echo 8 > functions/hid.$N1/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\\x01\\x95\\x05\\x75\\x01\\x05\\x08\\x19\\x01\\x29\\x05\\x91\\x02\\x95\\x01\\x75\\x03\\x91\\x01\\x95\\x06\\x75\\x08\\x16\\x00\\x00\\x26\\xAF\\x00\\x05\\x07\\x1A\\x00\\x00\\x2A\\xAF\\x00\\x81\\x00\\x05\\x0C\\x09\\x00\\x15\\x80\\x25\\x7F\\x75\\x08\\x95\\x08\\xB1\\x02\\xC0 > functions/hid.$N1/report_desc
ln -s functions/hid.$N1 configs/c.$C/
## End function

## enable USB Device
ls /sys/class/udc > UDC

これで参考ページのようにデバイス(hidg0,hidg1)にデータを書き込むとUSBホストのPCを操作できます。

デバイスを無効にするには以下のコマンドを利用します。参考

hid_del.sh
echo "" > /sys/kernel/config/usb_gadget/g1/UDC

cd /sys/kernel/config/usb_gadget
rm g1/configs/c.1/hid.usb0
rm g1/configs/c.1/hid.usb1
rmdir g1/configs/c.1/strings/0x409
rmdir g1/configs/c.1
rmdir g1/functions/hid.usb0
rmdir g1/functions/hid.usb1
rmdir g1/strings/0x409
rmdir g1

Keyboard、TracPoint操作をUSBデバイスに送り込む

Tracpoint

/dev/input/event1(mouse)の入力するを/dev/hidg0に書き込みます。

sudo pip install pydev
sudo python mouse3.py
....
mouse3.py
from evdev import InputDevice, categorize, ecodes

dev = InputDevice('/dev/input/ThinkPadTracPointKeyboardMouse')
for event in dev.read_loop():
	buf = bytearray()
	if event.type == ecodes.EV_REL:
		if event.code == ecodes.REL_X:
			print('REL_X:{}'. format(event.value))
			if 0 < event.value:
				buf.extend([0, event.value, 0])
			else:
				buf.extend([0, 0xFF + event.value, 0])
		elif event.code == ecodes.REL_Y:
			print('REL_Y:{}'.format(event.value))
			if 0 < event.value:
				buf.extend([0, 0, event.value])
			else:
				buf.extend([0, 0, 0xFF + event.value])
		if event.code == ecodes.REL_WHEEL:
			print('REL_WHEEL:{}'.format(event.value))
	elif event.type == ecodes.EV_KEY:
		if event.code == ecodes.BTN_LEFT:
			print('BTN_LEFT:{}'.format(event.value))
			buf.extend([1 * event.value, 0, 0])
		elif event.code == ecodes.BTN_RIGHT:
			print('BTN_RIGHT:{}'.format(event.value))
			buf.extend([2 * event.value, 0, 0])
		if event.code == ecodes.BTN_MIDDLE:
			print('BTN_MIDDLE:{}'.format(event.value))
			buf.extend([3 * event.value, 0, 0])

	with open("/dev/hidg0", mode="wb") as mouse:
		mouse.write(buf)
		mouse.close()

Keyboard

まずはアルファベットのみ対応

keyboard.py
from evdev import InputDevice, categorize, ecodes

scancode = {}
scancode[ecodes.KEY_A] = 0x04
scancode[ecodes.KEY_B] = 0x05
scancode[ecodes.KEY_C] = 0x06
scancode[ecodes.KEY_D] = 0x07
scancode[ecodes.KEY_E] = 0x08
scancode[ecodes.KEY_F] = 0x09
scancode[ecodes.KEY_G] = 0x0a
scancode[ecodes.KEY_H] = 0x0b
scancode[ecodes.KEY_I] = 0x0c
scancode[ecodes.KEY_J] = 0x0d
scancode[ecodes.KEY_K] = 0x0e
scancode[ecodes.KEY_L] = 0x0f
scancode[ecodes.KEY_M] = 0x10
scancode[ecodes.KEY_N] = 0x11
scancode[ecodes.KEY_O] = 0x12
scancode[ecodes.KEY_P] = 0x13
scancode[ecodes.KEY_Q] = 0x14
scancode[ecodes.KEY_R] = 0x15
scancode[ecodes.KEY_S] = 0x16
scancode[ecodes.KEY_T] = 0x17
scancode[ecodes.KEY_U] = 0x18
scancode[ecodes.KEY_V] = 0x19
scancode[ecodes.KEY_W] = 0x1a
scancode[ecodes.KEY_X] = 0x1b
scancode[ecodes.KEY_Y] = 0x1c
scancode[ecodes.KEY_Z] = 0x1d
scancode[ecodes.KEY_1] = 0x1e
scancode[ecodes.KEY_2] = 0x1f
scancode[ecodes.KEY_3] = 0x20
scancode[ecodes.KEY_4] = 0x21
scancode[ecodes.KEY_5] = 0x22
scancode[ecodes.KEY_6] = 0x23
scancode[ecodes.KEY_7] = 0x24
scancode[ecodes.KEY_8] = 0x25
scancode[ecodes.KEY_9] = 0x26
scancode[ecodes.KEY_0] = 0x27

def main():
	dev = InputDevice("/dev/input/ThinkPadTracPointKeyboard")
	print(dev)

	shift = 0
	ctrl = 0
	alt = 0
	for event in dev.read_loop():
		if event.type == ecodes.EV_KEY:
			# print(categorize(event))
			buf = bytearray()
			# shift 
			if event.code == ecodes.KEY_RIGHTSHIFT or event.code == ecodes.KEY_LEFTSHIFT:
				if event.value == 1:
					shift = 1
				elif event.value == 0:
					shift = 0
			elif event.code == ecodes.KEY_RIGHTCTRL or event.code == ecodes.KEY_LEFTCTRL:
				if event.value == 1:
					ctrl = 1
				elif event.value == 0:
					ctrl = 0
			elif event.code == ecodes.KEY_RIGHTALT or event.code == ecodes.KEY_LEFTALT:
				if event.value == 1:
					alt = 1
				elif event.value == 0:
					alt = 0
			else:
				if event.code in scancode:
					if event.value == 1 or event.value == 2:
						modify = ctrl + (shift << 1) + (alt << 2)
						buf.extend([modify, 0, scancode[event.code]])
					else:
						buf.extend([0, 0, 0])

					buf.extend([0, 0, 0, 0, 0])

					with open("/dev/hidg1", mode="wb") as keyboard:
						keyboard.write(buf)
						keyboard.close()

if __name__ == "__main__":
	main()

キー変換する

長くなったので、残りのキー対応と変換はは別の記事で
Raspy Zero WH でキー変換器を作る (その2)

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?