X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=Inc%2Fusb.h;h=114a5378ea81f4e7e2361dfbc60f4f666778ab59;hb=2fe5a1535ede515a5f2037f9323e7d960358ad96;hp=e33a71f1442faf532ab1407b531633167ccbe06f;hpb=4628d046ad479a2b7310bc598b663984742b9a22;p=home-hw.git diff --git a/Inc/usb.h b/Inc/usb.h index e33a71f..114a537 100644 --- a/Inc/usb.h +++ b/Inc/usb.h @@ -1,3 +1,5 @@ +/*** Configurable parameters ***/ + #define USB_SELF_POWERED #define USB_NUM_CONFIGURATIONS 1 #define USB_DEBUG @@ -27,11 +29,17 @@ struct usb { 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, @@ -56,6 +64,54 @@ static inline void usb_debug(char *msg, ...) { } #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