Novena as a USB keyboard

Novena has the ability to act as a USB HID device, such as a keyboard, mouse, or joystick. It can do this through the use of the configfs system.

Setup Script
Create a file called something like hid-gadget.sh:

configfs="/sys/kernel/config/usb_gadget" g=g1 c=c.1 d="${configfs}/${g}" func=hid.usb0 do_stop { echo "" > "${d}/UDC" rm "${d}/configs/${c}/${func}" rmdir ${d}/strings/0x409/ rmdir "${d}/configs/${c}/strings/0x409" rmdir "${d}/configs/${c}" rmdir "${d}/functions/${func}" rmdir "${d}" } do_start { mkdir "${d}" echo 0x05e2 > "${d}/idVendor" echo 0x0613 > "${d}/idProduct" echo 8 > "${d}/bMaxPacketSize0" mkdir "${d}/strings/0x409" echo "12345" > "${d}/strings/0x409/serialnumber" echo "kosagi" > "${d}/strings/0x409/manufacturer" echo "Software keyboard" > "${d}/strings/0x409/product" mkdir "${d}/configs/${c}" mkdir "${d}/configs/${c}/strings/0x409" echo "config 1" > "${d}/configs/${c}/strings/0x409/configuration" echo 120 > "${d}/configs/${c}/MaxPower" mkdir "${d}/functions/${func}" echo "1" > "${d}/functions/${func}/protocol" echo "1" > "${d}/functions/${func}/subclass" echo "8" > "${d}/functions/${func}/report_length" /bin/bash -c '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' > "${d}/functions/${func}/report_desc" ln -s "${d}/functions/${func}" "${d}/configs/${c}" udc=$(ls -1 /sys/class/udc/) echo "${udc}" > "${d}/UDC" } if [ "$1" = "start" ] then do_start elif [ "$1" = "stop" ] then do_stop else echo "Usage: $0 (stop | start)" fi
 * 1) !/bin/sh

Mark it as executable:

chmod a+x hid-gadget.sh

Start it as root:

sudo ./hid-gadget.sh start

This will create /dev/hidg0

Sending Input
The file /dev/hidg0 is a HID device. You can write HID packets to it and they will be received on the host. It's a bit annoying to write HID packets, so Linux ships with hidg_test.c, which is present in the Documentation directory: gadget_hid.txt.

Strip off the header from gadget_hid.txt, rename it to hidg_test.c, and compile it with:

gcc hidg_test.c -o hidg_test

Run it by specifying the hidg device, and whether you want a keyboard, joystick, or mouse:

sudo ./hidg_test /dev/hidg0 keyboard

Then, type into the window what packets you would like to send. Characters a-z are supported, and you can send a capital C by typing something like:

--left-shift c

Press Return to actually submit the command.

Stopping HID
Stopping the HID device can be done by running ./hid-gadget.sh stop