From d61078a5cb38804e9eda28565a662485f3f59b55 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 17 Jan 2017 14:36:52 +0000 Subject: usb state machine improvements --- app/prototypes.h | 75 +++++++++++++++++++++++++++----------------------------- app/ticker.c | 2 ++ app/usb.c | 30 +++++++++++++++++++++++ id.h | 2 +- 4 files changed, 69 insertions(+), 40 deletions(-) diff --git a/app/prototypes.h b/app/prototypes.h index afc4f6d..c73b3de 100644 --- a/app/prototypes.h +++ b/app/prototypes.h @@ -1,72 +1,69 @@ /* dfu.c */ extern const struct usb_dfu_descriptor dfu_function; extern const struct usb_interface_descriptor dfu_iface; -extern 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)); +extern 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)); /* mouse.c */ extern const struct usb_endpoint_descriptor mouse_endpoint; extern const struct usb_interface_descriptor mouse_iface; -extern void mouse_get_descriptor (uint8_t ** buf, uint16_t * len); -extern void mouse_test (void); +extern void mouse_get_descriptor(uint8_t **buf, uint16_t *len); +extern void mouse_test(void); /* keyboard.c */ extern const struct usb_endpoint_descriptor keyboard_endpoint; extern const struct usb_interface_descriptor keyboard_iface; -extern void keyboard_get_descriptor (uint8_t ** buf, uint16_t * len); -extern void keyboard_test (void); +extern void keyboard_get_descriptor(uint8_t **buf, uint16_t *len); +extern void keyboard_test(void); /* main.c */ -extern int main (void); +extern int main(void); /* usb.c */ extern const struct usb_device_descriptor dev; extern const struct usb_interface ifaces[]; extern const struct usb_config_descriptor config; extern usbd_device *usbd_dev; +extern int usb_time_since_sof; extern int usb_is_suspended; -extern int usb_wakeup_host (void); -extern void usb_set_config (usbd_device * usbd_dev, uint16_t wValue); -extern void usb_init (void); -extern void usb_run (void); +extern int usb_wakeup_host(void); +extern void usb_set_config(usbd_device *usbd_dev, uint16_t wValue); +extern void usb_tick(void); +extern void usb_init(void); +extern void usb_run(void); /* tablet.c */ 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); +extern void tablet_get_descriptor(uint8_t **buf, uint16_t *len); +extern void tablet_test(void); /* usart.c */ extern ring_t rx1_ring; extern ring_t tx1_ring; extern ring_t rx2_ring; extern ring_t tx2_ring; extern ring_t tx3_ring; -extern void usart1_isr (void); -extern void usart2_isr (void); -extern void usart3_isr (void); -extern int _write (int file, char *ptr, int len); -extern void usart2_queue (uint8_t d); -extern void usart3_queue (uint8_t d); -extern void usart_init (void); +extern void usart1_isr(void); +extern void usart2_isr(void); +extern void usart3_isr(void); +extern int _write(int file, char *ptr, int len); +extern void usart2_queue(uint8_t d); +extern void usart3_queue(uint8_t d); +extern void usart_init(void); /* kvm.c */ -extern void kvm_dispatch (void); -extern void kvm_recv (uint8_t d); +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); +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); /* led.c */ -extern void led_init (void); -extern void led_set (uint32_t v); -extern void led_tick (void); +extern void led_init(void); +extern void led_set(uint32_t v); +extern void led_tick(void); /* consumer.c */ extern const struct usb_endpoint_descriptor consumer_endpoint; extern const struct usb_interface_descriptor consumer_iface; -extern void consumer_get_descriptor (uint8_t ** buf, uint16_t * len); +extern void consumer_get_descriptor(uint8_t **buf, uint16_t *len); /* ticker.c */ extern volatile uint32_t ticks; -extern void delay_us (uint32_t d); -extern void sys_tick_handler (void); -extern void delay_ms (uint32_t d); -extern int timed_out (uint32_t then, unsigned int ms); -extern void ticker_init (void); +extern void delay_us(uint32_t d); +extern void sys_tick_handler(void); +extern void delay_ms(uint32_t d); +extern int timed_out(uint32_t then, unsigned int ms); +extern void ticker_init(void); diff --git a/app/ticker.c b/app/ticker.c index efcbda6..f8f68ba 100644 --- a/app/ticker.c +++ b/app/ticker.c @@ -33,6 +33,8 @@ sys_tick_handler (void) kvm_recv (d); led_tick (); + + usb_tick(); } diff --git a/app/usb.c b/app/usb.c index 5845427..8c088dc 100644 --- a/app/usb.c +++ b/app/usb.c @@ -75,6 +75,7 @@ static const char *usb_strings[] = { usbd_device *usbd_dev; +int usb_time_since_sof = 0; int usb_is_suspended = 0; @@ -153,6 +154,7 @@ usb_control_request (usbd_device * usbd_dev, struct usb_setup_data *req, } + void usb_set_config (usbd_device * usbd_dev, uint16_t wValue) { @@ -180,6 +182,33 @@ usb_set_config (usbd_device * usbd_dev, uint16_t wValue) } +static void +usb_sof (void) +{ + usb_time_since_sof = 0; +} + +void +usb_tick (void) +{ + if (usb_is_suspended) + { + usb_time_since_sof = 0; + return; + } + + usb_time_since_sof++; + + if (usb_time_since_sof > 1000) + { + usb_time_since_sof = 0; + _usbd_reset (usbd_dev); + } + + +} + + /* Buffer to be used for control requests. */ static uint8_t usbd_control_buffer[128]; @@ -194,6 +223,7 @@ usb_init (void) usbd_register_set_config_callback (usbd_dev, usb_set_config); usbd_register_suspend_callback (usbd_dev, usb_suspended); usbd_register_resume_callback (usbd_dev, usb_resumed); + usbd_register_sof_callback (usbd_dev, usb_sof); } diff --git a/id.h b/id.h index a7bea99..468957d 100644 --- a/id.h +++ b/id.h @@ -1,5 +1,5 @@ -#define ID_PRODUCT 0xee0 +#define ID_PRODUCT 0xee3 #define BUS_ID 0x0 -- cgit v1.2.3