diff options
author | root <root@lamia.panaceas.james.local> | 2015-06-13 12:18:52 +0100 |
---|---|---|
committer | root <root@lamia.panaceas.james.local> | 2015-06-13 12:18:52 +0100 |
commit | bc9e93ad20f936c67d6acddb02d426783c32398e (patch) | |
tree | c4c128604c92298174cfcd3c1b07878d0ca35ac6 /app/usb.c | |
parent | 500561f54adabc9aaf5b3548744b5bc8b4381c89 (diff) | |
download | stm32_usb_kvm-bc9e93ad20f936c67d6acddb02d426783c32398e.tar.gz stm32_usb_kvm-bc9e93ad20f936c67d6acddb02d426783c32398e.tar.bz2 stm32_usb_kvm-bc9e93ad20f936c67d6acddb02d426783c32398e.zip |
add usb resume support
Diffstat (limited to 'app/usb.c')
-rw-r--r-- | app/usb.c | 82 |
1 files changed, 72 insertions, 10 deletions
@@ -25,18 +25,22 @@ const struct usb_interface ifaces[] = { }, { .num_altsetting = 1, - .altsetting = &mouse_iface, + .altsetting = &consumer_iface, }, { .num_altsetting = 1, .altsetting = &tablet_iface, }, + { + .num_altsetting = 1, + .altsetting = &mouse_iface, + }, #ifdef INCLUDE_DFU_INTERFACE { .num_altsetting = 1, .altsetting = &dfu_iface, + }, #endif - } }; const struct usb_config_descriptor config = { @@ -44,14 +48,14 @@ const struct usb_config_descriptor config = { .bDescriptorType = USB_DT_CONFIGURATION, .wTotalLength = 0, #ifdef INCLUDE_DFU_INTERFACE - .bNumInterfaces = 4, + .bNumInterfaces = 5, #else - .bNumInterfaces = 3, + .bNumInterfaces = 4, #endif .bConfigurationValue = 1, - .iConfiguration = 0, - .bmAttributes = 0xC0, - .bMaxPower = 0x32, + .iConfiguration = 4, + .bmAttributes = 0xa0, + .bMaxPower = 0x31, .interface = ifaces, }; @@ -60,6 +64,12 @@ static const char *usb_strings[] = { "Cabbages are good for you", "fish", "soup", + "kvm composite", + "kvm keyboard", + "kvm consumer", + "kvm tablet", + "kvm mouse", + "kvm dfu device", }; @@ -67,6 +77,47 @@ static const char *usb_strings[] = { usbd_device *usbd_dev; +int usb_is_suspended = 0; + +static void +usb_suspended (void) +{ + *USB_CNTR_REG |= USB_CNTR_FSUSP; + + usb_is_suspended = 1; +} + + +static void +usb_resumed (void) +{ + + *USB_CNTR_REG &= ~USB_CNTR_FSUSP; + + usb_is_suspended = 0; +} + +int +usb_wakeup_host (void) +{ + if (!usb_is_suspended) + return 1; + + + *USB_CNTR_REG |= USB_CNTR_RESUME; + + delay_us (1000); + delay_us (1000); + delay_us (1000); + delay_us (1000); + delay_us (1000); + + *USB_CNTR_REG &= ~USB_CNTR_RESUME; + + return 0; +} + + static int usb_control_request (usbd_device * usbd_dev, struct usb_setup_data *req, uint8_t ** buf, uint16_t * len, @@ -87,11 +138,14 @@ usb_control_request (usbd_device * usbd_dev, struct usb_setup_data *req, keyboard_get_descriptor (buf, len); return 1; case 1: - mouse_get_descriptor (buf, len); + consumer_get_descriptor (buf, len); return 1; case 2: tablet_get_descriptor (buf, len); return 1; + case 3: + mouse_get_descriptor (buf, len); + return 1; } *len = 0; @@ -108,6 +162,7 @@ usb_set_config (usbd_device * usbd_dev, uint16_t wValue) usbd_ep_setup (usbd_dev, 0x81, USB_ENDPOINT_ATTR_INTERRUPT, 4, NULL); usbd_ep_setup (usbd_dev, 0x82, USB_ENDPOINT_ATTR_INTERRUPT, 4, NULL); usbd_ep_setup (usbd_dev, 0x83, USB_ENDPOINT_ATTR_INTERRUPT, 4, NULL); + usbd_ep_setup (usbd_dev, 0x84, USB_ENDPOINT_ATTR_INTERRUPT, 4, NULL); usbd_register_control_callback (usbd_dev, USB_REQ_TYPE_STANDARD | @@ -121,6 +176,8 @@ usb_set_config (usbd_device * usbd_dev, uint16_t wValue) USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT, dfu_control_request); #endif + + } /* Buffer to be used for control requests. */ @@ -131,16 +188,21 @@ usb_init (void) { usbd_dev = - usbd_init (&stm32f103_usb_driver, &dev, &config, usb_strings, 3, + usbd_init (&stm32f103_usb_driver, &dev, &config, usb_strings, 8, usbd_control_buffer, sizeof (usbd_control_buffer)); 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); + + SET_REG (USB_CNTR_REG, + USB_CNTR_RESETM | USB_CNTR_CTRM | USB_CNTR_SUSPM | USB_CNTR_WKUPM); } void usb_run (void) { - while (1) + for (;;) usbd_poll (usbd_dev); } |