summaryrefslogtreecommitdiffstats
path: root/app/usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/usb.c')
-rw-r--r--app/usb.c82
1 files changed, 72 insertions, 10 deletions
diff --git a/app/usb.c b/app/usb.c
index 10ecd68..245de1d 100644
--- a/app/usb.c
+++ b/app/usb.c
@@ -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);
}