#!/usr/bin/env bash # Configures USB gadgets per: https://www.kernel.org/doc/Documentation/usb/gadget_configfs.txt # Exit on first error. set -e # Echo commands to stdout. set -x # Treat undefined environment variables as errors. set -u modprobe libcomposite # Adapted from https://github.com/girst/hardpass-sendHID/blob/master/README.md cd /sys/kernel/config/usb_gadget/ mkdir -p g1 cd g1 echo 0x1d6b > idVendor # Linux Foundation echo 0xa4ac > idProduct # USB HID echo 0x0100 > bcdDevice # v1.0.0 echo 0x0200 > bcdUSB # USB2 STRINGS_DIR="strings/0x409" mkdir -p "$STRINGS_DIR" echo "6b65796d696d6570690" > "${STRINGS_DIR}/serialnumber" echo "tinypilot" > "${STRINGS_DIR}/manufacturer" echo "TinyPilot HID Keyboard Device" > "${STRINGS_DIR}/product" KEYBOARD_FUNCTIONS_DIR="functions/hid.keyboard" mkdir -p "$KEYBOARD_FUNCTIONS_DIR" echo 1 > "${KEYBOARD_FUNCTIONS_DIR}/protocol" # Keyboard echo 1 > "${KEYBOARD_FUNCTIONS_DIR}/subclass" # Boot interface subclass echo 8 > "${KEYBOARD_FUNCTIONS_DIR}/report_length" # Write the report descriptor D=$(mktemp) echo -ne \\x05\\x01 >> "$D" # Usage Page (Generic Desktop Ctrls) echo -ne \\x09\\x06 >> "$D" # Usage (Keyboard) echo -ne \\xA1\\x01 >> "$D" # Collection (Application) echo -ne \\x05\\x08 >> "$D" # Usage Page (LEDs) echo -ne \\x19\\x01 >> "$D" # Usage Minimum (Num Lock) echo -ne \\x29\\x03 >> "$D" # Usage Maximum (Scroll Lock) echo -ne \\x15\\x00 >> "$D" # Logical Minimum (0) echo -ne \\x25\\x01 >> "$D" # Logical Maximum (1) echo -ne \\x75\\x01 >> "$D" # Report Size (1) echo -ne \\x95\\x03 >> "$D" # Report Count (3) echo -ne \\x91\\x02 >> "$D" # Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) echo -ne \\x09\\x4B >> "$D" # Usage (Generic Indicator) echo -ne \\x95\\x01 >> "$D" # Report Count (1) echo -ne \\x91\\x02 >> "$D" # Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) echo -ne \\x95\\x04 >> "$D" # Report Count (4) echo -ne \\x91\\x01 >> "$D" # Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) echo -ne \\x05\\x07 >> "$D" # Usage Page (Kbrd/Keypad) echo -ne \\x19\\xE0 >> "$D" # Usage Minimum (0xE0) echo -ne \\x29\\xE7 >> "$D" # Usage Maximum (0xE7) echo -ne \\x95\\x08 >> "$D" # Report Count (8) echo -ne \\x81\\x02 >> "$D" # Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) echo -ne \\x75\\x08 >> "$D" # Report Size (8) echo -ne \\x95\\x01 >> "$D" # Report Count (1) echo -ne \\x81\\x01 >> "$D" # Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) echo -ne \\x19\\x00 >> "$D" # Usage Minimum (0x00) echo -ne \\x29\\x91 >> "$D" # Usage Maximum (0x91) echo -ne \\x26\\xFF\\x00 >> "$D" # Logical Maximum (255) echo -ne \\x95\\x06 >> "$D" # Report Count (6) echo -ne \\x81\\x00 >> "$D" # Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) echo -ne \\xC0 >> "$D" # End Collection cp "$D" "${KEYBOARD_FUNCTIONS_DIR}/report_desc" CONFIG_INDEX=1 CONFIGS_DIR="configs/c.${CONFIG_INDEX}" mkdir -p "$CONFIGS_DIR" echo 250 > "${CONFIGS_DIR}/MaxPower" CONFIGS_STRINGS_DIR="${CONFIGS_DIR}/strings/0x409" mkdir -p "$CONFIGS_STRINGS_DIR" echo "Config ${CONFIG_INDEX}: ECM network" > "${CONFIGS_STRINGS_DIR}/configuration" ln -s "$KEYBOARD_FUNCTIONS_DIR" "${CONFIGS_DIR}/" ls /sys/class/udc > UDC chmod 777 /dev/hidg0