Usually, a Bluetooth connected keyboard cannot be used in the BIOS or FileVault unlocking screen.
I looked for a way to bypass this, but the only way I could find was to use a feature called HID Proxy.
This article explains how to use the Bluetooth connected keyboard in the BIOS and FileVault password entry screen with the HID Proxy.
How it works
![](https://satoh.dev/wp-content/uploads/2020/12/hid_proxy.jpg)
Raspberry Pi Zero W receives keyboard input via Bluetooth.
Then, Raspberry Pi Zero W acting as a virtual keyboard transmits the input to the computer via USB.
![](https://satoh.dev/wp-content/uploads/2020/12/Screen-Shot-2020-12-07-at-17.32.31.png)
Requirements
- Raspberry Pi Zero W
- A USB cable to connect Raspberry Pi with your computer
Instructions
1. Add the required options
echo "dtoverlay=dwc2" | sudo tee -a /boot/config.txt
echo "dwc2" | sudo tee -a /etc/modules
echo "libcomposite" | sudo tee -a /etc/modules
2. Pair your keyboard with Raspberry Pi Zero W
3. Clone and install Quimby, A Bluetooth-USB HID Proxy by Danny Robson
git clone https://gitlab.com/dcro/quimby.git
cd quimby
sudo apt install python3-evdev
sudo cp quimby-* /usr/local/bin/
sudo cp udev/quimby.rules /etc/udev/rules.d/
sudo cp systemd/system/quimby.service /usr/lib/systemd/system/
4. Reboot your Raspberry Pi
sudo reboot
In the case of my keyboard (HHKB), there are unique specifications. “/dev/input/event0” is the common keystroke input and “/dev/input/event1” is a special key for media control etc.
![](https://satoh.dev/wp-content/uploads/2020/12/Screen-Shot-2020-12-07-at-7.02.59-1024x200.png)
Apple’s Magic Keyboard 2 is treated as a single input device like normal, so this may be a specification specific to HHKB.
Therefore, I added “/dev/input/event1” to the -i option for the ExecStart argument in /usr/lib/systemd/system/quimby.service.
[Unit]
Description=Quimby Input Forwarder
Requires=bluetooth.service
[Service]
Type=simple
ExecStartPre=/usr/local/bin/quimby-setup quimby
ExecStart=/usr/local/bin/quimby-relay -i /dev/input/event0 -i /dev/input/event1 -k /dev/hidg0 -c /dev/hidg1
ExecStop=/usr/local/bin/quimby-cleanup quimby
References
https://mlug-au.org/lib/exe/fetch.php?media=workshops:quimby_a_bluetooth-usb_hid_proxy.pdf
Hi, and thanks for sharing! Do you know how to make the mouse proxy working too? I wasn’t able to make it work…
“`
$ evtest
No device specified, trying to scan all of /dev/input/event*
Not running as root, no devices may be available.
Available devices:
/dev/input/event0: Samsung Wireless Keyboard
/dev/input/event1: Samsung Wireless Keyboard Mouse
/dev/input/event2: Samsung Wireless Keyboard Consumer Control
/dev/input/event3: Samsung Wireless Keyboard System Control
“`
My `quimby.service` file looks like this:
“`
[Unit]
Description=Quimby Input Forwarder
Requires=bluetooth.service
[Service]
Type=simple
#After=bluetooth.service
ExecStartPre=/usr/local/bin/quimby-setup quimby
ExecStart=/usr/local/bin/quimby-relay -i /dev/input/event0 -i /dev/input/event1 -i /dev/input/event2 -k /dev/hidg0 -m /dev/hidg1 -c /dev/hidg2
ExecStop=/usr/local/bin/quimby-cleanup quimby
#[Install]
#WantedBy=bluetooth.target
“`
Any ideas?
Thanks, Z.