usbd_core.h 4.2 KB

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