refactor usb device intf and ep register

This commit is contained in:
sakumisu
2022-08-20 16:20:23 +08:00
parent 523d33506d
commit 3c94fca8d8
36 changed files with 326 additions and 541 deletions

View File

@@ -51,7 +51,7 @@ USB_NOCACHE_RAM_SECTION struct usbd_core_cfg_priv {
#endif
} usbd_core_cfg;
static usb_slist_t usbd_intf_head = USB_SLIST_OBJECT_INIT(usbd_intf_head);
usb_slist_t usbd_intf_head = USB_SLIST_OBJECT_INIT(usbd_intf_head);
static struct usb_msosv1_descriptor *msosv1_desc;
static struct usb_msosv2_descriptor *msosv2_desc;
@@ -585,7 +585,7 @@ static int usbd_class_request_handler(struct usb_setup_packet *setup, uint8_t **
if ((setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) == USB_REQUEST_RECIPIENT_INTERFACE) {
usb_slist_for_each(i, &usbd_intf_head)
{
usbd_interface_t *intf = usb_slist_entry(i, struct usbd_interface, list);
struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list);
if (intf->class_handler && (intf->intf_num == (setup->wIndex & 0xFF))) {
return intf->class_handler(setup, data, len);
@@ -594,7 +594,7 @@ static int usbd_class_request_handler(struct usb_setup_packet *setup, uint8_t **
} else if ((setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) == USB_REQUEST_RECIPIENT_ENDPOINT) {
usb_slist_for_each(i, &usbd_intf_head)
{
usbd_interface_t *intf = usb_slist_entry(i, struct usbd_interface, list);
struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list);
if (intf->custom_handler && (intf->intf_num == ((setup->wIndex >> 8) & 0xFF))) {
return intf->custom_handler(setup, data, len);
@@ -656,7 +656,7 @@ static int usbd_vendor_request_handler(struct usb_setup_packet *setup, uint8_t *
usb_slist_for_each(i, &usbd_intf_head)
{
usbd_interface_t *intf = usb_slist_entry(i, struct usbd_interface, list);
struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list);
if (intf->vendor_handler && !intf->vendor_handler(setup, data, len)) {
return 0;
@@ -684,7 +684,7 @@ static int usbd_custom_request_handler(struct usb_setup_packet *setup, uint8_t *
usb_slist_t *i;
usb_slist_for_each(i, &usbd_intf_head)
{
usbd_interface_t *intf = usb_slist_entry(i, struct usbd_interface, list);
struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list);
if (intf->custom_handler && (intf->intf_num == (setup->wIndex & 0xFF))) {
return intf->custom_handler(setup, data, len);
@@ -741,7 +741,7 @@ static void usbd_class_event_notify_handler(uint8_t event, void *arg)
usb_slist_t *i;
usb_slist_for_each(i, &usbd_intf_head)
{
usbd_interface_t *intf = usb_slist_entry(i, struct usbd_interface, list);
struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list);
if (intf->notify_handler) {
intf->notify_handler(event, arg);
@@ -952,25 +952,17 @@ void usbd_bos_desc_register(struct usb_bos_descriptor *desc)
bos_desc = desc;
}
void usbd_class_register(usbd_class_t *devclass)
{
// usb_slist_add_tail(&usbd_class_head, &devclass->list);
// usb_slist_init(&devclass->intf_list);
}
void usbd_class_add_interface(usbd_class_t *devclass, usbd_interface_t *intf)
void usbd_add_interface(struct usbd_interface *intf)
{
static uint8_t intf_offset = 0;
intf->intf_num = intf_offset;
usb_slist_add_tail(&usbd_intf_head, &intf->list);
usb_slist_init(&intf->ep_list);
intf_offset++;
}
void usbd_interface_add_endpoint(usbd_interface_t *intf, usbd_endpoint_t *ep)
void usbd_add_endpoint(struct usbd_endpoint *ep)
{
usb_slist_add_tail(&intf->ep_list, &ep->list);
if (ep->ep_addr & 0x80) {
usbd_core_cfg.in_ep_cb[ep->ep_addr & 0x7f] = ep->ep_cb;
} else {

View File

@@ -44,13 +44,14 @@ typedef int (*usbd_request_handler)(struct usb_setup_packet *setup, uint8_t **da
typedef void (*usbd_endpoint_callback)(uint8_t ep, uint32_t nbytes);
typedef void (*usbd_notify_handler)(uint8_t event, void *arg);
typedef struct usbd_endpoint {
usb_slist_t list;
extern usb_slist_t usbd_intf_head;
struct usbd_endpoint {
uint8_t ep_addr;
usbd_endpoint_callback ep_cb;
} usbd_endpoint_t;
};
typedef struct usbd_interface {
struct usbd_interface {
usb_slist_t list;
/** Handler for USB Class specific commands*/
usbd_request_handler class_handler;
@@ -60,23 +61,19 @@ typedef struct usbd_interface {
usbd_request_handler custom_handler;
/** Handler for USB event notify commands */
usbd_notify_handler notify_handler;
const uint8_t *hid_report_descriptor;
uint32_t hid_report_descriptor_len;
uint8_t intf_num;
usb_slist_t ep_list;
} usbd_interface_t;
typedef struct usbd_class {
usb_slist_t list;
const char *name;
usb_slist_t intf_list;
} usbd_class_t;
};
void usbd_desc_register(const uint8_t *desc);
void usbd_msosv1_desc_register(struct usb_msosv1_descriptor *desc);
void usbd_msosv2_desc_register(struct usb_msosv2_descriptor *desc);
void usbd_bos_desc_register(struct usb_bos_descriptor *desc);
void usbd_class_register(usbd_class_t *devclass);
void usbd_class_add_interface(usbd_class_t *devclass, usbd_interface_t *intf);
void usbd_interface_add_endpoint(usbd_interface_t *intf, usbd_endpoint_t *ep);
void usbd_add_interface(struct usbd_interface *intf);
void usbd_add_endpoint(struct usbd_endpoint *ep);
bool usb_device_is_configured(void);
void usbd_configure_done_callback(void);
int usbd_initialize(void);