+/*** Configurable parameters ***/
+
#define USB_SELF_POWERED
#define USB_NUM_CONFIGURATIONS 1
#define USB_DEBUG
u16 ep0_remaining_length;
u16 ep0_total_length;
byte ep0_buf[USB_EP0_BUF_SIZE];
+ // Descriptor data to be filled by the user during usb_dev_reset()
+ const byte *desc_device;
+ const byte *desc_config;
+ const char * const *desc_string;
+ const byte *desc_languages;
+ u16 desc_device_len;
+ u16 desc_config_len;
+ u16 desc_string_items;
+ u16 desc_languages_len;
};
-void usb_init(struct usb *usb, PCD_HandleTypeDef *hpcd);
-void usb_start(struct usb *usb);
-
enum usb_device_state {
USB_STATE_DEFAULT,
USB_STATE_ADDRESSED,
{ }
#endif
+// Parsed setup request
+struct setup_request {
+ byte bmRequest;
+ byte bRequest;
+ u16 wValue;
+ u16 wIndex;
+ u16 wLength;
+};
+
+/*** Functions provided by low-level code ***/
+
+void usb_init(struct usb *usb, PCD_HandleTypeDef *hpcd);
+void usb_start(struct usb *usb);
+
+void usb_ctl_send_status(struct usb *usb);
+void usb_ctl_recv_status(struct usb *usb);
+void usb_ctl_send_data(struct usb *usb, const byte *data, uint len);
+void usb_ctl_recv_data(struct usb *usb, byte *data, uint len);
+void usb_ctl_error(struct usb *usb);
+void usb_ctl_setup_error(struct usb *usb, struct setup_request *setup);
+
+/*** Callbacks to user code ***/
+
+// Device was reset
+void usb_dev_reset(struct usb *usb);
+
+// Configure the device (usb->config is the selected configuration)
+void usb_dev_configure(struct usb *usb);
+
+// Un-configure the device (usb->config is the configuration we are leaving)
+void usb_dev_unconfigure(struct usb *usb);
+
+// Intercept a setup packet. Returns true if default processing should be skipped.
+// Remember to check if usb->state == USB_STATE_CONFIGURED for most requests.
+bool usb_dev_setup_hook(struct usb *usb, struct setup_request *setup);
+
+// Finished receiving control packet data requested by usb_ctl_recv_data()
+void usb_dev_ctl_recv_done(struct usb *usb);
+
+// Finished sending control packet data requested by usb_ctl_send_data()
+void usb_dev_ctl_send_done(struct usb *usb);
+
+// Finished receiving data on a non-control endpoint
+void usb_dev_recv_done(struct usb *usb, byte epnum);
+
+// Finished sending data on a non-control endpoint
+void usb_dev_send_done(struct usb *usb, byte epnum);
+
/*** Constants from USB specs ***/
#define USB_REQ_DIRECTION 0x80