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