diff options
author | root <root@new-selene.erebei.org> | 2015-12-01 02:11:23 +0000 |
---|---|---|
committer | root <root@new-selene.erebei.org> | 2015-12-01 02:11:23 +0000 |
commit | b4775420082f46cac862c8c55f23a68a2e96019d (patch) | |
tree | 85ceb94ed1b4bff4bc6197567bcda81bfff29749 /app/keyboard.c | |
parent | b55240eb43a92c552003b8b324a385e041f84f12 (diff) | |
download | candlestick-b4775420082f46cac862c8c55f23a68a2e96019d.tar.gz candlestick-b4775420082f46cac862c8c55f23a68a2e96019d.tar.bz2 candlestick-b4775420082f46cac862c8c55f23a68a2e96019d.zip |
fish
Diffstat (limited to 'app/keyboard.c')
-rw-r--r-- | app/keyboard.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/app/keyboard.c b/app/keyboard.c new file mode 100644 index 0000000..e3e3465 --- /dev/null +++ b/app/keyboard.c @@ -0,0 +1,129 @@ +#include "project.h" + +static const uint8_t keyboard_report_descriptor[] = { + 0x05, 0x01, /* Usage Page (Generic Desktop) */ + 0x09, 0x06, /* Usage (Keyboard) */ + 0xA1, 0x01, /* Collection (Application) */ + 0x05, 0x07, /* Usage page (Key Codes) */ + 0x19, 0xE0, /* Usage minimum (224) */ + 0x29, 0xE7, /* Usage maximum (231) */ + 0x15, 0x00, /* Logical minimum (0) */ + 0x25, 0x01, /* Logical maximum (1) */ + 0x75, 0x01, /* Report size (1) */ + 0x95, 0x08, /* Report count (8) */ + 0x81, 0x02, /* Input (data, variable, absolute) */ + 0x95, 0x01, /* Report count (1) */ + 0x75, 0x08, /* Report size (8) */ + 0x81, 0x01, /* Input (constant) */ + 0x95, 0x06, /* Report count (6) */ + 0x75, 0x08, /* Report size (8) */ + 0x15, 0x00, /* Logical minimum (0) */ + //0x25, 0x65, /* Logical maximum (101) */ + 0x26, 0xff, 0x00, /* Logical maximum (255) */ + //0x26, 0x7f, 0x00, /* Logical maximum (255) */ + 0x05, 0x07, /* Usage page (key codes) */ + 0x19, 0x00, /* Usage minimum (0) */ + 0x2A, 0xff, 0x00, /* Usage maximum (255) */ +// 0x29, 0x65, /* Usage maximum (101) */ +// 0x2A, 0xff, 0x03, /* Usage maximum (1023) */ + 0x81, 0x00, /* Input (data, array) */ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x80, /* USAGE (System Control) */ + 0xA1, 0x01, /* COLLECTION (Application) */ + 0x75, 0x02, /* REPORT_SIZE (2) */ + 0x95, 0x01, /* REPORT_COUNT (1) */ + 0x15, 0x01, /* LOGICAL_MIN (1) */ + 0x25, 0x03, /* LOGICAL_MAX (3) */ + 0x09, 0x82, /* USAGE (System Sleep) */ + 0x09, 0x81, /* USAGE (System Power Down) */ + 0x09, 0x83, /* USAGE (System Wake Up) */ + 0x81, 0x60, /* INPUT (Data Ary Abs NPrf Null) */ + 0x75, 0x06, /* REPORT_SIZE (6) */ + 0x81, 0x03, /* INPUT (Cnst Var Abs) */ + 0xc0, /* END COLLECTION */ + 0xC0 /* End Collection */ +}; + + +static const struct +{ + struct usb_hid_descriptor hid_descriptor; + struct + { + uint8_t bReportDescriptorType; + uint16_t wDescriptorLength; + } __attribute__ ((packed)) hid_report; +} __attribute__ ((packed)) keyboard_function = +{ + .hid_descriptor = + { + .bLength = sizeof (keyboard_function),.bDescriptorType = + USB_DT_HID,.bcdHID = 0x0100,.bCountryCode = 0,.bNumDescriptors = 1,} + ,.hid_report = + { + .bReportDescriptorType = USB_DT_REPORT,.wDescriptorLength = + sizeof (keyboard_report_descriptor),} +,}; + +const struct usb_endpoint_descriptor keyboard_endpoint = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = 0x81, + .bmAttributes = USB_ENDPOINT_ATTR_INTERRUPT, + .wMaxPacketSize = 9, + .bInterval = 0x1 //0x20, +}; + +const struct usb_interface_descriptor keyboard_iface = { + .bLength = USB_DT_INTERFACE_SIZE, + .bDescriptorType = USB_DT_INTERFACE, + .bInterfaceNumber = 0, + .bAlternateSetting = 0, + .bNumEndpoints = 1, + .bInterfaceClass = USB_CLASS_HID, + .bInterfaceSubClass = 1, /* boot */ + .bInterfaceProtocol = 1, /* keyboard */ + .iInterface = 5, + .endpoint = &keyboard_endpoint, + .extra = &keyboard_function, + .extralen = sizeof (keyboard_function), +}; + + +void +keyboard_get_descriptor (uint8_t ** buf, uint16_t * len) +{ + + /* Handle the HID report descriptor. */ + *buf = (uint8_t *) keyboard_report_descriptor; + *len = sizeof (keyboard_report_descriptor); +} + +void +keyboard_keypress (int m, int k) +{ + uint8_t buf[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + + buf[0] = m; + buf[2] = k; + usbd_ep_write_packet (usbd_dev, 0x81, buf, 9); + + delay_ms (10); + + buf[0] = m; + buf[2] = 0; + usbd_ep_write_packet (usbd_dev, 0x81, buf, 9); + + delay_ms (10); + + if (m) + { + buf[0] = 0; + buf[2] = 0; + usbd_ep_write_packet (usbd_dev, 0x81, buf, 9); + + delay_ms (10); + } + +} |