udc.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /* Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
  2. * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
  3. * the the People's Republic of China and other countries.
  4. * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
  5. * DISCLAIMER
  6. * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
  7. * IF YOU NEED TO INTEGRATE THIRD PART'S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
  8. * IN ALLWINNER'SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
  9. * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
  10. * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
  11. * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
  12. * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PART'S TECHNOLOGY.
  13. * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
  14. * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
  15. * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
  16. * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
  17. * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18. * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  19. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  20. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  21. * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
  22. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  23. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  24. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  25. * OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #ifndef __UDC_H__
  28. #define __UDC_H__
  29. #include <usb/ch9.h>
  30. #include <usb/sunxi_hal_udc.h>
  31. #include <hal_clk.h>
  32. //#define UDC_LOG_DEBUG
  33. #define log_udc_info(fmt, ...) hal_log_info("udc: "fmt, ##__VA_ARGS__)
  34. #define log_udc_err(fmt, ...) hal_log_err("udc: "fmt, ##__VA_ARGS__)
  35. #ifdef UDC_LOG_DEBUG
  36. #define log_udc_dbg(fmt, ...) hal_log_debug("[%s %d]"fmt, __func__, __LINE__, ##__VA_ARGS__)
  37. #else
  38. #define log_udc_dbg(fmt, ...)
  39. #endif
  40. #define UDC_MAX_NUM_EP_TX 4
  41. #define UDC_MAX_NUM_EP_RX 4
  42. #define UDC_MAX_PACKET_SIZE_EP0 64
  43. #define UDC_MAX_PACKET_SIZE_EP_BULK 512
  44. #define UDC_MAX_PACKET_SIZE_EP_ISO 1024
  45. #define UDC_MAX_PACKET_SIZE_EP_INT 512
  46. #define UDC_MAX_NUM_STRING_DESC 12
  47. typedef enum {
  48. UDC_IO_TYPE_PIO = 0,
  49. UDC_IO_TYPE_DMA,
  50. } udc_io_type_t;
  51. typedef enum {
  52. UDC_EP_TYPE_EP0 = 0,
  53. UDC_EP_TYPE_TX,
  54. UDC_EP_TYPE_RX,
  55. } udc_ep_type_t;
  56. typedef enum {
  57. UDC_EP0_IDLE = 0,
  58. UDC_EP0_IN_DATA_PHASE,
  59. UDC_EP0_OUT_DATA_PHASE,
  60. UDC_EP0_END_XFER,
  61. UDC_EP0_STALL,
  62. } udc_ep0_state_t;
  63. typedef enum {
  64. UDC_SPEED_UNKNOWN = 0, /* enumerating */
  65. UDC_SPEED_LOW, UDC_SPEED_FULL, /* usb 1.1 */
  66. UDC_SPEED_HIGH, /* usb 2.0 */
  67. UDC_SPEED_WIRELESS, /* wireless (usb 2.5) */
  68. UDC_SPEED_SUPER, /* usb 3.0 */
  69. UDC_SPEED_SUPER_PLUS, /* usb 3.1 */
  70. } udc_speed_t;
  71. typedef struct {
  72. uint8_t ep_addr;
  73. uint32_t fifo_addr;
  74. uint32_t fifo_size;
  75. uint8_t double_fifo;
  76. } udc_fifo_t;
  77. typedef struct {
  78. uint8_t ep_addr;
  79. void *pdata;
  80. uint32_t data_len;
  81. uint32_t data_actual;
  82. uint32_t maxpacket;
  83. } udc_ep_t;
  84. typedef struct {
  85. uint8_t ep0state;
  86. uint8_t address;
  87. udc_speed_t speed;
  88. struct usb_ctrlrequest crq;
  89. uint8_t req_std;
  90. struct usb_device_descriptor *device_desc;
  91. void *config_desc;
  92. uint32_t config_desc_len;
  93. struct usb_string_descriptor *string_desc[UDC_MAX_NUM_STRING_DESC];
  94. uint32_t string_desc_num;
  95. udc_ep_t ep0;
  96. udc_ep_t epin[UDC_MAX_NUM_EP_TX];
  97. udc_ep_t epout[UDC_MAX_NUM_EP_RX];
  98. udc_callback_t callback;
  99. } udc_priv_t;
  100. typedef struct {
  101. uint32_t *usb_vbus;
  102. uint32_t irq_no;
  103. uint32_t irq_flag;
  104. uint32_t drive_level;
  105. hal_clk_id_t otg_clk_id;
  106. hal_clk_id_t phy_clk_id;
  107. uint32_t reset_phy_clk;
  108. uint32_t reset_otg_clk;
  109. hal_clk_t phy_clk;
  110. hal_clk_t otg_clk;
  111. struct reset_control *reset_phy;
  112. struct reset_control *reset_otg;
  113. } sunxi_udc_io_t;
  114. #endif /*__UDC_H__*/