diff options
author | root <root@lab2.panaceas.james.local> | 2014-11-02 15:16:42 +0000 |
---|---|---|
committer | root <root@lab2.panaceas.james.local> | 2014-11-02 15:16:42 +0000 |
commit | 479e719a64d75374f00438498cf91ba2601a63f1 (patch) | |
tree | 6f2164598cbe9c78396060dc45f5307172d36a0c | |
parent | 87e61d21e5ce588c9701d92def188fa97674c3cd (diff) | |
download | stm32_usb_kvm-479e719a64d75374f00438498cf91ba2601a63f1.tar.gz stm32_usb_kvm-479e719a64d75374f00438498cf91ba2601a63f1.tar.bz2 stm32_usb_kvm-479e719a64d75374f00438498cf91ba2601a63f1.zip |
fish
-rw-r--r-- | Makefile.rules | 4 | ||||
-rw-r--r-- | src/Makefile | 2 | ||||
-rw-r--r-- | src/dfu.c | 78 | ||||
-rw-r--r-- | src/keyboard.c | 9 | ||||
-rw-r--r-- | src/kvm.c | 91 | ||||
-rw-r--r-- | src/main.c | 64 | ||||
-rw-r--r-- | src/mouse.c | 9 | ||||
-rw-r--r-- | src/project.h | 6 | ||||
-rw-r--r-- | src/prototypes.h | 15 | ||||
-rw-r--r-- | src/ring.c | 61 | ||||
-rw-r--r-- | src/ring.h | 9 | ||||
-rw-r--r-- | src/tablet.c | 109 | ||||
-rw-r--r-- | src/uart.c | 7 | ||||
-rw-r--r-- | src/usart.c | 104 | ||||
-rw-r--r-- | src/usb.c | 46 |
15 files changed, 450 insertions, 164 deletions
diff --git a/Makefile.rules b/Makefile.rules index 685caad..b67e343 100644 --- a/Makefile.rules +++ b/Makefile.rules @@ -80,7 +80,7 @@ SCRIPT_DIR = $(OPENCM3_DIR)/scripts CFLAGS += -Os -g CFLAGS += -Wextra -Wimplicit-function-declaration -CFLAGS += -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes +CFLAGS += -Wmissing-prototypes -Wstrict-prototypes CFLAGS += -fno-common -ffunction-sections -fdata-sections ############################################################################### @@ -179,7 +179,7 @@ fish: clean: @#printf " CLEAN\n" - $(Q)$(RM) *.o *.d *.elf *.bin *.hex *.srec *.list *.map + $(Q)$(RM) *.o *.d *.elf *.bin *.hex *.srec *.list *.map *~ stylecheck: $(STYLECHECKFILES:=.stylecheck) styleclean: $(STYLECHECKFILES:=.styleclean) diff --git a/src/Makefile b/src/Makefile index 1a9f2b2..f7f445a 100644 --- a/src/Makefile +++ b/src/Makefile @@ -23,7 +23,7 @@ PROG=kvm V=1 default: ${PROG}.elf -CSRCS=dfu.c mouse.c keyboard.c main.c usb.c tablet.c uart.c +CSRCS=dfu.c mouse.c keyboard.c main.c usb.c tablet.c usart.c kvm.c ring.c BINARY = ${PROG} @@ -3,56 +3,58 @@ #ifdef INCLUDE_DFU_INTERFACE const struct usb_dfu_descriptor dfu_function = { - .bLength = sizeof(struct usb_dfu_descriptor), - .bDescriptorType = DFU_FUNCTIONAL, - .bmAttributes = USB_DFU_CAN_DOWNLOAD | USB_DFU_WILL_DETACH, - .wDetachTimeout = 255, - .wTransferSize = 1024, - .bcdDFUVersion = 0x011A, + .bLength = sizeof (struct usb_dfu_descriptor), + .bDescriptorType = DFU_FUNCTIONAL, + .bmAttributes = USB_DFU_CAN_DOWNLOAD | USB_DFU_WILL_DETACH, + .wDetachTimeout = 255, + .wTransferSize = 1024, + .bcdDFUVersion = 0x011A, }; const struct usb_interface_descriptor dfu_iface = { - .bLength = USB_DT_INTERFACE_SIZE, - .bDescriptorType = USB_DT_INTERFACE, - .bInterfaceNumber = 3, - .bAlternateSetting = 0, - .bNumEndpoints = 0, - .bInterfaceClass = 0xFE, - .bInterfaceSubClass = 1, - .bInterfaceProtocol = 1, - .iInterface = 0, - - .extra = &dfu_function, - .extralen = sizeof(dfu_function), + .bLength = USB_DT_INTERFACE_SIZE, + .bDescriptorType = USB_DT_INTERFACE, + .bInterfaceNumber = 3, + .bAlternateSetting = 0, + .bNumEndpoints = 0, + .bInterfaceClass = 0xFE, + .bInterfaceSubClass = 1, + .bInterfaceProtocol = 1, + .iInterface = 0, + + .extra = &dfu_function, + .extralen = sizeof (dfu_function), }; -static void dfu_detach_complete(usbd_device *usbd_dev, struct usb_setup_data *req) +static void +dfu_detach_complete (usbd_device * usbd_dev, struct usb_setup_data *req) { - (void)req; - (void)usbd_dev; - - gpio_set_mode(GPIOA, GPIO_MODE_INPUT, 0, GPIO15); - gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, - GPIO_CNF_OUTPUT_PUSHPULL, GPIO10); - gpio_set(GPIOA, GPIO10); - scb_reset_core(); + (void) req; + (void) usbd_dev; + + gpio_set_mode (GPIOA, GPIO_MODE_INPUT, 0, GPIO15); + gpio_set_mode (GPIOA, GPIO_MODE_OUTPUT_2_MHZ, + GPIO_CNF_OUTPUT_PUSHPULL, GPIO10); + gpio_set (GPIOA, GPIO10); + scb_reset_core (); } -int dfu_control_request(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, - void (**complete)(usbd_device *usbd_dev, struct usb_setup_data *req)) +int +dfu_control_request (usbd_device * usbd_dev, struct usb_setup_data *req, + uint8_t ** buf, uint16_t * len, + void (**complete) (usbd_device * usbd_dev, + struct usb_setup_data * req)) { - (void)buf; - (void)len; - (void)usbd_dev; + (void) buf; + (void) len; + (void) usbd_dev; - if ((req->bmRequestType != 0x21) || (req->bRequest != DFU_DETACH)) - return 0; /* Only accept class request. */ + if ((req->bmRequestType != 0x21) || (req->bRequest != DFU_DETACH)) + return 0; /* Only accept class request. */ - *complete = dfu_detach_complete; + *complete = dfu_detach_complete; - return 1; + return 1; } #endif - - diff --git a/src/keyboard.c b/src/keyboard.c index e4ed7e2..e9046a3 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -114,7 +114,8 @@ const struct usb_interface_descriptor keyboard_iface = { }; -void keyboard_get_descriptor(uint8_t **buf,uint16_t *len) +void +keyboard_get_descriptor (uint8_t ** buf, uint16_t * len) { /* Handle the HID report descriptor. */ @@ -126,12 +127,12 @@ void keyboard_test (void) { static int c = 0; - uint8_t buf[8] = { 0, 0, 0, 0 ,0,0,0,0}; + uint8_t buf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - buf[0]=(c>> 1) & 7; + buf[0] = (c >> 1) & 7; - buf[2]= (c&1) ? 12:0; + buf[2] = (c & 1) ? 12 : 0; c++; diff --git a/src/kvm.c b/src/kvm.c new file mode 100644 index 0000000..f5e65c8 --- /dev/null +++ b/src/kvm.c @@ -0,0 +1,91 @@ +#include "project.h" + + +static enum +{ + STATE_SYNC = 0, + STATE_ADDR = 1, + STATE_ENDPOINT = 2, + STATE_LEN = 3, + STATE_DATA = 4, +} state = STATE_SYNC; + + +static uint8_t buf[16]; +static int addr; +static int endpoint; +static unsigned int len; +static unsigned int ptr; + +void +kvm_dispatch (void) +{ +#if 0 + printf + ("Addr %d, Write to ep %x, %d bytes %02x %02x %02x %02x ...\r\n", + addr, endpoint, len, buf[0], buf[1], buf[2], buf[3]); +#endif + + if(len) + usbd_ep_write_packet (usbd_dev, endpoint, buf, len); +} + +void +kvm_recv (uint8_t d) +{ +// printf ("S%d V0x%02x\r\n", state, d); + + if (state == STATE_ADDR) + { + addr = d; + usart_queue (d - 1); + state = STATE_ENDPOINT; + return; + } + else + { + usart_queue (d); + } + + + switch (state) + { + case STATE_SYNC: + if (d != 0x5a) + break; + state = STATE_ADDR; + break; + case STATE_ENDPOINT: + endpoint = d; + if ((endpoint < 0x81) || (endpoint > 0x83)) + { + state = STATE_SYNC; + } + else + { + state = STATE_LEN; + } + break; + case STATE_LEN: + len = d; + ptr = 0; + if (len > sizeof (buf)) + { + state = STATE_SYNC; + } + else + { + state = STATE_DATA; + } + break; + case STATE_DATA: + buf[ptr++] = d; + if (ptr >= len) + { + if (!addr) + kvm_dispatch (); + state = STATE_SYNC; + } + break; + } +} @@ -1,49 +1,55 @@ #include "project.h" -void sys_tick_handler(void) +void +sys_tick_handler (void) { - keyboard_test(); - mouse_test(); - tablet_test(); +#if 0 + printf ("fish\r\n"); + keyboard_test (); + mouse_test (); + tablet_test (); +#endif } -int main(void) +int +main (void) { - int i; + int i; - rcc_clock_setup_in_hsi_out_48mhz(); - rcc_periph_clock_enable(RCC_GPIOC); - rcc_periph_clock_enable(RCC_GPIOA); - rcc_periph_clock_enable(RCC_AFIO); - rcc_periph_clock_enable(RCC_USART1); + rcc_clock_setup_in_hsi_out_48mhz (); + rcc_periph_clock_enable (RCC_GPIOC); + rcc_periph_clock_enable (RCC_GPIOA); + rcc_periph_clock_enable (RCC_AFIO); + rcc_periph_clock_enable (RCC_USART1); - uart_init(); + usart_init (); - usb_init(); + usb_init (); - systick_set_clocksource(STK_CSR_CLKSOURCE_AHB_DIV8); - /* 48MHz / 8 = > 6Mhz */ - systick_set_reload(3000000); - /* 6MHz / 3000000 => 2Hz */ + systick_set_clocksource (STK_CSR_CLKSOURCE_AHB_DIV8); + /* 48MHz / 8 = > 6Mhz */ + systick_set_reload (3000000); + /* 6MHz / 3000000 => 2Hz */ - systick_interrupt_enable(); - systick_counter_enable(); + systick_interrupt_enable (); + systick_counter_enable (); - gpio_set(GPIOC, GPIO11); - gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_2_MHZ, - GPIO_CNF_OUTPUT_PUSHPULL, GPIO11); + gpio_set (GPIOC, GPIO11); + gpio_set_mode (GPIOC, GPIO_MODE_OUTPUT_2_MHZ, + GPIO_CNF_OUTPUT_PUSHPULL, GPIO11); - - for (i = 0; i < 0x80000; i++) - __asm__("nop"); - gpio_clear(GPIOC, GPIO11); + for (i = 0; i < 0x80000; i++) + __asm__ ("nop"); - usb_run(); + gpio_clear (GPIOC, GPIO11); - return 0; -} + printf ("Hello world\r\n"); + + usb_run (); + return 0; +} diff --git a/src/mouse.c b/src/mouse.c index acb4166..6e0a207 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -88,7 +88,8 @@ const struct usb_interface_descriptor mouse_iface = { }; -void mouse_get_descriptor(uint8_t **buf,uint16_t *len) +void +mouse_get_descriptor (uint8_t ** buf, uint16_t * len) { /* Handle the HID report descriptor. */ @@ -104,9 +105,9 @@ mouse_test (void) buf[0] = c & 7; - buf[1] = c &8 ? -1:1; - buf[2] = c &16 ? -1:1; - buf[3] = c &32 ? -1:1; + buf[1] = c & 8 ? -1 : 1; + buf[2] = c & 16 ? -1 : 1; + buf[3] = c & 32 ? -1 : 1; c++; diff --git a/src/project.h b/src/project.h index de86ece..0323569 100644 --- a/src/project.h +++ b/src/project.h @@ -1,7 +1,9 @@ #include <stdlib.h> #include <libopencm3/stm32/rcc.h> #include <libopencm3/stm32/gpio.h> +#include <libopencm3/stm32/usart.h> #include <libopencm3/cm3/systick.h> +#include <libopencm3/cm3/nvic.h> #include <libopencm3/usb/usbd.h> #include <libopencm3/usb/hid.h> @@ -13,5 +15,9 @@ #include <libopencm3/usb/dfu.h> #endif +#include <stdio.h> +#include <errno.h> + +#include "ring.h" #include "prototypes.h" diff --git a/src/prototypes.h b/src/prototypes.h index 9b4d2c9..0e971df 100644 --- a/src/prototypes.h +++ b/src/prototypes.h @@ -28,5 +28,16 @@ extern const struct usb_endpoint_descriptor tablet_endpoint; extern const struct usb_interface_descriptor tablet_iface; extern void tablet_get_descriptor(uint8_t **buf, uint16_t *len); extern void tablet_test(void); -/* uart.c */ -extern void uart_init(void); +/* usart.c */ +extern void usart1_isr(void); +extern int _write(int file, char *ptr, int len); +extern void usart_queue(uint8_t d); +extern void usart_init(void); +/* kvm.c */ +extern void kvm_dispatch(void); +extern void kvm_recv(uint8_t d); +/* ring.c */ +extern void ring_init(ring_t *r, uint8_t *buf, size_t len); +extern int ring_write_byte(ring_t *r, uint8_t c); +extern int ring_read_byte(ring_t *r, uint8_t *c); +extern int ring_write(ring_t *r, uint8_t *buf, size_t len); diff --git a/src/ring.c b/src/ring.c new file mode 100644 index 0000000..4f38e44 --- /dev/null +++ b/src/ring.c @@ -0,0 +1,61 @@ +#include "project.h" + + +static inline size_t +ring_next (ring_t * r, size_t p) +{ + p++; + if (p >= r->size) + p -= r->size; + return p; +} + +void +ring_init (ring_t * r, uint8_t * buf, size_t len) +{ + r->data = buf; + r->size = len; + r->write = 0; + r->read = 0; +} + +int +ring_write_byte (ring_t * r, uint8_t c) +{ + size_t n = ring_next (r, r->write); + + if (n == r->read) + return -1; + + r->data[r->write] = c; + r->write = n; + + return 0; +} + + +int +ring_read_byte (ring_t * r, uint8_t * c) +{ + size_t n = ring_next (r, r->read); + + if (r->read == r->write) + return -1; + + *c = r->data[r->read]; + r->read = n; + + return 0; +} + +int +ring_write (ring_t * r, uint8_t * buf, size_t len) +{ + while (len--) + { + if (ring_write_byte (r, *(buf++))) + return -1; + } + + return 0; +} diff --git a/src/ring.h b/src/ring.h new file mode 100644 index 0000000..4e3a22c --- /dev/null +++ b/src/ring.h @@ -0,0 +1,9 @@ +typedef struct ring +{ + uint8_t *data; + size_t size; + size_t write; + size_t read; +} ring_t; + + diff --git a/src/tablet.c b/src/tablet.c index 87d2f2a..1073b37 100644 --- a/src/tablet.c +++ b/src/tablet.c @@ -1,50 +1,50 @@ #include "project.h" static const uint8_t tablet_report_descriptor[] = { - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x09, 0x02, // USAGE (Mouse) - 0xa1, 0x01, // COLLECTION (Application) - 0x09, 0x01, // USAGE (Pointer) - 0xa1, 0x00, // COLLECTION (Physical) - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x09, 0x30, // USAGE (X) - 0x09, 0x31, // USAGE (Y) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) - 0x75, 0x10, // REPORT_SIZE (16) - 0x95, 0x02, // REPORT_COUNT (2) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x09, 0x38, // USAGE (Wheel) - 0x15, 0x81, // LOGICAL_MINIMUM (-127) - 0x25, 0x7f, // LOGICAL_MAXIMUM (127) - 0x75, 0x08, // REPORT_SIZE (8) - 0x95, 0x01, // REPORT_COUNT (1) - 0x81, 0x06, // INPUT (Data,Var,Rel) - 0x05, 0x09, // USAGE_PAGE (Button) - 0x19, 0x01, // USAGE_MINIMUM (Button 1) - 0x29, 0x03, // USAGE_MAXIMUM (Button 3) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0x01, // LOGICAL_MAXIMUM (1) - 0x95, 0x03, // REPORT_COUNT (3) - 0x75, 0x01, // REPORT_SIZE (1) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x95, 0x01, // REPORT_COUNT (1) - 0x75, 0x05, // REPORT_SIZE (5) - 0x81, 0x01, // INPUT (Cnst,Ary,Abs) - 0xc0, // END_COLLECTION - 0x09, 0x3c, // USAGE (Button 60) - 0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1) - 0x09, 0x01, // USAGE (Vendor Usage 1) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0x01, // LOGICAL_MAXIMUM (1) - 0x75, 0x01, // REPORT_SIZE (1) - 0x95, 0x02, // REPORT_COUNT (2) - 0xb1, 0x22, // FEATURE (Data,Var,Abs,NPrf) - 0x75, 0x06, // REPORT_SIZE (6) - 0x95, 0x01, // REPORT_COUNT (1) - 0xb1, 0x01, // FEATURE (Cnst,Ary,Abs) - 0xc0 // END_COLLECTION + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x02, // USAGE (Mouse) + 0xa1, 0x01, // COLLECTION (Application) + 0x09, 0x01, // USAGE (Pointer) + 0xa1, 0x00, // COLLECTION (Physical) + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x30, // USAGE (X) + 0x09, 0x31, // USAGE (Y) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) + 0x75, 0x10, // REPORT_SIZE (16) + 0x95, 0x02, // REPORT_COUNT (2) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x38, // USAGE (Wheel) + 0x15, 0x81, // LOGICAL_MINIMUM (-127) + 0x25, 0x7f, // LOGICAL_MAXIMUM (127) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x01, // REPORT_COUNT (1) + 0x81, 0x06, // INPUT (Data,Var,Rel) + 0x05, 0x09, // USAGE_PAGE (Button) + 0x19, 0x01, // USAGE_MINIMUM (Button 1) + 0x29, 0x03, // USAGE_MAXIMUM (Button 3) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x95, 0x03, // REPORT_COUNT (3) + 0x75, 0x01, // REPORT_SIZE (1) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x05, // REPORT_SIZE (5) + 0x81, 0x01, // INPUT (Cnst,Ary,Abs) + 0xc0, // END_COLLECTION + 0x09, 0x3c, // USAGE (Button 60) + 0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1) + 0x09, 0x01, // USAGE (Vendor Usage 1) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x75, 0x01, // REPORT_SIZE (1) + 0x95, 0x02, // REPORT_COUNT (2) + 0xb1, 0x22, // FEATURE (Data,Var,Abs,NPrf) + 0x75, 0x06, // REPORT_SIZE (6) + 0x95, 0x01, // REPORT_COUNT (1) + 0xb1, 0x01, // FEATURE (Cnst,Ary,Abs) + 0xc0 // END_COLLECTION }; static const struct @@ -59,8 +59,8 @@ static const struct { .hid_descriptor = { - .bLength = sizeof (tablet_function),.bDescriptorType = USB_DT_HID,.bcdHID = - 0x0100,.bCountryCode = 0,.bNumDescriptors = 1,} + .bLength = sizeof (tablet_function),.bDescriptorType = + USB_DT_HID,.bcdHID = 0x0100,.bCountryCode = 0,.bNumDescriptors = 1,} ,.hid_report = { .bReportDescriptorType = USB_DT_REPORT,.wDescriptorLength = @@ -94,7 +94,8 @@ const struct usb_interface_descriptor tablet_iface = { }; -void tablet_get_descriptor(uint8_t **buf,uint16_t *len) +void +tablet_get_descriptor (uint8_t ** buf, uint16_t * len) { /* Handle the HID report descriptor. */ @@ -106,14 +107,14 @@ void tablet_test (void) { static int c = 0; - uint8_t buf[6] = { 0, 0, 0, 0,0 }; + uint8_t buf[6] = { 0, 0, 0, 0, 0 }; - buf[0]=c & 0xff; - buf[1]=(c &0x7fff) >> 8; - buf[2]=(32767 -(c &0x7fff)) & 0xff; - buf[3]=(32767 -(c & 0x7fff)) >> 8; - buf[4]=(c&8 ) ? -1:1; - buf[5]=c; + buf[0] = c & 0xff; + buf[1] = (c & 0x7fff) >> 8; + buf[2] = (32767 - (c & 0x7fff)) & 0xff; + buf[3] = (32767 - (c & 0x7fff)) >> 8; + buf[4] = (c & 8) ? -1 : 1; + buf[5] = c; c++; diff --git a/src/uart.c b/src/uart.c deleted file mode 100644 index 70a6334..0000000 --- a/src/uart.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "project.h" - - - -void uart_init(void) -{ -} diff --git a/src/usart.c b/src/usart.c new file mode 100644 index 0000000..b0ea2a4 --- /dev/null +++ b/src/usart.c @@ -0,0 +1,104 @@ +#include "project.h" + +#define BUFFER_SIZE 256 + +static ring_t output_ring; +static uint8_t output_ring_buf[BUFFER_SIZE]; + +void +usart1_isr (void) +{ + uint8_t data; + + /* Check if we were called because of RXNE. */ + if (((USART_CR1 (USART1) & USART_CR1_RXNEIE) != 0) && + ((USART_SR (USART1) & USART_SR_RXNE) != 0)) + { + + /* Retrieve the data from the peripheral. */ + data = usart_recv (USART1); + + kvm_recv (data); + } + + /* Check if we were called because of TXE. */ + if (((USART_CR1 (USART1) & USART_CR1_TXEIE) != 0) && + ((USART_SR (USART1) & USART_SR_TXE) != 0)) + { + + if (ring_read_byte (&output_ring, &data)) + { + /*No more data, Disable the TXE interrupt, it's no longer needed. */ + USART_CR1 (USART1) &= ~USART_CR1_TXEIE; + } + else + { + usart_send (USART1, data); + } + } + +} + +int +_write (int file, char *ptr, int len) +{ + int ret; + + if (file == 1) + { + ret = ring_write (&output_ring, (uint8_t *) ptr, len); + + if (ret < 0) + ret = -ret; + + USART_CR1 (USART1) |= USART_CR1_TXEIE; + return ret; + } + + errno = EIO; + return -1; +} + +void +usart_queue (uint8_t d) +{ + ring_write_byte(&output_ring,d); + USART_CR1 (USART1) |= USART_CR1_TXEIE; + +#if 0 + printf ("0x%02x ", d); + fflush (stdout); +#endif +} + + +void +usart_init (void) +{ + ring_init (&output_ring, output_ring_buf, sizeof (output_ring_buf)); + + /* Enable the USART1 interrupt. */ + nvic_enable_irq (NVIC_USART1_IRQ); + + /* Setup GPIO pin GPIO_USART1_RE_TX on GPIO port B for transmit. */ + gpio_set_mode (GPIOA, GPIO_MODE_OUTPUT_50_MHZ, + GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART1_TX); + + /* Setup GPIO pin GPIO_USART1_RE_RX on GPIO port B for receive. */ + gpio_set_mode (GPIOA, GPIO_MODE_INPUT, + GPIO_CNF_INPUT_FLOAT, GPIO_USART1_RX); + + /* Setup UART parameters. */ + usart_set_baudrate (USART1, 38400); + usart_set_databits (USART1, 8); + usart_set_stopbits (USART1, USART_STOPBITS_1); + usart_set_parity (USART1, USART_PARITY_NONE); + usart_set_flow_control (USART1, USART_FLOWCONTROL_NONE); + usart_set_mode (USART1, USART_MODE_TX_RX); + + /* Enable USART1 Receive interrupt. */ + USART_CR1 (USART1) |= USART_CR1_RXNEIE; + + /* Finally enable the USART. */ + usart_enable (USART1); +} @@ -18,25 +18,25 @@ const struct usb_device_descriptor dev = { .bNumConfigurations = 1, }; -const struct usb_interface ifaces[] = { - { - .num_altsetting = 1, - .altsetting = &keyboard_iface, - }, - { - .num_altsetting = 1, - .altsetting = &mouse_iface, - }, - { - .num_altsetting = 1, - .altsetting = &tablet_iface, - }, +const struct usb_interface ifaces[] = { + { + .num_altsetting = 1, + .altsetting = &keyboard_iface, + }, + { + .num_altsetting = 1, + .altsetting = &mouse_iface, + }, + { + .num_altsetting = 1, + .altsetting = &tablet_iface, + }, #ifdef INCLUDE_DFU_INTERFACE - { - .num_altsetting = 1, - .altsetting = &dfu_iface, + { + .num_altsetting = 1, + .altsetting = &dfu_iface, #endif - } + } }; const struct usb_config_descriptor config = { @@ -84,14 +84,14 @@ usb_control_request (usbd_device * usbd_dev, struct usb_setup_data *req, switch (req->wIndex) { case 0: - keyboard_get_descriptor(buf,len); - return 1; + keyboard_get_descriptor (buf, len); + return 1; case 1: - mouse_get_descriptor(buf,len); - return 1; + mouse_get_descriptor (buf, len); + return 1; case 2: - tablet_get_descriptor(buf,len); - return 1; + tablet_get_descriptor (buf, len); + return 1; } *len = 0; |