]> mj.ucw.cz Git - home-hw.git/commitdiff
More USB debugging
authorMartin Mares <mj@ucw.cz>
Sun, 24 Jun 2018 13:34:03 +0000 (15:34 +0200)
committerMartin Mares <mj@ucw.cz>
Sun, 24 Jun 2018 13:34:03 +0000 (15:34 +0200)
Inc/util.h
Src/usb.c

index 07a677bb97cf3845b520d93b567f447c465ca2dd..388a1bd758946472fc8a1ba8701c9f03d5ec4de5 100644 (file)
@@ -12,7 +12,7 @@ typedef int32_t s32;
 
 // debug.c
 
-#define DEBUG_SEMIHOSTING
+#undef DEBUG_SEMIHOSTING
 
 void debug_printf(const char *fmt, ...);
 void debug_puts(const char *s);
index ce0bddc235500e866a149dc937023aedc8698317..b7f731331e89a3b51f7fadb1714db6c80d98d6dc 100644 (file)
--- a/Src/usb.c
+++ b/Src/usb.c
@@ -52,7 +52,7 @@ static const byte desc_config[] = {
   USB_DESC_TYPE_INTERFACE,     // bDescriptorType
   0x00,                                // bInterfaceNumber
   0x00,                                // bAlternateSetting
-  0x01,                                // bNumEndpoints
+  0x02,                                // bNumEndpoints
   0xff,                                // bInterfaceClass: vendor-defined
   0x00,                                // bInterfaceSubClass
   0x00,                                // nInterfaceProtocol
@@ -74,7 +74,7 @@ static const byte desc_config[] = {
 };
 
 static const char * const desc_string[] = {
-  "",                          // DESC_STR_NONE
+  NULL,                                // DESC_STR_NONE
   "United Computer Wizards",   // DESC_STR_MANUFACTURER
   "Mysterious Gadget",         // DESC_STR_PRODUCT
   "00000042",                  // DESC_STR_SERIAL
@@ -82,6 +82,12 @@ static const char * const desc_string[] = {
   "Default Interface",         // DESC_STR_INTERFACE
 };
 
+static const byte desc_languages[] = {
+  4,                           // bLength
+  USB_DESC_TYPE_STRING,                // bDescriptorType
+  DESC_U16(1033),              // English
+};
+
 void usb_init(struct usb *usb, PCD_HandleTypeDef *hpcd)
 {
   memset(usb, 0, sizeof(*usb));
@@ -117,13 +123,11 @@ static void usb_ctl_send_status(struct usb *usb)
   usb_ep_transmit(usb, 0x00, NULL, 0);
 }
 
-#if 0  // FIXME
 static void usb_ctl_recv_status(struct usb *usb)
 {
   usb->ep0_state = USB_EP0_STATUS_OUT;
   usb_ep_receive(usb, 0x00, NULL, 0);
 }
-#endif
 
 static void usb_ctl_send_data(struct usb *usb, const byte *data, uint len)
 {
@@ -275,6 +279,8 @@ static void dev_get_descriptor(struct usb *usb, struct setup_request *setup)
     case USB_DESC_TYPE_CONFIGURATION:
       return dev_desc_send(usb, setup, desc_config, sizeof(desc_config));
     case USB_DESC_TYPE_STRING:
+      if (!desc_index)
+       return dev_desc_send(usb, setup, desc_languages, sizeof(desc_languages));
       if (desc_index < sizeof(desc_string) / sizeof(desc_string[0]))
        return dev_desc_send_string(usb, setup, desc_string[desc_index]);
       break;
@@ -524,6 +530,7 @@ void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
   if (!epnum)
     {
       // HAL/LL handle EP0 transfers in a completely different way, we have to do many things ourselves
+      usb_debug("Ep0 OUT: state=%u rem=%u total=%u\n", usb->ep0_state, usb->ep0_remaining_length, usb->ep0_total_length);
       if (usb->ep0_state != USB_EP0_DATA_OUT)
        return;
       if (usb->ep0_remaining_length > ep->maxpacket)
@@ -557,6 +564,7 @@ void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
   if (!epnum)
     {
       // HAL/LL handle EP0 transfers in a completely different way, we have to do many things ourselves
+      usb_debug("Ep0 IN: state=%u rem=%u total=%u want=%u\n", usb->ep0_state, usb->ep0_remaining_length, usb->ep0_total_length, usb->ep0_setup_data_length);
       if (usb->ep0_state != USB_EP0_DATA_IN)
        return;
       if (usb->ep0_remaining_length > ep->maxpacket)
@@ -583,6 +591,7 @@ void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
              // FIXME: Custom data callback
              // All data have been sent
            }
+         usb_ctl_recv_status(usb);
        }
     }
   else