From b4775420082f46cac862c8c55f23a68a2e96019d Mon Sep 17 00:00:00 2001 From: root Date: Tue, 1 Dec 2015 02:11:23 +0000 Subject: fish --- app/adc.c | 51 +++++++ app/key.c | 61 +++++++++ app/keyboard.c | 129 ++++++++++++++++++ app/map.c | 410 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/state.c | 72 ++++++++++ doc/rm0008.pdf | Bin 0 -> 13016697 bytes host/get.c | 103 +++++++++++++++ host/set.c | 103 +++++++++++++++ 8 files changed, 929 insertions(+) create mode 100644 app/adc.c create mode 100644 app/key.c create mode 100644 app/keyboard.c create mode 100644 app/map.c create mode 100644 app/state.c create mode 100644 doc/rm0008.pdf create mode 100644 host/get.c create mode 100644 host/set.c diff --git a/app/adc.c b/app/adc.c new file mode 100644 index 0000000..1565af5 --- /dev/null +++ b/app/adc.c @@ -0,0 +1,51 @@ +#include "project.h" + +int host_has_power; + +void +adc_tick (void) +{ + uint16_t v; + + if (adc_eoc (ADC1)) + { + v = adc_read_regular (ADC1); + + host_has_power = ! !(v > 1000); + + } + + adc_start_conversion_direct (ADC1); +} + + + +static uint8_t channels[] = { ADC_CHANNEL0 }; + +#define n_channels (sizeof(channels)/sizeof(channels[0])) + +void +adc_init (void) +{ + + rcc_periph_clock_enable (RCC_ADC1); + + //gpio_mode_setup(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_DOWN, GPIO0); + gpio_set_mode (GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_ANALOG, GPIO0); + + adc_off (ADC1); + adc_disable_scan_mode (ADC1); + adc_set_single_conversion_mode (ADC1); + adc_disable_external_trigger_regular (ADC1); + adc_set_right_aligned (ADC1); + adc_set_sample_time_on_all_channels (ADC1, ADC_SMPR_SMP_28DOT5CYC); + + adc_power_on (ADC1); + + adc_reset_calibration (ADC1); + adc_calibration (ADC1); + adc_set_regular_sequence (ADC1, n_channels, channels); + adc_start_conversion_direct (ADC1); + + host_has_power = 0; +} diff --git a/app/key.c b/app/key.c new file mode 100644 index 0000000..6449216 --- /dev/null +++ b/app/key.c @@ -0,0 +1,61 @@ +#include "project.h" + + +int have_key; + +static size_t key_len; + +static uint8_t key[512]; + + +void +key_wipe (void) +{ + have_key = 0; + locked = 0; + memset (key, 0, sizeof (key)); +} + + +void +key_set (char *in, size_t len) +{ + if (len > sizeof (key)) + len = sizeof (key); + memcpy (key, in, len); + key_len = len; + locked = 0; + have_key = 1; +} + + +void +key_send (void) +{ + size_t i; + if (!have_key) + { + send_str ("*no key*\n"); + return; + } + if (locked) + { + send_str ("*locked*\n"); + return; + } + + for (i = 0; i < key_len; ++i) + { + send_ascii (key[i]); + } + + locked++; +} + + +void +key_init (void) +{ + key_wipe (); + have_key = 0; +} 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); + } + +} diff --git a/app/map.c b/app/map.c new file mode 100644 index 0000000..d63c171 --- /dev/null +++ b/app/map.c @@ -0,0 +1,410 @@ +#include "project.h" + + +void +send_ascii (unsigned char a) +{ + switch (a) + { +#if 0 + case '\0': + keyboard_keypress (0x00, 0x00); + break; + case '\001': + keyboard_keypress (0x00, 0x00); + break; + case '\002': + keyboard_keypress (0x00, 0x00); + break; + case '\003': + keyboard_keypress (0x00, 0x00); + break; + case '\004': + keyboard_keypress (0x00, 0x00); + break; + case '\005': + keyboard_keypress (0x00, 0x00); + break; + case '\006': + keyboard_keypress (0x00, 0x00); + break; + case '\a': + keyboard_keypress (0x00, 0x00); + break; + case '\b': + keyboard_keypress (0x00, 0x00); + break; +#endif + case '\t': + keyboard_keypress (0x00, 0x2b); + break; +#if 0 + case '\n': + keyboard_keypress (0x00, 0x00); + break; + case '\v': + keyboard_keypress (0x00, 0x00); + break; + case '\f': + keyboard_keypress (0x00, 0x00); + break; +#endif + case '\n': + case '\r': + keyboard_keypress (0x00, 0x28); + break; +#if 0 + case '\016': + keyboard_keypress (0x00, 0x00); + break; + case '\017': + keyboard_keypress (0x00, 0x00); + break; + case '\020': + keyboard_keypress (0x00, 0x00); + break; + case '\021': + keyboard_keypress (0x00, 0x00); + break; + case '\022': + keyboard_keypress (0x00, 0x00); + break; + case '\023': + keyboard_keypress (0x00, 0x00); + break; + case '\024': + keyboard_keypress (0x00, 0x00); + break; + case '\025': + keyboard_keypress (0x00, 0x00); + break; + case '\026': + keyboard_keypress (0x00, 0x00); + break; + case '\027': + keyboard_keypress (0x00, 0x00); + break; + case '\030': + keyboard_keypress (0x00, 0x00); + break; + case '\031': + keyboard_keypress (0x00, 0x00); + break; + case '\032': + keyboard_keypress (0x00, 0x00); + break; + case '\033': + keyboard_keypress (0x00, 0x00); + break; + case '\034': + keyboard_keypress (0x00, 0x00); + break; + case '\035': + keyboard_keypress (0x00, 0x00); + break; + case '\036': + keyboard_keypress (0x00, 0x00); + break; + case '\037': + keyboard_keypress (0x00, 0x00); + break; +#endif + case ' ': + keyboard_keypress (0x00, 0x2c); + break; + case '!': + keyboard_keypress (0x02, 0x1e); + break; + case '"': + keyboard_keypress (0x02, 0x34); + break; + case '#': + keyboard_keypress (0x02, 0x20); + break; + case '$': + keyboard_keypress (0x02, 0x21); + break; + case '%': + keyboard_keypress (0x02, 0x22); + break; + case '&': + keyboard_keypress (0x02, 0x23); + break; + case '\047': + keyboard_keypress (0x00, 0x34); + break; + case '(': + keyboard_keypress (0x02, 0x26); + break; + case ')': + keyboard_keypress (0x02, 0x27); + break; + case '*': + keyboard_keypress (0x02, 0x25); + break; + case '+': + keyboard_keypress (0x02, 0x2e); + break; + case ',': + keyboard_keypress (0x00, 0x36); + break; + case '-': + keyboard_keypress (0x00, 0x2d); + break; + case '.': + keyboard_keypress (0x00, 0x37); + break; + case '/': + keyboard_keypress (0x00, 0x38); + break; + case '0': + keyboard_keypress (0x00, 0x27); + break; + case '1': + keyboard_keypress (0x00, 0x1e); + break; + case '2': + keyboard_keypress (0x00, 0x1f); + break; + case '3': + keyboard_keypress (0x00, 0x20); + break; + case '4': + keyboard_keypress (0x00, 0x21); + break; + case '5': + keyboard_keypress (0x00, 0x22); + break; + case '6': + keyboard_keypress (0x00, 0x23); + break; + case '7': + keyboard_keypress (0x00, 0x24); + break; + case '8': + keyboard_keypress (0x00, 0x25); + break; + case '9': + keyboard_keypress (0x00, 0x26); + break; + case ':': + keyboard_keypress (0x02, 0x33); + break; + case ';': + keyboard_keypress (0x00, 0x33); + break; + case '<': + keyboard_keypress (0x02, 0x36); + break; + case '=': + keyboard_keypress (0x00, 0x2e); + break; + case '>': + keyboard_keypress (0x02, 0x37); + break; + case '?': + keyboard_keypress (0x02, 0x38); + break; + case '@': + keyboard_keypress (0x02, 0x1f); + break; + case 'A': + keyboard_keypress (0x02, 0x04); + break; + case 'B': + keyboard_keypress (0x02, 0x05); + break; + case 'C': + keyboard_keypress (0x02, 0x06); + break; + case 'D': + keyboard_keypress (0x02, 0x07); + break; + case 'E': + keyboard_keypress (0x02, 0x08); + break; + case 'F': + keyboard_keypress (0x02, 0x09); + break; + case 'G': + keyboard_keypress (0x02, 0x0a); + break; + case 'H': + keyboard_keypress (0x02, 0x0b); + break; + case 'I': + keyboard_keypress (0x02, 0x0c); + break; + case 'J': + keyboard_keypress (0x02, 0x0d); + break; + case 'K': + keyboard_keypress (0x02, 0x0e); + break; + case 'L': + keyboard_keypress (0x02, 0x0f); + break; + case 'M': + keyboard_keypress (0x02, 0x10); + break; + case 'N': + keyboard_keypress (0x02, 0x11); + break; + case 'O': + keyboard_keypress (0x02, 0x12); + break; + case 'P': + keyboard_keypress (0x02, 0x13); + break; + case 'Q': + keyboard_keypress (0x02, 0x14); + break; + case 'R': + keyboard_keypress (0x02, 0x15); + break; + case 'S': + keyboard_keypress (0x02, 0x16); + break; + case 'T': + keyboard_keypress (0x02, 0x17); + break; + case 'U': + keyboard_keypress (0x02, 0x18); + break; + case 'V': + keyboard_keypress (0x02, 0x19); + break; + case 'W': + keyboard_keypress (0x02, 0x1a); + break; + case 'X': + keyboard_keypress (0x02, 0x1b); + break; + case 'Y': + keyboard_keypress (0x02, 0x1c); + break; + case 'Z': + keyboard_keypress (0x02, 0x1d); + break; + case '[': + keyboard_keypress (0x00, 0x2f); + break; + case '\\': + keyboard_keypress (0x00, 0x64); + break; + case ']': + keyboard_keypress (0x00, 0x30); + break; + case '^': + keyboard_keypress (0x02, 0x23); + break; + case '_': + keyboard_keypress (0x02, 0x2d); + break; + case '`': + keyboard_keypress (0x00, 0x32); + break; + case 'a': + keyboard_keypress (0x00, 0x04); + break; + case 'b': + keyboard_keypress (0x00, 0x05); + break; + case 'c': + keyboard_keypress (0x00, 0x06); + break; + case 'd': + keyboard_keypress (0x00, 0x07); + break; + case 'e': + keyboard_keypress (0x00, 0x08); + break; + case 'f': + keyboard_keypress (0x00, 0x09); + break; + case 'g': + keyboard_keypress (0x00, 0x0a); + break; + case 'h': + keyboard_keypress (0x00, 0x0b); + break; + case 'i': + keyboard_keypress (0x00, 0x0c); + break; + case 'j': + keyboard_keypress (0x00, 0x0d); + break; + case 'k': + keyboard_keypress (0x00, 0x0e); + break; + case 'l': + keyboard_keypress (0x00, 0x0f); + break; + case 'm': + keyboard_keypress (0x00, 0x10); + break; + case 'n': + keyboard_keypress (0x00, 0x11); + break; + case 'o': + keyboard_keypress (0x00, 0x12); + break; + case 'p': + keyboard_keypress (0x00, 0x13); + break; + case 'q': + keyboard_keypress (0x00, 0x14); + break; + case 'r': + keyboard_keypress (0x00, 0x15); + break; + case 's': + keyboard_keypress (0x00, 0x16); + break; + case 't': + keyboard_keypress (0x00, 0x17); + break; + case 'u': + keyboard_keypress (0x00, 0x18); + break; + case 'v': + keyboard_keypress (0x00, 0x19); + break; + case 'w': + keyboard_keypress (0x00, 0x1a); + break; + case 'x': + keyboard_keypress (0x00, 0x1b); + break; + case 'y': + keyboard_keypress (0x00, 0x1c); + break; + case 'z': + keyboard_keypress (0x00, 0x1d); + break; + case '{': + keyboard_keypress (0x02, 0x2f); + break; + case '|': + keyboard_keypress (0x02, 0x64); + break; + case '}': + keyboard_keypress (0x02, 0x30); + break; + case '~': + keyboard_keypress (0x02, 0x32); + break; +#if 0 + case '\177': + keyboard_keypress (0x00, 0x00); + break; +#endif + } +} + +void +send_str (const char *c) +{ + while (*c) + send_ascii (*(c++)); +} diff --git a/app/state.c b/app/state.c new file mode 100644 index 0000000..8ba1b3d --- /dev/null +++ b/app/state.c @@ -0,0 +1,72 @@ +#include "project.h" + +uint32_t up_time, down_time; +int locked; + + + + +void +state_show (void) +{ +#ifndef SLIM + char buf[17]; + uint32_t t; + int d, h, m, s; + + t = up_time ? up_time : down_time; + + d = t / 86400; + t -= d * 86400; + h = t / 3600; + t -= h * 3600; + m = t / 60; + t -= m * 60; + s = t; + + + snprintf (buf, sizeof (buf), "%4s%3d %02d:%02d:%02d", + up_time ? "up" : "down", d, h, m, s); + + lcd_write (buf, 0, 0); + + lcd_write (have_key ? " Key " : "No Key", 0, 1); + + lcd_write (locked ? " Locked " : "UnLocked", 8, 1); +#endif + +} + + +void +state_tick (void) +{ + + if (host_has_power && usb_running) + { + down_time = 0; + up_time++; + } + else + { + down_time++; + up_time = 0; + locked = 0; + } + + if ((down_time > RETENTION_TIME) && have_key) + { + key_wipe (); + } + + state_show (); +} + + +void +state_init (void) +{ + down_time = 0; + up_time = 0; + locked = 0; +} diff --git a/doc/rm0008.pdf b/doc/rm0008.pdf new file mode 100644 index 0000000..8f3d0e1 Binary files /dev/null and b/doc/rm0008.pdf differ diff --git a/host/get.c b/host/get.c new file mode 100644 index 0000000..79a6a40 --- /dev/null +++ b/host/get.c @@ -0,0 +1,103 @@ +#include "project.h" +#include "../common/vendor_req.h" + + + +static void poke(libusb_device_handle *devh) +{ +uint32_t timeout=4000; +int len; + + + +len= libusb_control_transfer( devh, + /* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, + /* bRequest */ VENDOR_REQ_SEND_KEY, + /* wValue */ 0x23, + /* wIndex */ 0, + /* Data */ NULL, + /* wLength */ 0, timeout ); + + + + +//if (len>=0) +//hexdump(">",buf,len); + + +} + + + +static void poke_device(libusb_device *dev, struct libusb_device_descriptor *desc) +{ +int ret; +libusb_device_handle *devh; + +ret=libusb_open(dev, &devh); + +if (ret) { + warn("unable to open device: %i",ret); + return; +} + +printf("poke\n"); + +poke(devh); + +libusb_close(devh); + +} + +void probe_devices(libusb_context *ctx) +{ + libusb_device **list; + ssize_t num_devs; + ssize_t i; + + num_devs = libusb_get_device_list(ctx, &list); + for (i = 0; i < num_devs; ++i) { + struct libusb_device_descriptor desc; + struct libusb_device *dev = list[i]; + + if (libusb_get_device_descriptor(dev, &desc)) + continue; + + + if (desc.idVendor!=0x1d6b) continue; + if (desc.idProduct!=0x1932) continue; + + poke_device(dev,&desc); + + } + libusb_free_device_list(list, 0); +} + + + + + +int main(int argc,char *argv) +{ + int ret; + + libusb_context *ctx; + + + ret = libusb_init(&ctx); + if (ret) + errx(EX_IOERR, "unable to initialize libusb: %i", ret); + + + //libusb_set_debug(ctx, 255); + + probe_devices(ctx); + + return 0; +} + + + + + + diff --git a/host/set.c b/host/set.c new file mode 100644 index 0000000..e004c4f --- /dev/null +++ b/host/set.c @@ -0,0 +1,103 @@ +#include "project.h" +#include "../common/vendor_req.h" + + + +static void poke(libusb_device_handle *devh) +{ +uint32_t timeout=4000; +//char buf[]="The quick brown fox jumps over the lazy dog\n"; +char buf[]="fishsoup\n"; +int len; + + + +len= libusb_control_transfer( devh, + /* bmRequestType */ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, + /* bRequest */ VENDOR_REQ_SET_KEY, + /* wValue */ 0x0, + /* wIndex */ 0x0, + /* Data */ buf, + /* wLength */ sizeof(buf)-1, timeout ); + + +//if (len>=0) +//hexdump(">",buf,len); + + +} + + + +static void poke_device(libusb_device *dev, struct libusb_device_descriptor *desc) +{ +int ret; +libusb_device_handle *devh; + +ret=libusb_open(dev, &devh); + +if (ret) { + warn("unable to open device: %i",ret); + return; +} + +printf("poke\n"); + +poke(devh); + +libusb_close(devh); + +} + +void probe_devices(libusb_context *ctx) +{ + libusb_device **list; + ssize_t num_devs; + ssize_t i; + + num_devs = libusb_get_device_list(ctx, &list); + for (i = 0; i < num_devs; ++i) { + struct libusb_device_descriptor desc; + struct libusb_device *dev = list[i]; + + if (libusb_get_device_descriptor(dev, &desc)) + continue; + + + if (desc.idVendor!=0x1d6b) continue; + if (desc.idProduct!=0x1932) continue; + + poke_device(dev,&desc); + + } + libusb_free_device_list(list, 0); +} + + + + + +int main(int argc,char *argv) +{ + int ret; + + libusb_context *ctx; + + + ret = libusb_init(&ctx); + if (ret) + errx(EX_IOERR, "unable to initialize libusb: %i", ret); + + + //libusb_set_debug(ctx, 255); + + probe_devices(ctx); + + return 0; +} + + + + + + -- cgit v1.2.3