1 /********************************** (C) COPYRIGHT *******************************
2  * File Name          : ch32v10x_usb.c
3  * Author             : WCH
4  * Version            : V1.0.0
5  * Date               : 2020/04/30
6  * Description        : This file provides all the USB firmware functions.
7  * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
8  * SPDX-License-Identifier: Apache-2.0
9  *******************************************************************************/
10 #include "ch32v10x_usb.h"
11 #include "ch32v10x_rcc.h"
12 #include "debug.h"
13 /******************************** USB DEVICE **********************************/
14 
15 /* Endpoint address */
16 PUINT8 pEP0_RAM_Addr;
17 PUINT8 pEP1_RAM_Addr;
18 PUINT8 pEP2_RAM_Addr;
19 PUINT8 pEP3_RAM_Addr;
20 PUINT8 pEP4_RAM_Addr;
21 PUINT8 pEP5_RAM_Addr;
22 PUINT8 pEP6_RAM_Addr;
23 PUINT8 pEP7_RAM_Addr;
24 
25 /*********************************************************************
26  * @fn      USB_DeviceInit
27  *
28  * @brief   Initializes USB device.
29  *
30  * @return  none
31  */
USB_DeviceInit(void)32 void USB_DeviceInit(void)
33 {
34     R8_USB_CTRL = 0x00;
35 
36     R8_UEP4_1_MOD = RB_UEP4_RX_EN | RB_UEP4_TX_EN | RB_UEP1_RX_EN | RB_UEP1_TX_EN;
37     R8_UEP2_3_MOD = RB_UEP2_RX_EN | RB_UEP2_TX_EN | RB_UEP3_RX_EN | RB_UEP3_TX_EN;
38     R8_UEP5_6_MOD = RB_UEP5_RX_EN | RB_UEP5_TX_EN | RB_UEP6_RX_EN | RB_UEP6_TX_EN;
39     R8_UEP7_MOD = RB_UEP7_RX_EN | RB_UEP7_TX_EN;
40 
41     R16_UEP0_DMA = (UINT16)(UINT32)pEP0_RAM_Addr;
42     R16_UEP1_DMA = (UINT16)(UINT32)pEP1_RAM_Addr;
43     R16_UEP2_DMA = (UINT16)(UINT32)pEP2_RAM_Addr;
44     R16_UEP3_DMA = (UINT16)(UINT32)pEP3_RAM_Addr;
45     R16_UEP4_DMA = (UINT16)(UINT32)pEP4_RAM_Addr;
46     R16_UEP5_DMA = (UINT16)(UINT32)pEP5_RAM_Addr;
47     R16_UEP6_DMA = (UINT16)(UINT32)pEP6_RAM_Addr;
48     R16_UEP7_DMA = (UINT16)(UINT32)pEP7_RAM_Addr;
49 
50     R8_UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
51     R8_UEP1_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
52     R8_UEP2_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
53     R8_UEP3_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
54     R8_UEP4_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
55     R8_UEP5_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
56     R8_UEP6_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
57     R8_UEP7_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
58 
59     R8_USB_INT_FG = 0xFF;
60     R8_USB_INT_EN = RB_UIE_SUSPEND | RB_UIE_BUS_RST | RB_UIE_TRANSFER;
61 
62     R8_USB_DEV_AD = 0x00;
63     R8_USB_CTRL = RB_UC_DEV_PU_EN | RB_UC_INT_BUSY | RB_UC_DMA_EN;
64     R8_UDEV_CTRL = RB_UD_PD_DIS | RB_UD_PORT_EN;
65 }
66 
67 /*********************************************************************
68  * @fn      DevEP1_IN_Deal
69  *
70  * @brief   Device endpoint1 IN
71  *
72  * @param   l: IN length(<64B)
73  *
74  * @return  none
75  */
DevEP1_IN_Deal(UINT8 l)76 void DevEP1_IN_Deal(UINT8 l)
77 {
78     R8_UEP1_T_LEN = l;
79     R8_UEP1_CTRL = (R8_UEP1_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
80 }
81 
82 /*********************************************************************
83  * @fn      DevEP2_IN_Deal
84  *
85  * @brief   Device endpoint2 IN
86  *
87  * @param   l: IN length(<64B)
88  *
89  * @return  none
90  */
DevEP2_IN_Deal(UINT8 l)91 void DevEP2_IN_Deal(UINT8 l)
92 {
93     R8_UEP2_T_LEN = l;
94     R8_UEP2_CTRL = (R8_UEP2_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
95 }
96 
97 /*********************************************************************
98  * @fn      DevEP3_IN_Deal
99  *
100  * @brief   Device endpoint3 IN
101  *
102  * @param   l: IN length(<64B)
103  *
104  * @return  none
105  */
DevEP3_IN_Deal(UINT8 l)106 void DevEP3_IN_Deal(UINT8 l)
107 {
108     R8_UEP3_T_LEN = l;
109     R8_UEP3_CTRL = (R8_UEP3_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
110 }
111 
112 /*********************************************************************
113  * @fn      DevEP4_IN_Deal
114  *
115  * @brief   Device endpoint4 IN
116  *
117  * @param   l: IN length(<64B)
118  *
119  * @return  none
120  */
DevEP4_IN_Deal(UINT8 l)121 void DevEP4_IN_Deal(UINT8 l)
122 {
123     R8_UEP4_T_LEN = l;
124     R8_UEP4_CTRL = (R8_UEP4_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
125 }
126 
127 /*********************************************************************
128  * @fn      DevEP5_IN_Deal
129  *
130  * @brief   Device endpoint5 IN
131  *
132  * @param   l: IN length(<64B)
133  *
134  * @return  none
135  */
DevEP5_IN_Deal(UINT8 l)136 void DevEP5_IN_Deal(UINT8 l)
137 {
138     R8_UEP5_T_LEN = l;
139     R8_UEP5_CTRL = (R8_UEP5_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
140 }
141 
142 /*********************************************************************
143  * @fn      DevEP6_IN_Deal
144  *
145  * @brief   Device endpoint6 IN
146  *
147  * @param   l: IN length(<64B)
148  *
149  * @return  none
150  */
DevEP6_IN_Deal(UINT8 l)151 void DevEP6_IN_Deal(UINT8 l)
152 {
153     R8_UEP6_T_LEN = l;
154     R8_UEP6_CTRL = (R8_UEP6_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
155 }
156 
157 /*********************************************************************
158  * @fn      DevEP7_IN_Deal
159  *
160  * @brief   Device endpoint7 IN
161  *
162  * @param   l: IN length(<64B)
163  *
164  * @return  none
165  */
DevEP7_IN_Deal(UINT8 l)166 void DevEP7_IN_Deal(UINT8 l)
167 {
168     R8_UEP7_T_LEN = l;
169     R8_UEP7_CTRL = (R8_UEP7_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
170 }
171