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