-
-
Save rmed/0d11b7225b3b772bb0dd89108ee93df0 to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| sleep 15 | |
| # Create gadget | |
| mkdir /sys/kernel/config/usb_gadget/mykeyboard | |
| cd /sys/kernel/config/usb_gadget/mykeyboard | |
| # Add basic information | |
| echo 0x0100 > bcdDevice # Version 1.0.0 | |
| echo 0x0200 > bcdUSB # USB 2.0 | |
| echo 0x00 > bDeviceClass | |
| echo 0x00 > bDeviceProtocol | |
| echo 0x00 > bDeviceSubClass | |
| echo 0x08 > bMaxPacketSize0 | |
| echo 0x0104 > idProduct # Multifunction Composite Gadget | |
| echo 0x1d6b > idVendor # Linux Foundation | |
| # Create English locale | |
| mkdir strings/0x409 | |
| echo "My manufacturer" > strings/0x409/manufacturer | |
| echo "My virtual keyboard" > strings/0x409/product | |
| echo "0123456789" > strings/0x409/serialnumber | |
| # Create HID function | |
| mkdir functions/hid.usb0 | |
| echo 1 > functions/hid.usb0/protocol | |
| echo 8 > functions/hid.usb0/report_length # 8-byte reports | |
| echo 1 > functions/hid.usb0/subclass | |
| # Write report descriptor | |
| echo "05010906a101050719e029e71500250175019508810275089501810175019503050819012903910275019505910175089506150026ff00050719002aff008100c0" | xxd -r -ps > functions/hid.usb0/report_desc | |
| # Create configuration | |
| mkdir configs/c.1 | |
| mkdir configs/c.1/strings/0x409 | |
| echo 0x80 > configs/c.1/bmAttributes | |
| echo 200 > configs/c.1/MaxPower # 200 mA | |
| echo "Example configuration" > configs/c.1/strings/0x409/configuration | |
| # Link HID function to configuration | |
| ln -s functions/hid.usb0 configs/c.1 | |
| # Enable gadget | |
| ls /sys/class/udc > UDC | |
| sleep 15 | |
| /usr/local/bin/tester.sh & | |
| # /usr/local/bin/tester.py & |
| #!/usr/bin/env python3 | |
| # | |
| # Python file to test the gadget by writing "Hello World!" | |
| # If used with the configfs_test.sh, place this file under /usr/local/bin/tester.py | |
| # and uncomment the appropriate line | |
| NULL_CHAR = chr(0) | |
| def write_report(report): | |
| with open('/dev/hidg0', 'rb+') as fd: | |
| fd.write(report.encode()) | |
| # H (press shift and H) | |
| write_report(chr(32)+NULL_CHAR+chr(11)+NULL_CHAR*5) | |
| # e | |
| write_report(NULL_CHAR*2+chr(8)+NULL_CHAR*5) | |
| # ll | |
| write_report(NULL_CHAR*2+chr(15)+NULL_CHAR*5) | |
| write_report(NULL_CHAR*8) | |
| write_report(NULL_CHAR*2+chr(15)+NULL_CHAR*5) | |
| # o | |
| write_report(NULL_CHAR*2+chr(18)+NULL_CHAR*5) | |
| # SPACE | |
| write_report(NULL_CHAR*2+chr(44)+NULL_CHAR*5) | |
| # W (press shift and W) | |
| write_report(chr(32)+NULL_CHAR+chr(26)+NULL_CHAR*5) | |
| # o | |
| write_report(NULL_CHAR*2+chr(18)+NULL_CHAR*5) | |
| # r | |
| write_report(NULL_CHAR*2+chr(21)+NULL_CHAR*5) | |
| # l | |
| write_report(NULL_CHAR*2+chr(15)+NULL_CHAR*5) | |
| # d | |
| write_report(NULL_CHAR*2+chr(7)+NULL_CHAR*5) | |
| # ! (press shift and 1) | |
| write_report(chr(32)+NULL_CHAR+chr(30)+NULL_CHAR*5) | |
| # Release all keys | |
| write_report(NULL_CHAR*8) |
| #!/bin/bash | |
| # | |
| # Bash file to test the gadget by writing "Hello World!" | |
| # If used with the configfs_test.sh, place this file under /usr/local/bin/tester.sh | |
| # and uncomment the appropriate line | |
| function write_report { | |
| echo -ne $1 > /dev/hidg0 | |
| } | |
| # H (press shift and H) | |
| write_report "\x20\0\xb\0\0\0\0\0" | |
| # e | |
| write_report "\0\0\x8\0\0\0\0\0" | |
| # ll | |
| write_report "\0\0\xf\0\0\0\0\0" | |
| write_report "\0\0\0\0\0\0\0\0" | |
| write_report "\0\0\xf\0\0\0\0\0" | |
| # o | |
| write_report "\0\0\x12\0\0\0\0\0" | |
| # SPACE | |
| write_report "\0\0\x2c\0\0\0\0\0" | |
| # W (press shift and W) | |
| write_report "\x20\0\x1a\0\0\0\0\0" | |
| # o | |
| write_report "\0\0\x12\0\0\0\0\0" | |
| # r | |
| write_report "\0\0\x21\0\0\0\0\0" | |
| # l | |
| write_report "\0\0\xf\0\0\0\0\0" | |
| # d | |
| write_report "\0\0\x7\0\0\0\0\0" | |
| # ! (press shift and 1) | |
| write_report "\x20\0\x1e\0\0\0\0\0" | |
| # Release al keys | |
| write_report "\0\0\0\0\0\0\0\0" |
any idea how to write code to move the mouse? I have this but I can only move the mouse to the right and down as it's a syntax error to use negative values for the chr?
#!/usr/bin/env python3
NULL_CHAR = chr(0)
import time
def ms_write(report):
with open("/dev/hidg1", "wb+") as fd:
fd.write(report.encode())
ms_write(chr(1)+chr(0)+chr(0))
ms_write(NULL_CHAR*3)
any idea how to write code to move the mouse? I have this but I can only move the mouse to the right and down as it's a syntax error to use negative values for the chr?
#!/usr/bin/env python3 NULL_CHAR = chr(0) import time
def ms_write(report): with open("/dev/hidg1", "wb+") as fd: fd.write(report.encode())
ms_write(chr(1)+chr(0)+chr(0)) ms_write(NULL_CHAR*3)
While chr() is good for simple cases (or those that don't need negative values), I'd say you need to use the int.to_bytes() method (https://docs.python.org/3/library/stdtypes.html#int.to_bytes), which will allow you to specify that the value to convert is signed and needs to be stored in a single byte.
I don't know if this is related. I added "chown pi /dev/hidg0" at the end of the startup script so that the device is available to the regular user "pi".