summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot <root@new-selene.erebei.org>2015-12-01 02:11:23 +0000
committerroot <root@new-selene.erebei.org>2015-12-01 02:11:23 +0000
commitb4775420082f46cac862c8c55f23a68a2e96019d (patch)
tree85ceb94ed1b4bff4bc6197567bcda81bfff29749
parentb55240eb43a92c552003b8b324a385e041f84f12 (diff)
downloadcandlestick-b4775420082f46cac862c8c55f23a68a2e96019d.tar.gz
candlestick-b4775420082f46cac862c8c55f23a68a2e96019d.tar.bz2
candlestick-b4775420082f46cac862c8c55f23a68a2e96019d.zip
fish
-rw-r--r--app/adc.c51
-rw-r--r--app/key.c61
-rw-r--r--app/keyboard.c129
-rw-r--r--app/map.c410
-rw-r--r--app/state.c72
-rw-r--r--doc/rm0008.pdfbin0 -> 13016697 bytes
-rw-r--r--host/get.c103
-rw-r--r--host/set.c103
8 files changed, 929 insertions, 0 deletions
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
--- /dev/null
+++ b/doc/rm0008.pdf
Binary files 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;
+}
+
+
+
+
+
+