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)32void 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)76void 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)91void 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)106void 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)121void 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)136void 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)151void 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)166void 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