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