drv_usbh.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-05-25 CDT first version
  9. */
  10. #ifndef __DRV_USBH_H__
  11. #define __DRV_USBH_H__
  12. /*******************************************************************************
  13. * Include files
  14. ******************************************************************************/
  15. #include <rtthread.h>
  16. #include "rtdevice.h"
  17. #include "hc32_ll_usb.h"
  18. /* C binding of definitions if building with C++ compiler */
  19. #ifdef __cplusplus
  20. extern "C"
  21. {
  22. #endif
  23. /*******************************************************************************
  24. * Global pre-processor symbols/macros ('#define')
  25. ******************************************************************************/
  26. #define USB_FS_PORT (1U)
  27. #define MAX_DATA_LENGTH (0x200U)
  28. #define HCINT_NYET (1UL << 6)
  29. /* Macro definations for host mode */
  30. #define PID_DATA0 (0U)
  31. #define PID_DATA2 (1U)
  32. #define PID_DATA1 (2U)
  33. #define PID_SETUP (3U)
  34. /*******************************************************************************
  35. * Global type definitions ('typedef')
  36. ******************************************************************************/
  37. /* status of the host channel */
  38. typedef enum
  39. {
  40. HOST_CH_IDLE = 0U,
  41. HOST_CH_XFERCOMPL,
  42. HOST_CH_CHHLTD,
  43. HOST_CH_NAK,
  44. HOST_CH_NYET,
  45. HOST_CH_STALL,
  46. HOST_CH_XACTERR,
  47. HOST_CH_BBLERR,
  48. HOST_CH_DATATGLERR,
  49. HOST_CH_AHBERR,
  50. HOST_CH_FRMOVRUN,
  51. HOST_CH_BNAINTR,
  52. HOST_CH_XCS_XACT_ERR,
  53. HOST_CH_DESC_LST_ROLLINTR
  54. } HOST_CH_STATUS;
  55. typedef enum
  56. {
  57. HOST_CH_XFER_IDLE = 0U,
  58. HOST_CH_XFER_DONE,
  59. HOST_CH_XFER_UNREADY,
  60. HOST_CH_XFER_ERROR,
  61. HOST_CH_XFER_STALL
  62. } HOST_CH_XFER_STATE;
  63. typedef enum
  64. {
  65. CTRL_START = 0U,
  66. CTRL_XFRC,
  67. CTRL_HALTED,
  68. CTRL_NAK,
  69. CTRL_STALL,
  70. CTRL_XACTERR,
  71. CTRL_BBLERR,
  72. CTRL_DATATGLERR,
  73. CTRL_FAIL
  74. } CTRL_HANDLE_STATUS;
  75. typedef struct
  76. {
  77. uint8_t bmRequest;
  78. uint8_t bRequest;
  79. uint16_t wValue;
  80. uint16_t wIndex;
  81. uint16_t wLength;
  82. } USB_SETUP_REQ;
  83. typedef struct
  84. {
  85. void (*user_init)(void);
  86. void (*user_devrst)(void);
  87. void (*user_devconfig)(void);
  88. void (*user_devsusp)(void);
  89. void (*user_devresume)(void);
  90. void (*user_devconn)(void);
  91. void (*user_devdisconn)(void);
  92. } usb_dev_user_func;
  93. typedef struct
  94. {
  95. uint16_t channel[USB_MAX_TX_FIFOS];
  96. USB_HOST_CH hc[USB_MAX_TX_FIFOS];
  97. __IO uint32_t is_dev_connect;
  98. uint8_t Rx_Buffer[MAX_DATA_LENGTH];
  99. __IO uint32_t ErrCnt[USB_MAX_TX_FIFOS];
  100. __IO uint32_t XferCnt[USB_MAX_TX_FIFOS];
  101. __IO HOST_CH_STATUS HC_Status[USB_MAX_TX_FIFOS];
  102. __IO HOST_CH_XFER_STATE URB_State[USB_MAX_TX_FIFOS];
  103. __IO uint8_t devspeed;
  104. } USB_HOST_PARAM;
  105. typedef struct
  106. {
  107. USB_CORE_BASIC_CFGS basic_cfgs;
  108. LL_USB_TypeDef regs;
  109. #ifdef USE_HOST_MODE
  110. USB_HOST_PARAM host;
  111. void *pData;
  112. #endif
  113. } usb_core_instance;
  114. /*******************************************************************************
  115. Global function prototypes (definition in C source)
  116. ******************************************************************************/
  117. __STATIC_INLINE void usb_host_clrint(usb_core_instance *pdev, uint32_t ch_num, uint32_t intbit)
  118. {
  119. WRITE_REG32(pdev->regs.HC_REGS[ch_num]->HCINT, intbit);
  120. }
  121. __STATIC_INLINE void usb_host_int_mskchhltd(usb_core_instance *pdev, uint32_t ch_num)
  122. {
  123. CLR_REG32_BIT(pdev->regs.HC_REGS[ch_num]->HCINTMSK, USBFS_HCINTMSK_CHHM);
  124. }
  125. __STATIC_INLINE void usb_host_int_unmskchhltd(usb_core_instance *pdev, uint32_t ch_num)
  126. {
  127. SET_REG32_BIT(pdev->regs.HC_REGS[ch_num]->HCINTMSK, USBFS_HCINTMSK_CHHM);
  128. }
  129. __STATIC_INLINE void usb_host_int_mskack(usb_core_instance *pdev, uint32_t ch_num)
  130. {
  131. CLR_REG32_BIT(pdev->regs.HC_REGS[ch_num]->HCINTMSK, USBFS_HCINTMSK_ACKM);
  132. }
  133. __STATIC_INLINE void usb_host_int_unmskack(usb_core_instance *pdev, uint32_t ch_num)
  134. {
  135. SET_REG32_BIT(pdev->regs.HC_REGS[ch_num]->HCINTMSK, USBFS_HCINTMSK_ACKM);
  136. }
  137. #ifdef __cplusplus
  138. }
  139. #endif
  140. #endif /* __DRV_USBH_H__ */
  141. /*******************************************************************************
  142. * EOF (not truncated)
  143. ******************************************************************************/