USB_DESC_TYPE_INTERFACE, // bDescriptorType
0x00, // bInterfaceNumber
0x00, // bAlternateSetting
- 0x01, // bNumEndpoints
+ 0x02, // bNumEndpoints
0xff, // bInterfaceClass: vendor-defined
0x00, // bInterfaceSubClass
0x00, // nInterfaceProtocol
};
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
"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));
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)
{
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;
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)
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)
// FIXME: Custom data callback
// All data have been sent
}
+ usb_ctl_recv_status(usb);
}
}
else