1 /* 2 * Copyright (c) 2022, sakumisu 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 #ifndef USBD_CORE_H 7 #define USBD_CORE_H 8 9 #ifdef __cplusplus 10 extern "C" { 11 #endif 12 13 #include <stdbool.h> 14 #include <string.h> 15 #include <stdint.h> 16 #include <stdlib.h> 17 18 #include "usb_config.h" 19 #include "usb_util.h" 20 #include "usb_errno.h" 21 #include "usb_def.h" 22 #include "usb_list.h" 23 #include "usb_log.h" 24 #include "usb_dc.h" 25 #include "usb_osal.h" 26 #include "usb_memcpy.h" 27 #include "usb_dcache.h" 28 #include "usb_version.h" 29 30 enum usbd_event_type { 31 /* USB DCD IRQ */ 32 USBD_EVENT_ERROR, /** USB error reported by the controller */ 33 USBD_EVENT_RESET, /** USB reset */ 34 USBD_EVENT_SOF, /** Start of Frame received */ 35 USBD_EVENT_CONNECTED, /** USB connected*/ 36 USBD_EVENT_DISCONNECTED, /** USB disconnected */ 37 USBD_EVENT_SUSPEND, /** USB connection suspended by the HOST */ 38 USBD_EVENT_RESUME, /** USB connection resumed by the HOST */ 39 40 /* USB DEVICE STATUS */ 41 USBD_EVENT_CONFIGURED, /** USB configuration done */ 42 USBD_EVENT_SET_INTERFACE, /** USB interface selected */ 43 USBD_EVENT_SET_REMOTE_WAKEUP, /** USB set remote wakeup */ 44 USBD_EVENT_CLR_REMOTE_WAKEUP, /** USB clear remote wakeup */ 45 USBD_EVENT_INIT, /** USB init done when call usbd_initialize */ 46 USBD_EVENT_DEINIT, /** USB deinit done when call usbd_deinitialize */ 47 USBD_EVENT_UNKNOWN 48 }; 49 50 #define USBD_EP0_STATE_SETUP 0 51 #define USBD_EP0_STATE_IN_DATA 1 52 #define USBD_EP0_STATE_OUT_DATA 2 53 #define USBD_EP0_STATE_IN_STATUS 3 54 #define USBD_EP0_STATE_OUT_STATUS 4 55 56 typedef int (*usbd_request_handler)(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len); 57 typedef void (*usbd_endpoint_callback)(uint8_t busid, uint8_t ep, uint32_t nbytes); 58 typedef void (*usbd_notify_handler)(uint8_t busid, uint8_t event, void *arg); 59 60 struct usbd_endpoint { 61 uint8_t ep_addr; 62 usbd_endpoint_callback ep_cb; 63 }; 64 65 struct usbd_interface { 66 usbd_request_handler class_interface_handler; 67 usbd_request_handler class_endpoint_handler; 68 usbd_request_handler vendor_handler; 69 usbd_notify_handler notify_handler; 70 const uint8_t *hid_report_descriptor; 71 uint32_t hid_report_descriptor_len; 72 uint8_t intf_num; 73 }; 74 75 struct usb_descriptor { 76 const uint8_t *(*device_descriptor_callback)(uint8_t speed); 77 const uint8_t *(*config_descriptor_callback)(uint8_t speed); 78 const uint8_t *(*device_quality_descriptor_callback)(uint8_t speed); 79 const uint8_t *(*other_speed_descriptor_callback)(uint8_t speed); 80 const char *(*string_descriptor_callback)(uint8_t speed, uint8_t index); 81 const struct usb_msosv1_descriptor *msosv1_descriptor; 82 const struct usb_msosv2_descriptor *msosv2_descriptor; 83 const struct usb_webusb_descriptor *webusb_url_descriptor; 84 const struct usb_bos_descriptor *bos_descriptor; 85 }; 86 87 struct usbd_bus { 88 uint8_t busid; 89 uintptr_t reg_base; 90 }; 91 92 extern struct usbd_bus g_usbdev_bus[]; 93 94 #ifdef USBD_IRQHandler 95 #error USBD_IRQHandler is obsolete, please call USBD_IRQHandler(xxx) in your irq 96 #endif 97 98 #ifdef CONFIG_USBDEV_ADVANCE_DESC 99 void usbd_desc_register(uint8_t busid, const struct usb_descriptor *desc); 100 #else 101 void usbd_desc_register(uint8_t busid, const uint8_t *desc); 102 void usbd_msosv1_desc_register(uint8_t busid, struct usb_msosv1_descriptor *desc); 103 void usbd_msosv2_desc_register(uint8_t busid, struct usb_msosv2_descriptor *desc); 104 void usbd_bos_desc_register(uint8_t busid, struct usb_bos_descriptor *desc); 105 void usbd_webusb_desc_register(uint8_t busid, struct usb_webusb_descriptor *desc); 106 #endif 107 108 void usbd_add_interface(uint8_t busid, struct usbd_interface *intf); 109 void usbd_add_endpoint(uint8_t busid, struct usbd_endpoint *ep); 110 111 uint16_t usbd_get_ep_mps(uint8_t busid, uint8_t ep); 112 uint8_t usbd_get_ep_mult(uint8_t busid, uint8_t ep); 113 bool usb_device_is_configured(uint8_t busid); 114 bool usb_device_is_suspend(uint8_t busid); 115 int usbd_send_remote_wakeup(uint8_t busid); 116 uint8_t usbd_get_ep0_next_state(uint8_t busid); 117 118 int usbd_initialize(uint8_t busid, uintptr_t reg_base, void (*event_handler)(uint8_t busid, uint8_t event)); 119 int usbd_deinitialize(uint8_t busid); 120 121 #ifdef __cplusplus 122 } 123 #endif 124 125 #endif /* USBD_CORE_H */ 126