From 34511983a8294cf5211eab3c968b3d5c43b21267 Mon Sep 17 00:00:00 2001 From: Kizarm Date: Sat, 1 Feb 2025 21:38:31 +0100 Subject: [PATCH] F6P6 add usb device --- V203F6P6/ch32v203/system.cpp | 3 + V203F6P6/ch32v203/system.h | 1 + V203F6P6/ch32v203/usart.cpp | 14 +- V203F6P6/ch32v203/usbd/Makefile | 38 + V203F6P6/ch32v203/usbd/cdc_class.h | 23 + V203F6P6/ch32v203/usbd/inc/ch32v20x.h | 16 + V203F6P6/ch32v203/usbd/inc/core_riscv.h | 320 ++++++++ V203F6P6/ch32v203/usbd/inc/hw_config.h | 46 ++ V203F6P6/ch32v203/usbd/inc/usb_conf.h | 84 ++ V203F6P6/ch32v203/usbd/inc/usb_core.h | 191 +++++ V203F6P6/ch32v203/usbd/inc/usb_def.h | 82 ++ V203F6P6/ch32v203/usbd/inc/usb_init.h | 42 + V203F6P6/ch32v203/usbd/inc/usb_int.h | 25 + V203F6P6/ch32v203/usbd/inc/usb_istr.h | 82 ++ V203F6P6/ch32v203/usbd/inc/usb_lib.h | 30 + V203F6P6/ch32v203/usbd/inc/usb_mem.h | 36 + V203F6P6/ch32v203/usbd/inc/usb_prop.h | 66 ++ V203F6P6/ch32v203/usbd/inc/usb_pwr.h | 62 ++ V203F6P6/ch32v203/usbd/inc/usb_regs.h | 675 ++++++++++++++++ V203F6P6/ch32v203/usbd/inc/usb_sil.h | 36 + V203F6P6/ch32v203/usbd/inc/usb_type.h | 33 + V203F6P6/ch32v203/usbd/libusbd.a | Bin 0 -> 718700 bytes V203F6P6/ch32v203/usbd/src/cdc_class.cpp | 46 ++ V203F6P6/ch32v203/usbd/src/hw_config.cpp | 132 ++++ V203F6P6/ch32v203/usbd/src/usb_core.c | 954 +++++++++++++++++++++++ V203F6P6/ch32v203/usbd/src/usb_endp.cpp | 52 ++ V203F6P6/ch32v203/usbd/src/usb_init.c | 42 + V203F6P6/ch32v203/usbd/src/usb_int.c | 130 +++ V203F6P6/ch32v203/usbd/src/usb_istr.c | 196 +++++ V203F6P6/ch32v203/usbd/src/usb_mem.c | 74 ++ V203F6P6/ch32v203/usbd/src/usb_prop.cpp | 423 ++++++++++ V203F6P6/ch32v203/usbd/src/usb_pwr.c | 215 +++++ V203F6P6/ch32v203/usbd/src/usb_regs.c | 852 ++++++++++++++++++++ V203F6P6/ch32v203/usbd/src/usb_sil.c | 77 ++ V203F6P6/ch32v203/usbd/usb_desc.h | 80 ++ V203F6P6/common/ctrlinterface.h | 30 + V203F6P6/common/mirror.h | 60 ++ V203F6P6/common/usart.h | 9 +- V203F6P6/usart/Makefile | 6 +- V203F6P6/usart/main.cpp | 64 +- V203F6P6/usart/usb_desc.cpp | 80 ++ 41 files changed, 5376 insertions(+), 51 deletions(-) create mode 100644 V203F6P6/ch32v203/usbd/Makefile create mode 100644 V203F6P6/ch32v203/usbd/cdc_class.h create mode 100644 V203F6P6/ch32v203/usbd/inc/ch32v20x.h create mode 100644 V203F6P6/ch32v203/usbd/inc/core_riscv.h create mode 100644 V203F6P6/ch32v203/usbd/inc/hw_config.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_conf.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_core.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_def.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_init.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_int.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_istr.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_lib.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_mem.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_prop.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_pwr.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_regs.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_sil.h create mode 100644 V203F6P6/ch32v203/usbd/inc/usb_type.h create mode 100644 V203F6P6/ch32v203/usbd/libusbd.a create mode 100644 V203F6P6/ch32v203/usbd/src/cdc_class.cpp create mode 100644 V203F6P6/ch32v203/usbd/src/hw_config.cpp create mode 100644 V203F6P6/ch32v203/usbd/src/usb_core.c create mode 100644 V203F6P6/ch32v203/usbd/src/usb_endp.cpp create mode 100644 V203F6P6/ch32v203/usbd/src/usb_init.c create mode 100644 V203F6P6/ch32v203/usbd/src/usb_int.c create mode 100644 V203F6P6/ch32v203/usbd/src/usb_istr.c create mode 100644 V203F6P6/ch32v203/usbd/src/usb_mem.c create mode 100644 V203F6P6/ch32v203/usbd/src/usb_prop.cpp create mode 100644 V203F6P6/ch32v203/usbd/src/usb_pwr.c create mode 100644 V203F6P6/ch32v203/usbd/src/usb_regs.c create mode 100644 V203F6P6/ch32v203/usbd/src/usb_sil.c create mode 100644 V203F6P6/ch32v203/usbd/usb_desc.h create mode 100644 V203F6P6/common/ctrlinterface.h create mode 100644 V203F6P6/common/mirror.h create mode 100644 V203F6P6/usart/usb_desc.cpp diff --git a/V203F6P6/ch32v203/system.cpp b/V203F6P6/ch32v203/system.cpp index 68818bd..4ef464f 100644 --- a/V203F6P6/ch32v203/system.cpp +++ b/V203F6P6/ch32v203/system.cpp @@ -141,6 +141,9 @@ void delay_us (const unsigned dly) { while((SysTick.SR & (1u << 0)) != (1u << 0)); SysTick.CTLR.B.STE = RESET; } +void Delay_Ms (const unsigned dly) { + delay_us(1000 * dly); +} void set_timeout_us (const uint32_t time) { SysTick.CTLR.B.STE = RESET; timeout = false; diff --git a/V203F6P6/ch32v203/system.h b/V203F6P6/ch32v203/system.h index b44ccf1..3df1e0f 100644 --- a/V203F6P6/ch32v203/system.h +++ b/V203F6P6/ch32v203/system.h @@ -86,6 +86,7 @@ extern "C" { extern void SystemInit(void); extern void delay_init (); extern void delay_us (const unsigned dly); + extern void Delay_Ms (const unsigned dly); extern void set_timeout_us (const uint32_t time); extern bool is_timeout (); }; diff --git a/V203F6P6/ch32v203/usart.cpp b/V203F6P6/ch32v203/usart.cpp index 7595481..d477e9c 100644 --- a/V203F6P6/ch32v203/usart.cpp +++ b/V203F6P6/ch32v203/usart.cpp @@ -87,4 +87,16 @@ uint32_t Usart::Down(const char * data, const uint32_t len) { }); return n; } - +void Usart::setBaud (const uint32_t baud) { + USART2.CTLR1.B.UE = RESET; + const uint32_t tmp = HCLK / baud; + USART2.BRR.R = tmp; + USART2.CTLR1.B.UE = SET; +} +bool Usart::IOCtrl (const CTRL_TYPES_DEF type, const void * data, const uint32_t len) { + if (type == USB_USART_SET_PARAM) { + const USB_CDC_LineCoding * lc = reinterpret_cast(data); + setBaud (lc->baud); + } + return true; +} diff --git a/V203F6P6/ch32v203/usbd/Makefile b/V203F6P6/ch32v203/usbd/Makefile new file mode 100644 index 0000000..e80e844 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/Makefile @@ -0,0 +1,38 @@ +FLAGS = -c -ggdb -Os +CPU ?= -march=rv32imac -mabi=ilp32 +CROSS = riscv64-unknown-elf- +FLAGS+= $(CPU) +FLAGS+= -ffunction-sections -fdata-sections +FLAGS+= -mno-save-restore -fmessage-length=0 +FLAGS+= -I/usr/include/newlib -I. -I.. -I../../common -I./inc +AS = $(CROSS)as +CC = $(CROSS)gcc +CC += $(FLAGS) +CXX = $(CROSS)g++ +CXX += $(FLAGS) -fno-exceptions -fno-rtti +AR = $(CROSS)ar +VPATH = ./src + +OBJS = cdc_class.o +OBJS += hw_config.o usb_endp.o usb_istr.o usb_prop.o usb_pwr.o +OBJS += usb_core.o usb_init.o usb_int.o usb_mem.o usb_regs.o usb_sil.o + +DSTLIB = libusbd.a + +%.o: %.S + $(AS) $< -o $@ +%.o: %.c + $(CC) $< -o $@ +%.o: %.cpp + $(CXX) $< -o $@ + +$(DSTLIB): $(OBJS) + $(AR) rcs $(DSTLIB) $(OBJS) + + +.PHONY: all clean + +all: $(DSTLIB) + +clean: + -rm -f *.o diff --git a/V203F6P6/ch32v203/usbd/cdc_class.h b/V203F6P6/ch32v203/usbd/cdc_class.h new file mode 100644 index 0000000..40ac3fa --- /dev/null +++ b/V203F6P6/ch32v203/usbd/cdc_class.h @@ -0,0 +1,23 @@ +#ifndef CDC_CLASS_H +#define CDC_CLASS_H +#include "baselayer.h" +#include "ctrlinterface.h" +#include "fifo.h" + +class cdc_class : public BaseLayer { + CDC_CtrlInterface * ctrli; + volatile bool ep3Busy, Ready; + uint8_t rxbuffer [256]; +public: + explicit cdc_class (); + void attach (CDC_CtrlInterface & i) { ctrli = & i; } + void init (); + void ep2outHandler (); + void ep3inHandler (); + void ctrl (const CTRL_TYPES_DEF type, const void * data, const uint32_t len); + uint32_t Down (const char * data, const uint32_t len) override; +protected: +}; +extern cdc_class * cdc_instance; + +#endif // CDC_CLASS_H diff --git a/V203F6P6/ch32v203/usbd/inc/ch32v20x.h b/V203F6P6/ch32v203/usbd/inc/ch32v20x.h new file mode 100644 index 0000000..c64b103 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/ch32v20x.h @@ -0,0 +1,16 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x.h + * Author : WCH + * Version : V1.0.0 + * Date : 2024/01/31 + * Description : CH32V20x Device Peripheral Access Layer Header File. + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ +#ifndef __CH32V20x_H +#define __CH32V20x_H +/* Tady pouze, protože je to použito v usb hlavičkách */ +#include "core_riscv.h" +#endif diff --git a/V203F6P6/ch32v203/usbd/inc/core_riscv.h b/V203F6P6/ch32v203/usbd/inc/core_riscv.h new file mode 100644 index 0000000..6cda3d0 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/core_riscv.h @@ -0,0 +1,320 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : core_riscv.h + * Author : WCH + * Version : V1.0.1 + * Date : 2023/11/11 + * Description : RISC-V V4 Core Peripheral Access Layer Header File for CH32V20x +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CORE_RISCV_H__ +#define __CORE_RISCV_H__ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* IO definitions */ +#ifdef __cplusplus + #define __I volatile /* defines 'read only' permissions */ +#else + #define __I volatile const /* defines 'read only' permissions */ +#endif +#define __O volatile /* defines 'write only' permissions */ +#define __IO volatile /* defines 'read / write' permissions */ + +/* Standard Peripheral Library old types (maintained for legacy purpose) */ +typedef __I uint64_t vuc64; /* Read Only */ +typedef __I uint32_t vuc32; /* Read Only */ +typedef __I uint16_t vuc16; /* Read Only */ +typedef __I uint8_t vuc8; /* Read Only */ + +typedef const uint64_t uc64; /* Read Only */ +typedef const uint32_t uc32; /* Read Only */ +typedef const uint16_t uc16; /* Read Only */ +typedef const uint8_t uc8; /* Read Only */ + +typedef __I int64_t vsc64; /* Read Only */ +typedef __I int32_t vsc32; /* Read Only */ +typedef __I int16_t vsc16; /* Read Only */ +typedef __I int8_t vsc8; /* Read Only */ + +typedef const int64_t sc64; /* Read Only */ +typedef const int32_t sc32; /* Read Only */ +typedef const int16_t sc16; /* Read Only */ +typedef const int8_t sc8; /* Read Only */ + +typedef __IO uint64_t vu64; +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +typedef uint64_t u64; +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef __IO int64_t vs64; +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef int64_t s64; +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +#define RV_STATIC_INLINE static inline + +typedef enum {NoREADY = 0, READY = !NoREADY} ErrorStatus; + +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; +/********************************************************************* + * @fn __enable_irq + * + * @brief Enable Global Interrupt + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __enable_irq() +{ + __asm volatile ("csrs 0x800, %0" : : "r" (0x88) ); +} + +/********************************************************************* + * @fn __disable_irq + * + * @brief Disable Global Interrupt + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __disable_irq() +{ + __asm volatile ("csrc 0x800, %0" : : "r" (0x88) ); +} + +/********************************************************************* + * @fn __NOP + * + * @brief nop + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __NOP() +{ + __asm volatile ("nop"); +} + +/********************************************************************* + * @fn __AMOADD_W + * + * @brief Atomic Add with 32bit value + * Atomically ADD 32bit value with value in memory using amoadd.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be ADDed + * + * @return return memory value + add value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOADD_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amoadd.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOAND_W + * + * @brief Atomic And with 32bit value + * Atomically AND 32bit value with value in memory using amoand.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be ANDed + * + * @return return memory value & and value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOAND_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amoand.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOMAX_W + * + * @brief Atomic signed MAX with 32bit value + * Atomically signed max compare 32bit value with value in memory using amomax.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be compared + * + * @return the bigger value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOMAX_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amomax.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOMAXU_W + * + * @brief Atomic unsigned MAX with 32bit value + * Atomically unsigned max compare 32bit value with value in memory using amomaxu.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be compared + * + * @return return the bigger value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t __AMOMAXU_W(volatile uint32_t *addr, uint32_t value) +{ + uint32_t result; + + __asm volatile ("amomaxu.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOMIN_W + * + * @brief Atomic signed MIN with 32bit value + * Atomically signed min compare 32bit value with value in memory using amomin.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be compared + * + * @return the smaller value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOMIN_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amomin.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOMINU_W + * + * @brief Atomic unsigned MIN with 32bit value + * Atomically unsigned min compare 32bit value with value in memory using amominu.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be compared + * + * @return the smaller value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t __AMOMINU_W(volatile uint32_t *addr, uint32_t value) +{ + uint32_t result; + + __asm volatile ("amominu.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOOR_W + * + * @brief Atomic OR with 32bit value + * Atomically OR 32bit value with value in memory using amoor.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be ORed + * + * @return return memory value | and value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOOR_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amoor.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOSWAP_W + * + * @brief Atomically swap new 32bit value into memory using amoswap.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * newval - New value to be stored into the address + * + * @return return the original value in memory + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t __AMOSWAP_W(volatile uint32_t *addr, uint32_t newval) +{ + uint32_t result; + + __asm volatile ("amoswap.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(newval) : "memory"); + return result; +} + +/********************************************************************* + * @fn __AMOXOR_W + * + * @brief Atomic XOR with 32bit value + * Atomically XOR 32bit value with value in memory using amoxor.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be XORed + * + * @return return memory value ^ and value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOXOR_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amoxor.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/* Core_Exported_Functions */ +extern uint32_t __get_MSTATUS(void); +extern void __set_MSTATUS(uint32_t value); +extern uint32_t __get_MISA(void); +extern void __set_MISA(uint32_t value); +extern uint32_t __get_MTVEC(void); +extern void __set_MTVEC(uint32_t value); +extern uint32_t __get_MSCRATCH(void); +extern void __set_MSCRATCH(uint32_t value); +extern uint32_t __get_MEPC(void); +extern void __set_MEPC(uint32_t value); +extern uint32_t __get_MCAUSE(void); +extern void __set_MCAUSE(uint32_t value); +extern uint32_t __get_MTVAL(void); +extern void __set_MTVAL(uint32_t value); +extern uint32_t __get_MVENDORID(void); +extern uint32_t __get_MARCHID(void); +extern uint32_t __get_MIMPID(void); +extern uint32_t __get_MHARTID(void); +extern uint32_t __get_SP(void); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/hw_config.h b/V203F6P6/ch32v203/usbd/inc/hw_config.h new file mode 100644 index 0000000..aaa1eb4 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/hw_config.h @@ -0,0 +1,46 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : hw_config.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Configuration file for USB. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __HW_CONFIG_H +#define __HW_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif //__cplusplus + +#include "core_riscv.h" +#include "usb_type.h" + +#ifdef DEBUG +#define printf_usb(X...) printf(X) +#else +#define printf_usb(X...) +#endif + +void DeviceInit(); +void Set_USBConfig(void); +void Enter_LowPowerMode(void); +void Leave_LowPowerMode(void); +void USB_Interrupts_Config(void); +void USB_Port_Set(FunctionalState NewState, FunctionalState Pin_In_IPU); + +#ifdef __cplusplus +}; +#endif //__cplusplus +#endif /* __HW_CONFIG_H */ + + + + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_conf.h b/V203F6P6/ch32v203/usbd/inc/usb_conf.h new file mode 100644 index 0000000..6772432 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_conf.h @@ -0,0 +1,84 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_conf.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : This file contains all the functions prototypes for the + * USB configration firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_CONF_H +#define __USB_CONF_H +#ifdef __cplusplus +extern "C" { +#endif //__cplusplus + + +#define EP_NUM (15) + +/* Buffer Description Table */ +/* buffer table base address */ +/* buffer table base address */ +#define BTABLE_ADDRESS (0x00) + +/* EP0 */ +/* rx/tx buffer base address */ +#define ENDP0_RXADDR (0x40) +#define ENDP0_TXADDR (0x80) + +/* EP1 */ +/* tx buffer base address */ +#define ENDP1_TXADDR (0xC0) +#define ENDP2_RXADDR (ENDP1_TXADDR + 0x40) +#define ENDP3_TXADDR (ENDP2_RXADDR + 0x40) + + +/* ISTR events */ +/* IMR_MSK */ +/* mask defining which events has to be handled */ +/* by the device application software */ +#define IMR_MSK (CNTR_CTRM | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM | CNTR_SOFM \ + | CNTR_ESOFM | CNTR_RESETM ) + +/* #define CTR_CALLBACK */ +/* #define DOVR_CALLBACK */ +/* #define ERR_CALLBACK */ +/* #define WKUP_CALLBACK */ +/* #define SUSP_CALLBACK */ +/* #define RESET_CALLBAC K*/ +/* #define SOF_CALLBACK */ +/* #define ESOF_CALLBACK */ + + +/* CTR service routines */ +/* associated to defined endpoints */ +// #define EP1_IN_Callback NOP_Process +#define EP2_IN_Callback NOP_Process +// #define EP3_IN_Callback NOP_Process +#define EP4_IN_Callback NOP_Process +#define EP5_IN_Callback NOP_Process +#define EP6_IN_Callback NOP_Process +#define EP7_IN_Callback NOP_Process + +#define EP1_OUT_Callback NOP_Process +// #define EP2_OUT_Callback NOP_Process +#define EP3_OUT_Callback NOP_Process +#define EP4_OUT_Callback NOP_Process +#define EP5_OUT_Callback NOP_Process +#define EP6_OUT_Callback NOP_Process +#define EP7_OUT_Callback NOP_Process + +#ifdef __cplusplus +}; +#endif //__cplusplus + +#endif /* __USB_CONF_H */ + + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_core.h b/V203F6P6/ch32v203/usbd/inc/usb_core.h new file mode 100644 index 0000000..f4f2036 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_core.h @@ -0,0 +1,191 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_core.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : This file contains all the functions prototypes for the + * USB cor firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_CORE_H +#define __USB_CORE_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v20x.h" + + +typedef enum _CONTROL_STATE +{ + WAIT_SETUP, /* 0 */ + SETTING_UP, /* 1 */ + IN_DATA, /* 2 */ + OUT_DATA, /* 3 */ + LAST_IN_DATA, /* 4 */ + LAST_OUT_DATA, /* 5 */ + WAIT_STATUS_IN, /* 7 */ + WAIT_STATUS_OUT, /* 8 */ + STALLED, /* 9 */ + PAUSE /* 10 */ +} CONTROL_STATE; /* The state machine states of a control pipe */ + +typedef struct OneDescriptor +{ + uint8_t *Descriptor; + uint16_t Descriptor_Size; +} +ONE_DESCRIPTOR, *PONE_DESCRIPTOR; + +typedef enum _RESULT +{ + USB_SUCCESS = 0, /* Process successfully */ + USB_ERROR, + USB_UNSUPPORT, + USB_NOT_READY /* The process has not been finished, endpoint will be + NAK to further request */ +} RESULT; + + +/* Definitions for endpoint level */ +typedef struct _ENDPOINT_INFO +{ + uint16_t Usb_wLength; + uint16_t Usb_wOffset; + uint16_t PacketSize; + uint8_t *(*CopyData)(uint16_t Length); +}ENDPOINT_INFO; + +/* Definitions for device level */ +typedef struct _DEVICE +{ + uint8_t Total_Endpoint; /* Number of endpoints that are used */ + uint8_t Total_Configuration;/* Number of configuration available */ +} +DEVICE; + +typedef union +{ + uint16_t w; + struct BW + { + uint8_t bb1; + uint8_t bb0; + } + bw; +} uint16_t_uint8_t; + +typedef struct _DEVICE_INFO +{ + uint8_t USBbmRequestType; /* bmRequestType */ + uint8_t USBbRequest; /* bRequest */ + uint16_t_uint8_t USBwValues; /* wValue */ + uint16_t_uint8_t USBwIndexs; /* wIndex */ + uint16_t_uint8_t USBwLengths; /* wLength */ + + uint8_t ControlState; /* of type CONTROL_STATE */ + uint8_t Current_Feature; + uint8_t Current_Configuration; /* Selected configuration */ + uint8_t Current_Interface; /* Selected interface of current configuration */ + uint8_t Current_AlternateSetting;/* Selected Alternate Setting of current + interface*/ + + ENDPOINT_INFO Ctrl_Info; +}DEVICE_INFO; + +typedef struct _DEVICE_PROP +{ + void (*Init)(void); /* Initialize the device */ + void (*Reset)(void); /* Reset routine of this device */ + void (*Process_Status_IN)(void); + void (*Process_Status_OUT)(void); + + RESULT (*Class_Data_Setup)(uint8_t RequestNo); + + RESULT (*Class_NoData_Setup)(uint8_t RequestNo); + + RESULT (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting); + + uint8_t* (*GetDeviceDescriptor)(uint16_t Length); + uint8_t* (*GetConfigDescriptor)(uint16_t Length); + uint8_t* (*GetStringDescriptor)(uint16_t Length); + + void* RxEP_buffer; + + uint8_t MaxPacketSize; + +}DEVICE_PROP; + +typedef struct _USER_STANDARD_REQUESTS +{ + void (*User_GetConfiguration)(void); /* Get Configuration */ + void (*User_SetConfiguration)(void); /* Set Configuration */ + void (*User_GetInterface)(void); /* Get Interface */ + void (*User_SetInterface)(void); /* Set Interface */ + void (*User_GetStatus)(void); /* Get Status */ + void (*User_ClearFeature)(void); /* Clear Feature */ + void (*User_SetEndPointFeature)(void); /* Set Endpoint Feature */ + void (*User_SetDeviceFeature)(void); /* Set Device Feature */ + void (*User_SetDeviceAddress)(void); /* Set Device Address */ +} +USER_STANDARD_REQUESTS; + + +#define Type_Recipient (pInformation->USBbmRequestType & (REQUEST_TYPE | RECIPIENT)) + +#define Usb_rLength Usb_wLength +#define Usb_rOffset Usb_wOffset + +#define USBwValue USBwValues.w +#define USBwValue0 USBwValues.bw.bb0 +#define USBwValue1 USBwValues.bw.bb1 +#define USBwIndex USBwIndexs.w +#define USBwIndex0 USBwIndexs.bw.bb0 +#define USBwIndex1 USBwIndexs.bw.bb1 +#define USBwLength USBwLengths.w +#define USBwLength0 USBwLengths.bw.bb0 +#define USBwLength1 USBwLengths.bw.bb1 + + +uint8_t Setup0_Process(void); +uint8_t Post0_Process(void); +uint8_t Out0_Process(void); +uint8_t In0_Process(void); + +RESULT Standard_SetEndPointFeature(void); +RESULT Standard_SetDeviceFeature(void); + +uint8_t *Standard_GetConfiguration(uint16_t Length); +RESULT Standard_SetConfiguration(void); +uint8_t *Standard_GetInterface(uint16_t Length); +RESULT Standard_SetInterface(void); +uint8_t *Standard_GetDescriptorData(uint16_t Length, PONE_DESCRIPTOR pDesc); + +uint8_t *Standard_GetStatus(uint16_t Length); +RESULT Standard_ClearFeature(void); +void SetDeviceAddress(uint8_t); +void NOP_Process(void); + +extern DEVICE_PROP Device_Property; +extern USER_STANDARD_REQUESTS User_Standard_Requests; +extern DEVICE Device_Table; +extern DEVICE_INFO Device_Info; + +/* cells saving status during interrupt servicing */ +extern __IO uint16_t SaveRState; +extern __IO uint16_t SaveTState; + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_CORE_H */ + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_def.h b/V203F6P6/ch32v203/usbd/inc/usb_def.h new file mode 100644 index 0000000..702ca61 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_def.h @@ -0,0 +1,82 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_def.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : This file contains all the functions prototypes for the + * USB definition firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_DEF_H +#define __USB_DEF_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v20x.h" + +typedef enum _RECIPIENT_TYPE +{ + DEVICE_RECIPIENT, + INTERFACE_RECIPIENT, + ENDPOINT_RECIPIENT, + OTHER_RECIPIENT +} RECIPIENT_TYPE; + +typedef enum _STANDARD_REQUESTS +{ + GET_STATUS = 0, + CLEAR_FEATURE, + RESERVED1, + SET_FEATURE, + RESERVED2, + SET_ADDRESS, + GET_DESCRIPTOR, + SET_DESCRIPTOR, + GET_CONFIGURATION, + SET_CONFIGURATION, + GET_INTERFACE, + SET_INTERFACE, + TOTAL_sREQUEST, + SYNCH_FRAME = 12 +} STANDARD_REQUESTS; + +/* Definition of "USBwValue" */ +typedef enum _DESCRIPTOR_TYPE +{ + DEVICE_DESCRIPTOR = 1, + CONFIG_DESCRIPTOR, + STRING_DESCRIPTOR, + INTERFACE_DESCRIPTOR, + ENDPOINT_DESCRIPTOR +} DESCRIPTOR_TYPE; + +/* Feature selector of a SET_FEATURE or CLEAR_FEATURE */ +typedef enum _FEATURE_SELECTOR +{ + ENDPOINT_STALL, + DEVICE_REMOTE_WAKEUP +} FEATURE_SELECTOR; + +/* Definition of "USBbmRequestType" */ +#define REQUEST_TYPE 0x60 +#define STANDARD_REQUEST 0x00 +#define CLASS_REQUEST 0x20 +#define VENDOR_REQUEST 0x40 +#define RECIPIENT 0x1F + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_DEF_H */ + + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_init.h b/V203F6P6/ch32v203/usbd/inc/usb_init.h new file mode 100644 index 0000000..f282407 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_init.h @@ -0,0 +1,42 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_init.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : This file contains all the functions prototypes for the + * USB Initialization firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_INIT_H +#define __USB_INIT_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v20x.h" + + +void USB_Init(void); +extern uint8_t EPindex; +extern DEVICE_INFO* pInformation; +extern DEVICE_PROP* pProperty; +extern USER_STANDARD_REQUESTS *pUser_Standard_Requests; +extern uint16_t SaveState ; +extern uint16_t wInterrupt_Mask; + +#ifdef __cplusplus +} + +#endif + + +#endif /* __USB_INIT_H */ + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_int.h b/V203F6P6/ch32v203/usbd/inc/usb_int.h new file mode 100644 index 0000000..7599d61 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_int.h @@ -0,0 +1,25 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_int.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : This file contains all the functions prototypes for the + * USB Endpoint firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_INT_H +#define __USB_INT_H +#ifdef __cplusplus + extern "C" { +#endif + +void CTR_LP(void); +void CTR_HP(void); +#ifdef __cplusplus +}; +#endif + +#endif /* __USB_INT_H */ diff --git a/V203F6P6/ch32v203/usbd/inc/usb_istr.h b/V203F6P6/ch32v203/usbd/inc/usb_istr.h new file mode 100644 index 0000000..e64a2a8 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_istr.h @@ -0,0 +1,82 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_istr.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : This file includes the peripherals header files in the + * user application. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_ISTR_H +#define __USB_ISTR_H + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus +#include "usb_conf.h" + +void USB_Istr(void); +void EP1_IN_Callback(void); +void EP2_IN_Callback(void); +void EP3_IN_Callback(void); +void EP4_IN_Callback(void); +void EP5_IN_Callback(void); +void EP6_IN_Callback(void); +void EP7_IN_Callback(void); + +void EP1_OUT_Callback(void); +void EP2_OUT_Callback(void); +void EP3_OUT_Callback(void); +void EP4_OUT_Callback(void); +void EP5_OUT_Callback(void); +void EP6_OUT_Callback(void); +void EP7_OUT_Callback(void); + +#ifdef CTR_CALLBACK +void CTR_Callback(void); +#endif + +#ifdef DOVR_CALLBACK +void DOVR_Callback(void); +#endif + +#ifdef ERR_CALLBACK +void ERR_Callback(void); +#endif + +#ifdef WKUP_CALLBACK +void WKUP_Callback(void); +#endif + +#ifdef SUSP_CALLBACK +void SUSP_Callback(void); +#endif + +#ifdef RESET_CALLBACK +void RESET_Callback(void); +#endif + +#ifdef SOF_CALLBACK +void SOF_Callback(void); +#endif + +#ifdef ESOF_CALLBACK +void ESOF_Callback(void); +#endif + +#ifdef __cplusplus +}; +#endif // __cplusplus + +#endif /*__USB_ISTR_H*/ + + + + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_lib.h b/V203F6P6/ch32v203/usbd/inc/usb_lib.h new file mode 100644 index 0000000..f633a1f --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_lib.h @@ -0,0 +1,30 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_lib.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Library configuration file for USB. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_LIB_H +#define __USB_LIB_H + +#include "hw_config.h" +#include "usb_type.h" +#include "usb_regs.h" +#include "usb_def.h" +#include "usb_core.h" +#include "usb_init.h" +#include "usb_sil.h" +#include "usb_mem.h" +#include "usb_int.h" +//#include "ch32f20x_usb.h" + +#endif /* __USB_LIB_H */ + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_mem.h b/V203F6P6/ch32v203/usbd/inc/usb_mem.h new file mode 100644 index 0000000..879fded --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_mem.h @@ -0,0 +1,36 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_mem.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : This file contains all the functions prototypes for the + * USB Initialization firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_MEM_H +#define __USB_MEM_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v20x.h" + +void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); +void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); + + +#ifdef __cplusplus +} +#endif + +#endif /*__USB_MEM_H*/ + + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_prop.h b/V203F6P6/ch32v203/usbd/inc/usb_prop.h new file mode 100644 index 0000000..b0c695c --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_prop.h @@ -0,0 +1,66 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_prop.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : All processing related to Virtual COM Port Demo (Endpoint 0) +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __usb_prop_H +#define __usb_prop_H + +#ifdef __cplusplus + extern "C" { +#endif + +//#include "ch32v20x.h" +#include "usb_core.h" + +#define CDC_GET_LINE_CODING 0x21 /* This request allows the host to find out the currently configured line coding */ +#define CDC_SET_LINE_CODING 0x20 /* Configures DTE rate, stop-bits, parity, and number-of-character */ +#define CDC_SET_LINE_CTLSTE 0x22 /* This request generates RS-232/V.24 style control signals */ +#define CDC_SEND_BREAK 0x23 + + +#define USBD_GetConfiguration NOP_Process +// #define USBD_SetConfiguration NOP_Process +#define USBD_GetInterface NOP_Process +#define USBD_SetInterface NOP_Process +#define USBD_GetStatus NOP_Process +// #define USBD_ClearFeature NOP_Process +#define USBD_SetEndPointFeature NOP_Process +// #define USBD_SetDeviceFeature NOP_Process +// #define USBD_SetDeviceAddress NOP_Process + + + +void USBD_init(void); +void USBD_Reset(void); +void USBD_SetConfiguration(void); +void USBD_SetDeviceAddress (void); +void USBD_SetDeviceFeature (void); +void USBD_ClearFeature (void); +void USBD_Status_In (void); +void USBD_Status_Out (void); +RESULT USBD_Data_Setup(uint8_t); +RESULT USBD_NoData_Setup(uint8_t); +RESULT USBD_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting); +uint8_t *USBD_GetDeviceDescriptor(uint16_t ); +uint8_t *USBD_GetConfigDescriptor(uint16_t); +uint8_t *USBD_GetStringDescriptor(uint16_t); +uint8_t USBD_ENDPx_DataUp( uint8_t endp, uint8_t *pbuf, uint16_t len ); +#ifdef __cplusplus +} +#endif + +#endif /* __usb_prop_H */ + + + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_pwr.h b/V203F6P6/ch32v203/usbd/inc/usb_pwr.h new file mode 100644 index 0000000..ce80fa2 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_pwr.h @@ -0,0 +1,62 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_pwr.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Connection/disconnection & power management header +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_PWR_H +#define __USB_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v20x.h" +typedef enum _RESUME_STATE +{ + RESUME_EXTERNAL, + RESUME_INTERNAL, + RESUME_LATER, + RESUME_WAIT, + RESUME_START, + RESUME_ON, + RESUME_OFF, + RESUME_ESOF +} RESUME_STATE; + +typedef enum _DEVICE_STATE +{ + UNCONNECTED, + ATTACHED, + POWERED, + SUSPENDED, + ADDRESSED, + CONFIGURED +} DEVICE_STATE; + + +void Suspend(void); +void Resume_Init(void); +void Resume(RESUME_STATE eResumeSetVal); +RESULT PowerOn(void); +RESULT PowerOff(void); + +extern __IO uint32_t bDeviceState; /* USB device status */ +extern __IO bool fSuspendEnabled; /* true when suspend is possible */ + +#ifdef __cplusplus +} +#endif + +#endif /*__USB_PWR_H*/ + + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_regs.h b/V203F6P6/ch32v203/usbd/inc/usb_regs.h new file mode 100644 index 0000000..46a041b --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_regs.h @@ -0,0 +1,675 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_regs.h + * Author : WCH + * Version : V1.0.1 + * Date : 2022/12/28 + * Description : This file contains all the functions prototypes for the + * USB cell registers firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_REGS_H +#define __USB_REGS_H + +#ifdef __cplusplus + extern "C" { +#endif + +//#include "ch32v20x.h" + +typedef enum _EP_DBUF_DIR +{ + EP_DBUF_ERR, + EP_DBUF_OUT, + EP_DBUF_IN +}EP_DBUF_DIR; + +/* endpoint buffer number */ +enum EP_BUF_NUM +{ + EP_NOBUF, + EP_BUF0, + EP_BUF1 +}; + +extern uint16_t Ep0RxBlks; + +#define RegBase (0x40005C00L) +#define PMAAddr (0x40006000L) + +/******************************************************************************/ +/* General registers */ +/******************************************************************************/ + +/* Control register */ +#define CNTLR ((__IO unsigned *)(RegBase + 0x40)) +/* Interrupt status register */ +#define ISTR ((__IO unsigned *)(RegBase + 0x44)) +/* Frame number register */ +#define FNR ((__IO unsigned *)(RegBase + 0x48)) +/* Device address register */ +#define DADDR ((__IO unsigned *)(RegBase + 0x4C)) +/* Buffer Table address register */ +#define BTABLE ((__IO unsigned *)(RegBase + 0x50)) +/******************************************************************************/ +/* Endpoint registers */ +/******************************************************************************/ +#define EP0REG ((__IO unsigned *)(RegBase)) /* endpoint 0 register address */ + +/* Endpoint Addresses (w/direction) */ +#define EP0_OUT ((uint8_t)0x00) +#define EP0_IN ((uint8_t)0x80) +#define EP1_OUT ((uint8_t)0x01) +#define EP1_IN ((uint8_t)0x81) +#define EP2_OUT ((uint8_t)0x02) +#define EP2_IN ((uint8_t)0x82) +#define EP3_OUT ((uint8_t)0x03) +#define EP3_IN ((uint8_t)0x83) +#define EP4_OUT ((uint8_t)0x04) +#define EP4_IN ((uint8_t)0x84) +#define EP5_OUT ((uint8_t)0x05) +#define EP5_IN ((uint8_t)0x85) +#define EP6_OUT ((uint8_t)0x06) +#define EP6_IN ((uint8_t)0x86) +#define EP7_OUT ((uint8_t)0x07) +#define EP7_IN ((uint8_t)0x87) + +/* endpoints enumeration */ +#define ENDP0 ((uint8_t)0) +#define ENDP1 ((uint8_t)1) +#define ENDP2 ((uint8_t)2) +#define ENDP3 ((uint8_t)3) +#define ENDP4 ((uint8_t)4) +#define ENDP5 ((uint8_t)5) +#define ENDP6 ((uint8_t)6) +#define ENDP7 ((uint8_t)7) + +/******************************************************************************/ +/* ISTR interrupt events */ +/******************************************************************************/ +#define ISTR_CTR (0x8000) /* Correct TRansfer (clear-only bit) */ +#define ISTR_DOVR (0x4000) /* DMA OVeR/underrun (clear-only bit) */ +#define ISTR_ERR (0x2000) /* ERRor (clear-only bit) */ +#define ISTR_WKUP (0x1000) /* WaKe UP (clear-only bit) */ +#define ISTR_SUSP (0x0800) /* SUSPend (clear-only bit) */ +#define ISTR_RESET (0x0400) /* RESET (clear-only bit) */ +#define ISTR_SOF (0x0200) /* Start Of Frame (clear-only bit) */ +#define ISTR_ESOF (0x0100) /* Expected Start Of Frame (clear-only bit) */ + + +#define ISTR_DIR (0x0010) /* DIRection of transaction (read-only bit) */ +#define ISTR_EP_ID (0x000F) /* EndPoint IDentifier (read-only bit) */ + +#define CLR_CTR (~ISTR_CTR) /* clear Correct TRansfer bit */ +#define CLR_DOVR (~ISTR_DOVR) /* clear DMA OVeR/underrun bit*/ +#define CLR_ERR (~ISTR_ERR) /* clear ERRor bit */ +#define CLR_WKUP (~ISTR_WKUP) /* clear WaKe UP bit */ +#define CLR_SUSP (~ISTR_SUSP) /* clear SUSPend bit */ +#define CLR_RESET (~ISTR_RESET) /* clear RESET bit */ +#define CLR_SOF (~ISTR_SOF) /* clear Start Of Frame bit */ +#define CLR_ESOF (~ISTR_ESOF) /* clear Expected Start Of Frame bit */ + +/******************************************************************************/ +/* CNTR control register bits definitions */ +/******************************************************************************/ +#define CNTR_CTRM (0x8000) /* Correct TRansfer Mask */ +#define CNTR_DOVRM (0x4000) /* DMA OVeR/underrun Mask */ +#define CNTR_ERRM (0x2000) /* ERRor Mask */ +#define CNTR_WKUPM (0x1000) /* WaKe UP Mask */ +#define CNTR_SUSPM (0x0800) /* SUSPend Mask */ +#define CNTR_RESETM (0x0400) /* RESET Mask */ +#define CNTR_SOFM (0x0200) /* Start Of Frame Mask */ +#define CNTR_ESOFM (0x0100) /* Expected Start Of Frame Mask */ + + +#define CNTR_RESUME (0x0010) /* RESUME request */ +#define CNTR_FSUSP (0x0008) /* Force SUSPend */ +#define CNTR_LPMODE (0x0004) /* Low-power MODE */ +#define CNTR_PDWN (0x0002) /* Power DoWN */ +#define CNTR_FRES (0x0001) /* Force USB RESet */ + +/******************************************************************************/ +/* FNR Frame Number Register bit definitions */ +/******************************************************************************/ +#define FNR_RXDP (0x8000) /* status of D+ data line */ +#define FNR_RXDM (0x4000) /* status of D- data line */ +#define FNR_LCK (0x2000) /* LoCKed */ +#define FNR_LSOF (0x1800) /* Lost SOF */ +#define FNR_FN (0x07FF) /* Frame Number */ +/******************************************************************************/ +/* DADDR Device ADDRess bit definitions */ +/******************************************************************************/ +#define DADDR_EF (0x80) +#define DADDR_ADD (0x7F) +/******************************************************************************/ +/* Endpoint register */ +/******************************************************************************/ +/* bit positions */ +#define EP_CTR_RX (0x8000) /* EndPoint Correct TRansfer RX */ +#define EP_DTOG_RX (0x4000) /* EndPoint Data TOGGLE RX */ +#define EPRX_STAT (0x3000) /* EndPoint RX STATus bit field */ +#define EP_SETUP (0x0800) /* EndPoint SETUP */ +#define EP_T_FIELD (0x0600) /* EndPoint TYPE */ +#define EP_KIND (0x0100) /* EndPoint KIND */ +#define EP_CTR_TX (0x0080) /* EndPoint Correct TRansfer TX */ +#define EP_DTOG_TX (0x0040) /* EndPoint Data TOGGLE TX */ +#define EPTX_STAT (0x0030) /* EndPoint TX STATus bit field */ +#define EPADDR_FIELD (0x000F) /* EndPoint ADDRess FIELD */ + +/* EndPoint REGister MASK (no toggle fields) */ +#define EPREG_MASK (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD) + +/* EP_TYPE[1:0] EndPoint TYPE */ +#define EP_TYPE_MASK (0x0600) /* EndPoint TYPE Mask */ +#define EP_BULK (0x0000) /* EndPoint BULK */ +#define EP_CONTROL (0x0200) /* EndPoint CONTROL */ +#define EP_ISOCHRONOUS (0x0400) /* EndPoint ISOCHRONOUS */ +#define EP_INTERRUPT (0x0600) /* EndPoint INTERRUPT */ +#define EP_T_MASK (~EP_T_FIELD & EPREG_MASK) + + +/* EP_KIND EndPoint KIND */ +#define EPKIND_MASK (~EP_KIND & EPREG_MASK) + +/* STAT_TX[1:0] STATus for TX transfer */ +#define EP_TX_DIS (0x0000) /* EndPoint TX DISabled */ +#define EP_TX_STALL (0x0010) /* EndPoint TX STALLed */ +#define EP_TX_NAK (0x0020) /* EndPoint TX NAKed */ +#define EP_TX_VALID (0x0030) /* EndPoint TX VALID */ +#define EPTX_DTOG1 (0x0010) /* EndPoint TX Data TOGgle bit1 */ +#define EPTX_DTOG2 (0x0020) /* EndPoint TX Data TOGgle bit2 */ +#define EPTX_DTOGMASK (EPTX_STAT|EPREG_MASK) + +/* STAT_RX[1:0] STATus for RX transfer */ +#define EP_RX_DIS (0x0000) /* EndPoint RX DISabled */ +#define EP_RX_STALL (0x1000) /* EndPoint RX STALLed */ +#define EP_RX_NAK (0x2000) /* EndPoint RX NAKed */ +#define EP_RX_VALID (0x3000) /* EndPoint RX VALID */ +#define EPRX_DTOG1 (0x1000) /* EndPoint RX Data TOGgle bit1 */ +#define EPRX_DTOG2 (0x2000) /* EndPoint RX Data TOGgle bit1 */ +#define EPRX_DTOGMASK (EPRX_STAT|EPREG_MASK) + +/* SetCNTR */ +#define _SetCNTR(wRegValue) (*CNTLR = (uint16_t)wRegValue) + +/* SetISTR */ +#define _SetISTR(wRegValue) (*ISTR = (uint16_t)wRegValue) + +/* SetDADDR */ +#define _SetDADDR(wRegValue) (*DADDR = (uint16_t)wRegValue) + +/* SetBTABLE */ +#define _SetBTABLE(wRegValue)(*BTABLE = (uint16_t)(wRegValue & 0xFFF8)) + +/* GetCNTR */ +#define _GetCNTR() ((uint16_t) *CNTLR) + +/* GetISTR */ +#define _GetISTR() ((uint16_t) *ISTR) + +/* GetFNR */ +#define _GetFNR() ((uint16_t) *FNR) + +/* GetDADDR */ +#define _GetDADDR() ((uint16_t) *DADDR) + +/* GetBTABLE */ +#define _GetBTABLE() ((uint16_t) *BTABLE) + +/* SetENDPOINT */ +#define _SetENDPOINT(bEpNum,wRegValue) (*(EP0REG + bEpNum)= \ + (uint16_t)wRegValue) + +/* GetENDPOINT */ +#define _GetENDPOINT(bEpNum) ((uint16_t)(*(EP0REG + bEpNum))) + +#define _SetEPType(bEpNum,wType) (_SetENDPOINT(bEpNum,\ + ((_GetENDPOINT(bEpNum) & EP_T_MASK) | wType ))) + +#define _GetEPType(bEpNum) (_GetENDPOINT(bEpNum) & EP_T_FIELD) + +/******************************************************************************* +* Macro Name : SetEPTxStatus +* Description : sets the status for tx transfer (bits STAT_TX[1:0]). +* Input : bEpNum: Endpoint Number. +* wState: new state +* Return : None. +*******************************************************************************/ +#define _SetEPTxStatus(bEpNum,wState) {\ + register uint16_t _wRegVal; \ + _wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;\ + /* toggle first bit ? */ \ + if((EPTX_DTOG1 & wState)!= 0) \ + _wRegVal ^= EPTX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPTX_DTOG2 & wState)!= 0) \ + _wRegVal ^= EPTX_DTOG2; \ + _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ + while( ( _GetENDPOINT(bEpNum) & EPTX_STAT ) != wState ) \ + { \ + _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ + }; \ + } /* _SetEPTxStatus */ + +/******************************************************************************* +* Macro Name : SetEPRxStatus +* Description : sets the status for rx transfer (bits STAT_TX[1:0]) +* Input : bEpNum: Endpoint Number. +* wState: new state. +* Return : None. +*******************************************************************************/ +#define _SetEPRxStatus(bEpNum,wState) {\ + register uint16_t _wRegVal; \ + \ + _wRegVal = _GetENDPOINT(bEpNum) & EPRX_DTOGMASK;\ + /* toggle first bit ? */ \ + if((EPRX_DTOG1 & wState)!= 0) \ + _wRegVal ^= EPRX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPRX_DTOG2 & wState)!= 0) \ + _wRegVal ^= EPRX_DTOG2; \ + _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ + while( ( _GetENDPOINT(bEpNum) & EPRX_STAT ) != wState ) \ + { \ + _SetENDPOINT(bEpNum, (_wRegVal | EP_CTR_RX|EP_CTR_TX)); \ + } \ + } /* _SetEPRxStatus */ + +/******************************************************************************* +* Macro Name : SetEPRxTxStatus +* Description : sets the status for rx & tx (bits STAT_TX[1:0] & STAT_RX[1:0]) +* Input : bEpNum: Endpoint Number. +* wStaterx: new state. +* wStatetx: new state. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPRxTxStatus(bEpNum,wStaterx,wStatetx) {\ + register uint32_t _wRegVal_T, _wRegVal_R; \ + \ + _wRegVal_T = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK; \ + _wRegVal_R = _GetENDPOINT(bEpNum) & EPRX_DTOGMASK; \ + /* toggle first bit ? */ \ + if((EPRX_DTOG1 & wStaterx)!= 0) \ + _wRegVal_R ^= EPRX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPRX_DTOG2 & wStaterx)!= 0) \ + _wRegVal_R ^= EPRX_DTOG2; \ + /* toggle first bit ? */ \ + if((EPTX_DTOG1 & wStatetx)!= 0) \ + _wRegVal_T ^= EPTX_DTOG1; \ + /* toggle second bit ? */ \ + if((EPTX_DTOG2 & wStatetx)!= 0) \ + _wRegVal_T ^= EPTX_DTOG2; \ + _SetENDPOINT(bEpNum, _wRegVal_T |_wRegVal_R | EP_CTR_RX | EP_CTR_TX); \ + while( ( _GetENDPOINT(bEpNum) & EPTX_STAT ) != wStatetx ) \ + { \ + _SetENDPOINT(bEpNum, _wRegVal_T | EP_CTR_RX | EP_CTR_TX); \ + } \ + while( ( _GetENDPOINT(bEpNum) & EPRX_STAT ) != wStaterx ) \ + { \ + _SetENDPOINT(bEpNum, _wRegVal_R | EP_CTR_RX | EP_CTR_TX); \ + } \ + } /* _SetEPRxTxStatus */ + +/******************************************************************************* +* Macro Name : GetEPTxStatus / GetEPRxStatus +* Description : gets the status for tx/rx transfer (bits STAT_TX[1:0] +* /STAT_RX[1:0]) +* Input : bEpNum: Endpoint Number. +* Return : status . +*******************************************************************************/ +#define _GetEPTxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPTX_STAT) + +#define _GetEPRxStatus(bEpNum) ((uint16_t)_GetENDPOINT(bEpNum) & EPRX_STAT) + +/******************************************************************************* +* Macro Name : SetEPTxValid / SetEPRxValid +* Description : sets directly the VALID tx/rx-status into the enpoint register +* Input : bEpNum: Endpoint Number. +* Return : None. +*******************************************************************************/ +#define _SetEPTxValid(bEpNum) (_SetEPTxStatus(bEpNum, EP_TX_VALID)) + +#define _SetEPRxValid(bEpNum) (_SetEPRxStatus(bEpNum, EP_RX_VALID)) + +/******************************************************************************* +* Macro Name : GetTxStallStatus / GetRxStallStatus. +* Description : checks stall condition in an endpoint. +* Input : bEpNum: Endpoint Number. +* Return : TRUE = endpoint in stall condition. +*******************************************************************************/ +#define _GetTxStallStatus(bEpNum) (_GetEPTxStatus(bEpNum) \ + == EP_TX_STALL) +#define _GetRxStallStatus(bEpNum) (_GetEPRxStatus(bEpNum) \ + == EP_RX_STALL) + +/******************************************************************************* +* Macro Name : SetEP_KIND / ClearEP_KIND. +* Description : set & clear EP_KIND bit. +* Input : bEpNum: Endpoint Number. +* Return : None. +*******************************************************************************/ +#define _SetEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \ + (EP_CTR_RX|EP_CTR_TX|((_GetENDPOINT(bEpNum) | EP_KIND) & EPREG_MASK)))) +#define _ClearEP_KIND(bEpNum) (_SetENDPOINT(bEpNum, \ + (EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPKIND_MASK)))) + +/******************************************************************************* +* Macro Name : Set_Status_Out / Clear_Status_Out. +* Description : Sets/clears directly STATUS_OUT bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Return : None. +*******************************************************************************/ +#define _Set_Status_Out(bEpNum) _SetEP_KIND(bEpNum) +#define _Clear_Status_Out(bEpNum) _ClearEP_KIND(bEpNum) + +/******************************************************************************* +* Macro Name : SetEPDoubleBuff / ClearEPDoubleBuff. +* Description : Sets/clears directly EP_KIND bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Return : None. +*******************************************************************************/ +#define _SetEPDoubleBuff(bEpNum) _SetEP_KIND(bEpNum) +#define _ClearEPDoubleBuff(bEpNum) _ClearEP_KIND(bEpNum) + +/******************************************************************************* +* Macro Name : ClearEP_CTR_RX / ClearEP_CTR_TX. +* Description : Clears bit CTR_RX / CTR_TX in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Return : None. +*******************************************************************************/ +#define _ClearEP_CTR_RX(bEpNum) (_SetENDPOINT(bEpNum,\ + _GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK)) +#define _ClearEP_CTR_TX(bEpNum) (_SetENDPOINT(bEpNum,\ + _GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK)) + +/******************************************************************************* +* Macro Name : ToggleDTOG_RX / ToggleDTOG_TX . +* Description : Toggles DTOG_RX / DTOG_TX bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Return : None. +*******************************************************************************/ +#define _ToggleDTOG_RX(bEpNum) (_SetENDPOINT(bEpNum, \ + EP_CTR_RX|EP_CTR_TX|EP_DTOG_RX | (_GetENDPOINT(bEpNum) & EPREG_MASK))) +#define _ToggleDTOG_TX(bEpNum) (_SetENDPOINT(bEpNum, \ + EP_CTR_RX|EP_CTR_TX|EP_DTOG_TX | (_GetENDPOINT(bEpNum) & EPREG_MASK))) + +/******************************************************************************* +* Macro Name : ClearDTOG_RX / ClearDTOG_TX. +* Description : Clears DTOG_RX / DTOG_TX bit in the endpoint register. +* Input : bEpNum: Endpoint Number. +* Return : None. +*******************************************************************************/ +#define _ClearDTOG_RX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_RX) != 0)\ + _ToggleDTOG_RX(bEpNum) +#define _ClearDTOG_TX(bEpNum) if((_GetENDPOINT(bEpNum) & EP_DTOG_TX) != 0)\ + _ToggleDTOG_TX(bEpNum) +/******************************************************************************* +* Macro Name : SetEPAddress. +* Description : Sets address in an endpoint register. +* Input : bEpNum: Endpoint Number. +* bAddr: Address. +* Return : None. +*******************************************************************************/ +#define _SetEPAddress(bEpNum,bAddr) _SetENDPOINT(bEpNum,\ + EP_CTR_RX|EP_CTR_TX|(_GetENDPOINT(bEpNum) & EPREG_MASK) | bAddr) + +/******************************************************************************* +* Macro Name : GetEPAddress. +* Description : Gets address in an endpoint register. +* Input : bEpNum: Endpoint Number. +* Return : None. +*******************************************************************************/ +#define _GetEPAddress(bEpNum) ((uint8_t)(_GetENDPOINT(bEpNum) & EPADDR_FIELD)) + +#define _pEPTxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8 )*2 + PMAAddr)) +#define _pEPTxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+2)*2 + PMAAddr)) +#define _pEPRxAddr(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+4)*2 + PMAAddr)) +#define _pEPRxCount(bEpNum) ((uint32_t *)((_GetBTABLE()+bEpNum*8+6)*2 + PMAAddr)) + +/******************************************************************************* +* Macro Name : SetEPTxAddr / SetEPRxAddr. +* Description : sets address of the tx/rx buffer. +* Input : bEpNum: Endpoint Number. +* wAddr: address to be set (must be word aligned). +* Return : None. +*******************************************************************************/ +#define _SetEPTxAddr(bEpNum,wAddr) (*_pEPTxAddr(bEpNum) = ((wAddr >> 1) << 1)) +#define _SetEPRxAddr(bEpNum,wAddr) (*_pEPRxAddr(bEpNum) = ((wAddr >> 1) << 1)) + +/******************************************************************************* +* Macro Name : GetEPTxAddr / GetEPRxAddr. +* Description : Gets address of the tx/rx buffer. +* Input : bEpNum: Endpoint Number. +* Return : address of the buffer. +*******************************************************************************/ +#define _GetEPTxAddr(bEpNum) ((uint16_t)*_pEPTxAddr(bEpNum)) +#define _GetEPRxAddr(bEpNum) ((uint16_t)*_pEPRxAddr(bEpNum)) + +/******************************************************************************* +* Macro Name : SetEPCountRxReg. +* Description : Sets counter of rx buffer with no. of blocks. +* Input : pdwReg: pointer to counter. +* wCount: Counter. +* Return : None. +*******************************************************************************/ +#define _BlocksOf32(dwReg,wCount,wNBlocks) {\ + wNBlocks = wCount >> 5;\ + if((wCount & 0x1f) == 0)\ + wNBlocks--;\ + *pdwReg = (uint32_t)((wNBlocks << 10) | 0x8000);\ + }/* _BlocksOf32 */ + +#define _BlocksOf2(dwReg,wCount,wNBlocks) {\ + wNBlocks = wCount >> 1;\ + if((wCount & 0x1) != 0)\ + wNBlocks++;\ + *pdwReg = (uint32_t)(wNBlocks << 10);\ + }/* _BlocksOf2 */ + +#define _SetEPCountRxReg(dwReg,wCount) {\ + uint16_t wNBlocks;\ + if(wCount > 62){_BlocksOf32(dwReg,wCount,wNBlocks);}\ + else {_BlocksOf2(dwReg,wCount,wNBlocks);}\ + }/* _SetEPCountRxReg */ + +#define _GetNumBlock(wCount,wValue) {\ + uint16_t wNBlocks;\ + if(wCount > 62){\ + wNBlocks = wCount >> 5;\ + if((wCount & 0x1f) == 0) wNBlocks--;\ + wValue = (uint32_t)((wNBlocks << 10) | 0x8000);\ + }\ + else {wNBlocks = wCount >> 1;\ + if((wCount & 0x1) != 0) wNBlocks++;\ + wValue = (uint32_t)(wNBlocks << 10);\ + }\ +} + +#define _SetEPRxDblBuf0Count(bEpNum,wCount) {\ + uint32_t *pdwReg = _pEPTxCount(bEpNum); \ + _SetEPCountRxReg(pdwReg, wCount);\ + } + +/******************************************************************************* +* Macro Name : SetEPTxCount / SetEPRxCount. +* Description : sets counter for the tx/rx buffer. +* Input : bEpNum: endpoint number. +* wCount: Counter value. +* Return : None. +*******************************************************************************/ +#define _SetEPTxCount(bEpNum,wCount) (*_pEPTxCount(bEpNum) = wCount) +#define _SetEPRxCount(bEpNum,wCount) {\ + uint32_t *pdwReg = _pEPRxCount(bEpNum); \ + _SetEPCountRxReg(pdwReg, wCount);\ + if (bEpNum == ENDP0) \ + _GetNumBlock(Device_Property.MaxPacketSize,Ep0RxBlks);\ + } + +/******************************************************************************* +* Macro Name : GetEPTxCount / GetEPRxCount. +* Description : gets counter of the tx buffer. +* Input : bEpNum: endpoint number. +* Return : Counter value. +*******************************************************************************/ +#define _GetEPTxCount(bEpNum)((uint16_t)(*_pEPTxCount(bEpNum)) & 0x3ff) +#define _GetEPRxCount(bEpNum)((uint16_t)(*_pEPRxCount(bEpNum)) & 0x3ff) + +/******************************************************************************* +* Macro Name : SetEPDblBuf0Addr / SetEPDblBuf1Addr. +* Description : Sets buffer 0/1 address in a double buffer endpoint. +* Input : bEpNum: endpoint number. +* : wBuf0Addr: buffer 0 address. +* Output : None. +* Return : None. +*******************************************************************************/ +#define _SetEPDblBuf0Addr(bEpNum,wBuf0Addr) {_SetEPTxAddr(bEpNum, wBuf0Addr);} +#define _SetEPDblBuf1Addr(bEpNum,wBuf1Addr) {_SetEPRxAddr(bEpNum, wBuf1Addr);} + +/******************************************************************************* +* Macro Name : SetEPDblBuffAddr. +* Description : Sets addresses in a double buffer endpoint. +* Input : bEpNum: endpoint number. +* : wBuf0Addr: buffer 0 address. +* : wBuf1Addr = buffer 1 address. +* Return : None. +*******************************************************************************/ +#define _SetEPDblBuffAddr(bEpNum,wBuf0Addr,wBuf1Addr) { \ + _SetEPDblBuf0Addr(bEpNum, wBuf0Addr);\ + _SetEPDblBuf1Addr(bEpNum, wBuf1Addr);\ + } /* _SetEPDblBuffAddr */ + +/******************************************************************************* +* Macro Name : GetEPDblBuf0Addr / GetEPDblBuf1Addr. +* Description : Gets buffer 0/1 address of a double buffer endpoint. +* Input : bEpNum: endpoint number. +* Return : None. +*******************************************************************************/ +#define _GetEPDblBuf0Addr(bEpNum) (_GetEPTxAddr(bEpNum)) +#define _GetEPDblBuf1Addr(bEpNum) (_GetEPRxAddr(bEpNum)) + +/******************************************************************************* +* Macro Name : SetEPDblBuffCount / SetEPDblBuf0Count / SetEPDblBuf1Count. +* Description : Gets buffer 0/1 address of a double buffer endpoint. +* Input : bEpNum: endpoint number. +* : bDir: endpoint dir EP_DBUF_OUT = OUT +* EP_DBUF_IN = IN +* : wCount: Counter value +* Return : None. +*******************************************************************************/ +#define _SetEPDblBuf0Count(bEpNum, bDir, wCount) { \ + if(bDir == EP_DBUF_OUT)\ + /* OUT endpoint */ \ + {_SetEPRxDblBuf0Count(bEpNum,wCount);} \ + else if(bDir == EP_DBUF_IN)\ + /* IN endpoint */ \ + *_pEPTxCount(bEpNum) = (uint32_t)wCount; \ + } /* SetEPDblBuf0Count*/ + +#define _SetEPDblBuf1Count(bEpNum, bDir, wCount) { \ + if(bDir == EP_DBUF_OUT)\ + /* OUT endpoint */ \ + {_SetEPRxCount(bEpNum,wCount);}\ + else if(bDir == EP_DBUF_IN)\ + /* IN endpoint */\ + *_pEPRxCount(bEpNum) = (uint32_t)wCount; \ + } /* SetEPDblBuf1Count */ + +#define _SetEPDblBuffCount(bEpNum, bDir, wCount) {\ + _SetEPDblBuf0Count(bEpNum, bDir, wCount); \ + _SetEPDblBuf1Count(bEpNum, bDir, wCount); \ + } /* _SetEPDblBuffCount */ + +/******************************************************************************* +* Macro Name : GetEPDblBuf0Count / GetEPDblBuf1Count. +* Description : Gets buffer 0/1 rx/tx counter for double buffering. +* Input : bEpNum: endpoint number. +* Return : None. +*******************************************************************************/ +#define _GetEPDblBuf0Count(bEpNum) (_GetEPTxCount(bEpNum)) +#define _GetEPDblBuf1Count(bEpNum) (_GetEPRxCount(bEpNum)) + + +extern __IO uint16_t wIstr; /* ISTR register last read value */ + + +void SetCNTR(uint16_t /*wRegValue*/); +void SetISTR(uint16_t /*wRegValue*/); +void SetDADDR(uint16_t /*wRegValue*/); +void SetBTABLE(uint16_t /*wRegValue*/); +void SetBTABLE(uint16_t /*wRegValue*/); +uint16_t GetCNTR(void); +uint16_t GetISTR(void); +uint16_t GetFNR(void); +uint16_t GetDADDR(void); +uint16_t GetBTABLE(void); +void SetENDPOINT(uint8_t /*bEpNum*/, uint16_t /*wRegValue*/); +uint16_t GetENDPOINT(uint8_t /*bEpNum*/); +void SetEPType(uint8_t /*bEpNum*/, uint16_t /*wType*/); +uint16_t GetEPType(uint8_t /*bEpNum*/); +void SetEPTxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/); +void SetEPRxStatus(uint8_t /*bEpNum*/, uint16_t /*wState*/); +void SetDouBleBuffEPStall(uint8_t /*bEpNum*/, uint8_t bDir); +uint16_t GetEPTxStatus(uint8_t /*bEpNum*/); +uint16_t GetEPRxStatus(uint8_t /*bEpNum*/); +void SetEPTxValid(uint8_t /*bEpNum*/); +void SetEPRxValid(uint8_t /*bEpNum*/); +uint16_t GetTxStallStatus(uint8_t /*bEpNum*/); +uint16_t GetRxStallStatus(uint8_t /*bEpNum*/); +void SetEP_KIND(uint8_t /*bEpNum*/); +void ClearEP_KIND(uint8_t /*bEpNum*/); +void Set_Status_Out(uint8_t /*bEpNum*/); +void Clear_Status_Out(uint8_t /*bEpNum*/); +void SetEPDoubleBuff(uint8_t /*bEpNum*/); +void ClearEPDoubleBuff(uint8_t /*bEpNum*/); +void ClearEP_CTR_RX(uint8_t /*bEpNum*/); +void ClearEP_CTR_TX(uint8_t /*bEpNum*/); +void ToggleDTOG_RX(uint8_t /*bEpNum*/); +void ToggleDTOG_TX(uint8_t /*bEpNum*/); +void ClearDTOG_RX(uint8_t /*bEpNum*/); +void ClearDTOG_TX(uint8_t /*bEpNum*/); +void SetEPAddress(uint8_t /*bEpNum*/, uint8_t /*bAddr*/); +uint8_t GetEPAddress(uint8_t /*bEpNum*/); +void SetEPTxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/); +void SetEPRxAddr(uint8_t /*bEpNum*/, uint16_t /*wAddr*/); +uint16_t GetEPTxAddr(uint8_t /*bEpNum*/); +uint16_t GetEPRxAddr(uint8_t /*bEpNum*/); +void SetEPCountRxReg(uint32_t * /*pdwReg*/, uint16_t /*wCount*/); +void SetEPTxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/); +void SetEPRxCount(uint8_t /*bEpNum*/, uint16_t /*wCount*/); +uint16_t GetEPTxCount(uint8_t /*bEpNum*/); +uint16_t GetEPRxCount(uint8_t /*bEpNum*/); +void SetEPDblBuf0Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/); +void SetEPDblBuf1Addr(uint8_t /*bEpNum*/, uint16_t /*wBuf1Addr*/); +void SetEPDblBuffAddr(uint8_t /*bEpNum*/, uint16_t /*wBuf0Addr*/, uint16_t /*wBuf1Addr*/); +uint16_t GetEPDblBuf0Addr(uint8_t /*bEpNum*/); +uint16_t GetEPDblBuf1Addr(uint8_t /*bEpNum*/); +void SetEPDblBuffCount(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); +void SetEPDblBuf0Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); +void SetEPDblBuf1Count(uint8_t /*bEpNum*/, uint8_t /*bDir*/, uint16_t /*wCount*/); +uint16_t GetEPDblBuf0Count(uint8_t /*bEpNum*/); +uint16_t GetEPDblBuf1Count(uint8_t /*bEpNum*/); +EP_DBUF_DIR GetEPDblBufDir(uint8_t /*bEpNum*/); +void FreeUserBuffer(uint8_t bEpNum/*bEpNum*/, uint8_t bDir); +uint16_t ToWord(uint8_t, uint8_t); +uint16_t ByteSwap(uint16_t); + +#ifdef __cplusplus +} + +#endif + +#endif /* __USB_REGS_H */ + + + + + + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_sil.h b/V203F6P6/ch32v203/usbd/inc/usb_sil.h new file mode 100644 index 0000000..b3fea6a --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_sil.h @@ -0,0 +1,36 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_sil.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : This file contains all the functions prototypes for the + * USB Simplified Interface Layer firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_SIL_H +#define __USB_SIL_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v20x.h" + +uint32_t USB_SIL_Init(void); +uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize); +uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer); + +#ifdef __cplusplus +} + +#endif + +#endif /* __USB_SIL_H */ + + + + + diff --git a/V203F6P6/ch32v203/usbd/inc/usb_type.h b/V203F6P6/ch32v203/usbd/inc/usb_type.h new file mode 100644 index 0000000..c47c476 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/inc/usb_type.h @@ -0,0 +1,33 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_type.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : This file contains all the functions prototypes for the + * USB types firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_TYPE_H +#define __USB_TYPE_H +//#include "debug.h" +#include "usb_conf.h" + +#ifndef __cplusplus +#ifndef NULL +#define NULL ((void *)0) +#endif +typedef enum +{ + FALSE = 0, TRUE = !FALSE +} +bool; +#endif // __cplusplus +#endif /* __USB_TYPE_H */ + + + + + diff --git a/V203F6P6/ch32v203/usbd/libusbd.a b/V203F6P6/ch32v203/usbd/libusbd.a new file mode 100644 index 0000000000000000000000000000000000000000..13bf901eb973dcf16ce0d6d2c5684b177e037741 GIT binary patch literal 718700 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
    4g++VoY&R9#aur^eQ=om(?!uD3#tGF3}o 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

    mE;M!CG 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

    @{=c*pFF*CZ26+;qEW9_ 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 z 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
    !thpW-r~>w|VKlzS~Rp^{>734L?vn;l;P7pY-CN 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

    r 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

    -np`%4N^37zBDfH--nV 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 literal 0 HcmV?d00001 diff --git a/V203F6P6/ch32v203/usbd/src/cdc_class.cpp b/V203F6P6/ch32v203/usbd/src/cdc_class.cpp new file mode 100644 index 0000000..b5f3f31 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/cdc_class.cpp @@ -0,0 +1,46 @@ +#include "core_riscv.h" +#include "usb_regs.h" +#include "usb_mem.h" +#include "usb_sil.h" +#include "usb_prop.h" +#include "cdc_class.h" + +cdc_class * cdc_instance = nullptr; + +typedef __SIZE_TYPE__ size_t; +extern "C" { + extern void DeviceInit (); + extern void *memcpy (void *dest, const void *src, size_t n); +}; +cdc_class::cdc_class () : BaseLayer(), ctrli(nullptr), ep3Busy(false), Ready(false) { + cdc_instance = this; +} + +void cdc_class::init() { + DeviceInit (); +} +void cdc_class::ep2outHandler() { + const unsigned len = GetEPRxCount( EP2_OUT & 0x7F ); + PMAToUserBufferCopy( rxbuffer, GetEPRxAddr( EP2_OUT & 0x7F ), len ); + Up((char*)rxbuffer, len); + SetEPRxValid( ENDP2 ); +} +void cdc_class::ep3inHandler() { + ep3Busy = false; +} +uint32_t cdc_class::Down(const char * data, const uint32_t len) { + if ( ep3Busy ) return 0u; + if ( !Ready ) return 0u; + ep3Busy = true; + USB_SIL_Write( EP3_IN, (unsigned char*) data, len ); + SetEPTxStatus( ENDP3, EP_TX_VALID ); + return len; +} +void cdc_class::ctrl(const CTRL_TYPES_DEF type, const void * data, const uint32_t len) { + if (type == USB_USART_SET_DTR_RTS) { + const uint16_t cmd = * reinterpret_cast(data); + Ready = cmd & 1u; + } + if (! ctrli) return; + ctrli->IOCtrl (type, data, len); +} diff --git a/V203F6P6/ch32v203/usbd/src/hw_config.cpp b/V203F6P6/ch32v203/usbd/src/hw_config.cpp new file mode 100644 index 0000000..d12f298 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/hw_config.cpp @@ -0,0 +1,132 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : hw_config.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : USB configuration file. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +//#include "usb_lib.h" +//#include "usb_prop.h" +//#include "usb_desc.h" +#include "system.h" +extern "C" { +#include "usb_istr.h" +#include "hw_config.h" +#include "usb_core.h" +#include "usb_pwr.h" +#include "usb_regs.h" +}; +#define printf(...) + +extern "C" { +[[gnu::interrupt]] extern void USB_LP_CAN1_RX0_IRQHandler(); +}; +void USB_LP_CAN1_RX0_IRQHandler() { + USB_Istr(); +} +/* USB_Device_clock_source */ +enum RCC_USB_CLK_SRC : uint32_t { + RCC_USBCLKSource_PLLCLK_Div1 = 0u, + RCC_USBCLKSource_PLLCLK_Div2, + RCC_USBCLKSource_PLLCLK_Div3, +}; +static void RCC_USBCLKConfig(const RCC_USB_CLK_SRC RCC_USBCLKSource) { + RCC.CFGR0.B.USBPRE = RCC_USBCLKSource; +} +extern "C" uint32_t SystemCoreClock; +/********************************************************************* + * @fn USBFS_RCC_Init + * + * @brief Initializes the usbfs clock configuration. + * + * @return none + */ +static void USBFS_RCC_Init( void ) { + if( SystemCoreClock == 144'000'000 ) { + RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div3 ); + } else if( SystemCoreClock == 96'000'000 ) { + RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div2 ); + } else if( SystemCoreClock == 48'000'000 ) { + RCC_USBCLKConfig( RCC_USBCLKSource_PLLCLK_Div1 ); + } + RCC.APB1PCENR.B.USBDEN = SET; +} +extern "C" void USB_Init(); + +void DeviceInit() { + delay_init(); + USBFS_RCC_Init(); + USB_Init (); + NVIC.EnableIRQ(USB_LP_CAN1_RX0_IRQn); +} + +/******************************************************************************* + * @fn Enter_LowPowerMode + * + * @brief Enter low power mode. + * + * @return None + */ +void Enter_LowPowerMode(void) +{ + printf("usb enter low power mode\r\n"); + bDeviceState=SUSPENDED; +} + +/******************************************************************************* + * @fn Leave_LowPowerMode + * + * @brief Leave low power mode. + * + * @return None + */ +void Leave_LowPowerMode(void) +{ + DEVICE_INFO *pInfo=&Device_Info; + printf("usb leave low power mode\r\n"); + if (pInfo->Current_Configuration!=0)bDeviceState=CONFIGURED; + else bDeviceState = ATTACHED; +} +/******************************************************************************* + * @fn USB_Port_Set + * + * @brief Set USB IO port. + * + * @param NewState: DISABLE or ENABLE. + * Pin_In_IPU: Enables or Disables intenal pull-up resistance. + * + * @return None + */ +void USB_Port_Set(FunctionalState NewState, FunctionalState Pin_In_IPU) +{ + RCC.APB2PCENR.B.IOPAEN = SET; + + if(NewState) { + _SetCNTR(_GetCNTR()&(~(1<<1))); + GPIOA.CFGHR.R &= 0XFFF00FFF; + GPIOA.OUTDR.R &= ~(3<<11); //PA11/12=0 + GPIOA.CFGHR.R |= 0X00044000; //float + } + else + { + _SetCNTR(_GetCNTR()|(1<<1)); + GPIOA.CFGHR.R &= 0XFFF00FFF; + GPIOA.OUTDR.R &= ~(3<<11); //PA11/12=0 + GPIOA.CFGHR.R |= 0X00033000; // LOW + } + + if(Pin_In_IPU) EXTEND.EXTEND_CTR.B.USBDPU = SET; + else EXTEND.EXTEND_CTR.B.USBDPU = RESET; +} + + + + + + + + diff --git a/V203F6P6/ch32v203/usbd/src/usb_core.c b/V203F6P6/ch32v203/usbd/src/usb_core.c new file mode 100644 index 0000000..3bc5bcc --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/usb_core.c @@ -0,0 +1,954 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_core.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Standard protocol processing (USB v2.0) +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "usb_lib.h" + +/* Global define */ +#define ValBit(VAR,Place) (VAR & (1 << Place)) +#define SetBit(VAR,Place) (VAR |= (1 << Place)) +#define ClrBit(VAR,Place) (VAR &= ((1 << Place) ^ 255)) +#define Send0LengthData() { _SetEPTxCount(ENDP0, 0); \ + vSetEPTxStatus(EP_TX_VALID); \ + } + +#define vSetEPRxStatus(st) (SaveRState = st) +#define vSetEPTxStatus(st) (SaveTState = st) + +#define USB_StatusIn() Send0LengthData() +#define USB_StatusOut() vSetEPRxStatus(EP_RX_VALID) + +#define StatusInfo0 StatusInfo.bw.bb1 +#define StatusInfo1 StatusInfo.bw.bb0 + +uint16_t_uint8_t StatusInfo; + +bool Data_Mul_MaxPacketSize = FALSE; + +static void DataStageOut(void); +static void DataStageIn(void); +static void NoData_Setup0(void); +static void Data_Setup0(void); + +/********************************************************************* + * @fn Standard_GetConfiguration + * + * @brief Return the current configuration variable address. + * + * @param Length - How many bytes are needed. + * + * @return Return 1 - if the request is invalid when "Length" is 0. + * Return "Buffer" if the "Length" is not 0. + */ +uint8_t *Standard_GetConfiguration(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = sizeof(pInformation->Current_Configuration); + return 0; + } + pUser_Standard_Requests->User_GetConfiguration(); + + return (uint8_t *)&pInformation->Current_Configuration; +} + +/********************************************************************* + * @fn Standard_SetConfiguration + * + * @brief This routine is called to set the configuration value + * Then each class should configure device itself. + * + * @param None. + * + * @return Return USB_SUCCESS - if the request is performed. + * Return USB_UNSUPPORT - if the request is invalid. + */ +RESULT Standard_SetConfiguration(void) +{ + if ((pInformation->USBwValue0 <= + Device_Table.Total_Configuration) && (pInformation->USBwValue1 == 0) + && (pInformation->USBwIndex == 0)) + { + pInformation->Current_Configuration = pInformation->USBwValue0; + pUser_Standard_Requests->User_SetConfiguration(); + return USB_SUCCESS; + } + else + { + return USB_UNSUPPORT; + } +} + +/********************************************************************* + * @fn Standard_GetInterface + * + * @brief Return the Alternate Setting of the current interface. + * + * @param Length - How many bytes are needed. + * + * @return Return 0 - if the request is invalid when "Length" is 0. + * Return "Buffer" if the "Length" is not 0. + */ +uint8_t *Standard_GetInterface(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = sizeof(pInformation->Current_AlternateSetting); + return 0; + } + pUser_Standard_Requests->User_GetInterface(); + + return (uint8_t *)&pInformation->Current_AlternateSetting; +} + +/********************************************************************* + * @fn Standard_SetInterface + * + * @brief This routine is called to set the interface. + * Then each class should configure the interface them self. + * + * @param None + * + * @return Return USB_SUCCESS - if the request is performed. + * Return USB_UNSUPPORT - if the request is invalid. + */ +RESULT Standard_SetInterface(void) +{ + RESULT Re; + Re = (*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, pInformation->USBwValue0); + + if (pInformation->Current_Configuration != 0) + { + if ((Re != USB_SUCCESS) || (pInformation->USBwIndex1 != 0) + || (pInformation->USBwValue1 != 0)) + { + return USB_UNSUPPORT; + } + else if (Re == USB_SUCCESS) + { + pUser_Standard_Requests->User_SetInterface(); + pInformation->Current_Interface = pInformation->USBwIndex0; + pInformation->Current_AlternateSetting = pInformation->USBwValue0; + return USB_SUCCESS; + } + } + + return USB_UNSUPPORT; +} + +/********************************************************************* + * @fn Standard_GetStatus + * + * @brief Copy the device request data to "StatusInfo buffer". + * + * @param Length - How many bytes are needed. + * + * @return Return 0 - if the request is at end of data block, + * or is invalid when "Length" is 0. + */ +uint8_t *Standard_GetStatus(uint16_t Length) +{ + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = 2; + return 0; + } + StatusInfo.w = 0; + + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + uint8_t Feature = pInformation->Current_Feature; + + if (ValBit(Feature, 5)) + { + SetBit(StatusInfo0, 1); + } + else + { + ClrBit(StatusInfo0, 1); + } + if (ValBit(Feature, 6)) + { + SetBit(StatusInfo0, 0); + } + else + { + ClrBit(StatusInfo0, 0); + } + } + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + return (uint8_t *)&StatusInfo; + } + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + uint8_t Related_Endpoint; + uint8_t wIndex0 = pInformation->USBwIndex0; + + Related_Endpoint = (wIndex0 & 0x0f); + if (ValBit(wIndex0, 7)) + { + if (_GetTxStallStatus(Related_Endpoint)) + { + SetBit(StatusInfo0, 0); + } + } + else + { + if (_GetRxStallStatus(Related_Endpoint)) + { + SetBit(StatusInfo0, 0); + } + } + + } + else + { + return NULL; + } + pUser_Standard_Requests->User_GetStatus(); + + return (uint8_t *)&StatusInfo; +} + +/********************************************************************* + * @fn Standard_ClearFeature + * + * @brief Clear or disable a specific feature. + * + * @return Return USB_SUCCESS - if the request is performed. + * Return USB_UNSUPPORT - if the request is invalid. + */ +RESULT Standard_ClearFeature(void) +{ + uint32_t Type_Rec = Type_Recipient; + uint32_t Status; + + if (Type_Rec == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + ClrBit(pInformation->Current_Feature, 5); + return USB_SUCCESS; + } + else if (Type_Rec == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + DEVICE* pDev; + uint32_t Related_Endpoint; + uint32_t wIndex0; + uint32_t rEP; + + if ((pInformation->USBwValue != ENDPOINT_STALL) + || (pInformation->USBwIndex1 != 0)) + { + return USB_UNSUPPORT; + } + + pDev = &Device_Table; + wIndex0 = pInformation->USBwIndex0; + rEP = wIndex0 & ~0x80; + Related_Endpoint = ENDP0 + rEP; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if ((rEP >= pDev->Total_Endpoint) || (Status == 0) + || (pInformation->Current_Configuration == 0)) + { + return USB_UNSUPPORT; + } + + if (wIndex0 & 0x80) + { + if (_GetTxStallStatus(Related_Endpoint )) + { + ClearDTOG_TX(Related_Endpoint); + SetEPTxStatus(Related_Endpoint, EP_TX_VALID); + } + } + else + { + if (_GetRxStallStatus(Related_Endpoint)) + { + if (Related_Endpoint == ENDP0) + { + SetEPRxCount(Related_Endpoint, Device_Property.MaxPacketSize); + _SetEPRxStatus(Related_Endpoint, EP_RX_VALID); + } + else + { + ClearDTOG_RX(Related_Endpoint); + _SetEPRxStatus(Related_Endpoint, EP_RX_VALID); + } + } + } + pUser_Standard_Requests->User_ClearFeature(); + return USB_SUCCESS; + } + + return USB_UNSUPPORT; +} + +/********************************************************************* + * @fn Standard_SetEndPointFeature + * + * @brief Set or enable a specific feature of EndPoint + * + * @return Return USB_SUCCESS - if the request is performed. + * Return USB_UNSUPPORT - if the request is invalid. + */ +RESULT Standard_SetEndPointFeature(void) +{ + uint32_t wIndex0; + uint32_t Related_Endpoint; + uint32_t rEP; + uint32_t Status; + + wIndex0 = pInformation->USBwIndex0; + rEP = wIndex0 & ~0x80; + Related_Endpoint = ENDP0 + rEP; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if (Related_Endpoint >= Device_Table.Total_Endpoint + || pInformation->USBwValue != 0 || Status == 0 + || pInformation->Current_Configuration == 0) + { + return USB_UNSUPPORT; + } + else + { + if (wIndex0 & 0x80) + { + _SetEPTxStatus(Related_Endpoint, EP_TX_STALL); + } + else + { + _SetEPRxStatus(Related_Endpoint, EP_RX_STALL); + } + } + pUser_Standard_Requests->User_SetEndPointFeature(); + + return USB_SUCCESS; +} + +/********************************************************************* + * @fn Standard_SetDeviceFeature + * + * @brief Set or enable a specific feature of Device. + * + * @return Return USB_SUCCESS - if the request is performed. + * Return USB_UNSUPPORT - if the request is invalid. + */ +RESULT Standard_SetDeviceFeature(void) +{ + SetBit(pInformation->Current_Feature, 5); + pUser_Standard_Requests->User_SetDeviceFeature(); + + return USB_SUCCESS; +} + +/********************************************************************* + * @fn Standard_GetDescriptorData + * + * @brief This routine is used for the descriptors resident in Flash + * or RAM pDesc can be in either Flash or RAM + * The purpose of this routine is to have a versatile way to + * response descriptors request. It allows user to generate + * certain descriptors with software or read descriptors from + * external storage part by part. + * + * @param Length - Length of the data in this transfer. + * pDesc - A pointer points to descriptor struct. + * The structure gives the initial address of the descriptor and + * its original size. + * + * @return Address of a part of the descriptor pointed by the Usb_ + * wOffset The buffer pointed by this address contains at least + * Length bytes. + */ +uint8_t *Standard_GetDescriptorData(uint16_t Length, ONE_DESCRIPTOR *pDesc) +{ + uint32_t wOffset; + + wOffset = pInformation->Ctrl_Info.Usb_wOffset; + + if (Length == 0) + { + pInformation->Ctrl_Info.Usb_wLength = pDesc->Descriptor_Size - wOffset; + return 0; + } + + return pDesc->Descriptor + wOffset; +} + +/********************************************************************* + * @fn DataStageOut + * + * @brief Data stage of a Control Write Transfer. + * + * @return none + */ +void DataStageOut(void) +{ + ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; + uint32_t save_rLength; + + save_rLength = pEPinfo->Usb_rLength; + + if (pEPinfo->CopyData && save_rLength) + { + uint8_t *Buffer; + uint32_t Length; + + Length = pEPinfo->PacketSize; + + if (Length > save_rLength) + { + Length = save_rLength; + } + + Buffer = (*pEPinfo->CopyData)(Length); + pEPinfo->Usb_rLength -= Length; + pEPinfo->Usb_rOffset += Length; + PMAToUserBufferCopy(Buffer, GetEPRxAddr(ENDP0), Length); + } + + if (pEPinfo->Usb_rLength != 0) + { + vSetEPRxStatus(EP_RX_VALID); + SetEPTxCount(ENDP0, 0); + vSetEPTxStatus(EP_TX_VALID); + } + + if (pEPinfo->Usb_rLength >= pEPinfo->PacketSize) + { + pInformation->ControlState = OUT_DATA; + } + else + { + if (pEPinfo->Usb_rLength > 0) + { + pInformation->ControlState = LAST_OUT_DATA; + } + else if (pEPinfo->Usb_rLength == 0) + { + pInformation->ControlState = WAIT_STATUS_IN; + USB_StatusIn(); + } + } +} + +/********************************************************************* + * @fn DataStageIn + * + * @brief Data stage of a Control Read Transfer. + * + * @return none + */ +void DataStageIn(void) +{ + ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; + uint32_t save_wLength = pEPinfo->Usb_wLength; + uint32_t ControlState = pInformation->ControlState; + + uint8_t *DataBuffer; + uint32_t Length; + + if ((save_wLength == 0) && (ControlState == LAST_IN_DATA)) + { + if(Data_Mul_MaxPacketSize == TRUE) + { + Send0LengthData(); + ControlState = LAST_IN_DATA; + Data_Mul_MaxPacketSize = FALSE; + } + else + { + ControlState = WAIT_STATUS_OUT; + vSetEPTxStatus(EP_TX_STALL); + + } + + goto Expect_Status_Out; + } + + Length = pEPinfo->PacketSize; + ControlState = (save_wLength <= Length) ? LAST_IN_DATA : IN_DATA; + + if (Length > save_wLength) + { + Length = save_wLength; + } + + DataBuffer = (*pEPinfo->CopyData)(Length); + + UserToPMABufferCopy(DataBuffer, GetEPTxAddr(ENDP0), Length); + + SetEPTxCount(ENDP0, Length); + + pEPinfo->Usb_wLength -= Length; + pEPinfo->Usb_wOffset += Length; + vSetEPTxStatus(EP_TX_VALID); + + USB_StatusOut(); + +Expect_Status_Out: + pInformation->ControlState = ControlState; +} + +/********************************************************************* + * @fn NoData_Setup0 + * + * @brief Proceed the processing of setup request without data stage. + * + * @return none + */ +void NoData_Setup0(void) +{ + RESULT Result = USB_UNSUPPORT; + uint32_t RequestNo = pInformation->USBbRequest; + uint32_t ControlState; + + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + if (RequestNo == SET_CONFIGURATION) + { + Result = Standard_SetConfiguration(); + } + else if (RequestNo == SET_ADDRESS) + { + if ((pInformation->USBwValue0 > 127) || (pInformation->USBwValue1 != 0) + || (pInformation->USBwIndex != 0) + || (pInformation->Current_Configuration != 0)) + { + ControlState = STALLED; + goto exit_NoData_Setup0; + } + else + { + Result = USB_SUCCESS; + } + } + else if (RequestNo == SET_FEATURE) + { + if ((pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP) \ + && (pInformation->USBwIndex == 0)) + { + Result = Standard_SetDeviceFeature(); + } + else + { + Result = USB_UNSUPPORT; + } + } + else if (RequestNo == CLEAR_FEATURE) + { + if (pInformation->USBwValue0 == DEVICE_REMOTE_WAKEUP + && pInformation->USBwIndex == 0 + && ValBit(pInformation->Current_Feature, 5)) + { + Result = Standard_ClearFeature(); + } + else + { + Result = USB_UNSUPPORT; + } + } + + } + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + if (RequestNo == SET_INTERFACE) + { + Result = Standard_SetInterface(); + } + } + + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + if (RequestNo == CLEAR_FEATURE) + { + Result = Standard_ClearFeature(); + } + else if (RequestNo == SET_FEATURE) + { + Result = Standard_SetEndPointFeature(); + } + } + else + { + Result = USB_UNSUPPORT; + } + + if (Result != USB_SUCCESS) + { + Result = (*pProperty->Class_NoData_Setup)(RequestNo); + if (Result == USB_NOT_READY) + { + ControlState = PAUSE; + goto exit_NoData_Setup0; + } + } + + if (Result != USB_SUCCESS) + { + ControlState = STALLED; + goto exit_NoData_Setup0; + } + + ControlState = WAIT_STATUS_IN; + + USB_StatusIn(); + +exit_NoData_Setup0: + pInformation->ControlState = ControlState; + return; +} + +/********************************************************************* + * @fn Data_Setup0 + * + * @brief Proceed the processing of setup request with data stage. + * + * @return none + */ +void Data_Setup0(void) +{ + uint8_t *(*CopyRoutine)(uint16_t); + RESULT Result; + uint32_t Request_No = pInformation->USBbRequest; + uint32_t Related_Endpoint, Reserved; + uint32_t wOffset, Status; + + CopyRoutine = NULL; + wOffset = 0; + + if (Request_No == GET_DESCRIPTOR) + { + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + uint8_t wValue1 = pInformation->USBwValue1; + if (wValue1 == DEVICE_DESCRIPTOR) + { + CopyRoutine = pProperty->GetDeviceDescriptor; + } + else if (wValue1 == CONFIG_DESCRIPTOR) + { + CopyRoutine = pProperty->GetConfigDescriptor; + } + else if (wValue1 == STRING_DESCRIPTOR) + { + CopyRoutine = pProperty->GetStringDescriptor; + } + } + } + else if ((Request_No == GET_STATUS) && (pInformation->USBwValue == 0) + && (pInformation->USBwLength == 0x0002) + && (pInformation->USBwIndex1 == 0)) + { + + if ((Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + && (pInformation->USBwIndex == 0)) + { + CopyRoutine = Standard_GetStatus; + } + else if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + { + if (((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS) + && (pInformation->Current_Configuration != 0)) + { + CopyRoutine = Standard_GetStatus; + } + } + else if (Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) + { + Related_Endpoint = (pInformation->USBwIndex0 & 0x0f); + Reserved = pInformation->USBwIndex0 & 0x70; + + if (ValBit(pInformation->USBwIndex0, 7)) + { + Status = _GetEPTxStatus(Related_Endpoint); + } + else + { + Status = _GetEPRxStatus(Related_Endpoint); + } + + if ((Related_Endpoint < Device_Table.Total_Endpoint) && (Reserved == 0) + && (Status != 0)) + { + CopyRoutine = Standard_GetStatus; + } + } + + } + else if (Request_No == GET_CONFIGURATION) + { + if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) + { + CopyRoutine = Standard_GetConfiguration; + } + } + else if (Request_No == GET_INTERFACE) + { + if ((Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) + && (pInformation->Current_Configuration != 0) && (pInformation->USBwValue == 0) + && (pInformation->USBwIndex1 == 0) && (pInformation->USBwLength == 0x0001) + && ((*pProperty->Class_Get_Interface_Setting)(pInformation->USBwIndex0, 0) == USB_SUCCESS)) + { + CopyRoutine = Standard_GetInterface; + } + + } + + if (CopyRoutine) + { + pInformation->Ctrl_Info.Usb_wOffset = wOffset; + pInformation->Ctrl_Info.CopyData = CopyRoutine; + (*CopyRoutine)(0); + Result = USB_SUCCESS; + } + else + { + Result = (*pProperty->Class_Data_Setup)(pInformation->USBbRequest); + + if (Result == USB_NOT_READY) + { + pInformation->ControlState = PAUSE; + return; + } + } + + if (pInformation->Ctrl_Info.Usb_wLength == 0xFFFF) + { + pInformation->ControlState = PAUSE; + return; + } + + if ((Result == USB_UNSUPPORT) || (pInformation->Ctrl_Info.Usb_wLength == 0)) + { + pInformation->ControlState = STALLED; + return; + } + + if (ValBit(pInformation->USBbmRequestType, 7)) + { + __IO uint32_t wLength = pInformation->USBwLength; + if (pInformation->Ctrl_Info.Usb_wLength > wLength) + { + pInformation->Ctrl_Info.Usb_wLength = wLength; + } + else if (pInformation->Ctrl_Info.Usb_wLength < pInformation->USBwLength) + { + if (pInformation->Ctrl_Info.Usb_wLength < pProperty->MaxPacketSize) + { + Data_Mul_MaxPacketSize = FALSE; + } + else if ((pInformation->Ctrl_Info.Usb_wLength % pProperty->MaxPacketSize) == 0) + { + Data_Mul_MaxPacketSize = TRUE; + } + } + + pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize; + DataStageIn(); + } + else + { + pInformation->ControlState = OUT_DATA; + vSetEPRxStatus(EP_RX_VALID); + } + + return; +} + +/********************************************************************* + * @fn Setup0_Process + * + * @brief Get the device request data and dispatch to individual process. + * + * @return Post0_Process. + */ +uint8_t Setup0_Process(void) +{ + union + { + uint8_t* b; + uint16_t* w; + } pBuf; + uint16_t offset = 1; + + pBuf.b = PMAAddr + (uint8_t *)(_GetEPRxAddr(ENDP0) * 2); /* *2 for 32 bits addr */ + + if (pInformation->ControlState != PAUSE) + { + pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */ + pInformation->USBbRequest = *pBuf.b++; /* bRequest */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwIndex = ByteSwap(*pBuf.w++); /* wIndex */ + pBuf.w += offset; /* word not accessed because of 32 bits addressing */ + pInformation->USBwLength = *pBuf.w; /* wLength */ + } + pInformation->ControlState = SETTING_UP; + + if (pInformation->USBwLength == 0) + { + NoData_Setup0(); + } + else + { + Data_Setup0(); + } + return Post0_Process(); +} + +/********************************************************************* + * @fn In0_Process + * + * @brief Process the IN token on all default endpoint. + * + * @return none + */ +uint8_t In0_Process(void) +{ + uint32_t ControlState = pInformation->ControlState; + + if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) + { + DataStageIn(); + ControlState = pInformation->ControlState; + } + else if (ControlState == WAIT_STATUS_IN) + { + if ((pInformation->USBbRequest == SET_ADDRESS) && + (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT))) + { + SetDeviceAddress(pInformation->USBwValue0); + pUser_Standard_Requests->User_SetDeviceAddress(); + } + (*pProperty->Process_Status_IN)(); + ControlState = STALLED; + } + else + { + ControlState = STALLED; + } + + pInformation->ControlState = ControlState; + + return Post0_Process(); +} + +/********************************************************************* + * @fn Out0_Process + * + * @brief Process the OUT token on all default endpoint. + * + * @return none + */ +uint8_t Out0_Process(void) +{ + uint32_t ControlState = pInformation->ControlState; + + if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) + { + ControlState = STALLED; + } + else if ((ControlState == OUT_DATA) || (ControlState == LAST_OUT_DATA)) + { + DataStageOut(); + ControlState = pInformation->ControlState; + } + else if (ControlState == WAIT_STATUS_OUT) + { + (*pProperty->Process_Status_OUT)(); + ControlState = STALLED; + } + else + { + ControlState = STALLED; + } + + pInformation->ControlState = ControlState; + + return Post0_Process(); +} + +/********************************************************************* + * @fn Post0_Process + * + * @brief Stall the Endpoint 0 in case of error. + * + * @return 0 - if the control State is in PAUSE + * 1 - if not. + */ +uint8_t Post0_Process(void) +{ + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + + if (pInformation->ControlState == STALLED) + { + vSetEPRxStatus(EP_RX_STALL); + vSetEPTxStatus(EP_TX_STALL); + } + + return (pInformation->ControlState == PAUSE); +} + +/********************************************************************* + * @fn SetDeviceAddress + * + * @brief Set the device and all the used Endpoints addresses. + * + * @param Val - device address. + * + * @return none + */ +void SetDeviceAddress(uint8_t Val) +{ + uint32_t i; + uint32_t nEP = Device_Table.Total_Endpoint; + + for (i = 0; i < nEP; i++) + { + _SetEPAddress((uint8_t)i, (uint8_t)i); + } + + _SetDADDR(Val | DADDR_EF); +} + +/********************************************************************* + * @fn NOP_Process + * + * @brief No operation function. + * + * @return none + */ +void NOP_Process(void) +{ +} + + + + diff --git a/V203F6P6/ch32v203/usbd/src/usb_endp.cpp b/V203F6P6/ch32v203/usbd/src/usb_endp.cpp new file mode 100644 index 0000000..975d3c8 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/usb_endp.cpp @@ -0,0 +1,52 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_endp.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Endpoint routines +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "usb_lib.h" +#include "usb_desc.h" +#include "usb_mem.h" +#include "hw_config.h" +#include "usb_istr.h" +#include "usb_pwr.h" +#include "usb_prop.h" +#include "cdc_class.h" + +/********************************************************************* + * @fn EP2_IN_Callback + * + * @brief Endpoint 1 IN. + * + * @return none + */ +void EP1_IN_Callback (void) +{ + +} + +/********************************************************************* + * @fn EP2_OUT_Callback + * + * @brief Endpoint 2 OUT. + * + * @return none + */ +void EP2_OUT_Callback (void) { + if (cdc_instance) cdc_instance->ep2outHandler(); +} +/********************************************************************* + * @fn EP3_IN_Callback + * + * @brief Endpoint 3 IN. + * + * @return none + */ +void EP3_IN_Callback (void) { + if (cdc_instance) cdc_instance->ep3inHandler(); +} diff --git a/V203F6P6/ch32v203/usbd/src/usb_init.c b/V203F6P6/ch32v203/usbd/src/usb_init.c new file mode 100644 index 0000000..2c421f5 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/usb_init.c @@ -0,0 +1,42 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_init.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Initialization routines & global variables +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "usb_lib.h" + +uint8_t EPindex; +DEVICE_INFO *pInformation; +DEVICE_PROP *pProperty; +uint16_t SaveState ; +uint16_t wInterrupt_Mask; +DEVICE_INFO Device_Info; +USER_STANDARD_REQUESTS *pUser_Standard_Requests; + +/******************************************************************************* + * @fn USB_Init + * + * @brief USB system initialization + * + * @return None. + * + */ +void USB_Init(void) +{ + pInformation = &Device_Info; + pInformation->ControlState = 2; + pProperty = &Device_Property; + pUser_Standard_Requests = &User_Standard_Requests; + pProperty->Init(); +} + + + + + diff --git a/V203F6P6/ch32v203/usbd/src/usb_int.c b/V203F6P6/ch32v203/usbd/src/usb_int.c new file mode 100644 index 0000000..57ffd01 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/usb_int.c @@ -0,0 +1,130 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_int.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Endpoint CTR (Low and High) interrupt's service routines +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "usb_lib.h" + +/* Private variables */ +__IO uint16_t SaveRState; +__IO uint16_t SaveTState; + +/* Extern variables */ +extern void (*pEpInt_IN[7])(void); /* Handles IN interrupts */ +extern void (*pEpInt_OUT[7])(void); /* Handles OUT interrupts */ + +/******************************************************************************* + * @fn CTR_LP. + * + * @brief Low priority Endpoint Correct Transfer interrupt's service + * routine. + * + * @return None. + */ +void CTR_LP(void) +{ + __IO uint16_t wEPVal = 0; + + while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) + { + EPindex = (uint8_t)(wIstr & ISTR_EP_ID); + + if (EPindex == 0) + { + SaveRState = _GetENDPOINT(ENDP0); + SaveTState = SaveRState & EPTX_STAT; + SaveRState &= EPRX_STAT; + + _SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK); + + if ((wIstr & ISTR_DIR) == 0) + { + _ClearEP_CTR_TX(ENDP0); + In0_Process(); + + _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); + return; + } + else + { + wEPVal = _GetENDPOINT(ENDP0); + + if ((wEPVal &EP_SETUP) != 0) + { + _ClearEP_CTR_RX(ENDP0); + Setup0_Process(); + _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); + return; + } + else if ((wEPVal & EP_CTR_RX) != 0) + { + _ClearEP_CTR_RX(ENDP0); + Out0_Process(); + _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState); + return; + } + } + } + else + { + wEPVal = _GetENDPOINT(EPindex); + if ((wEPVal & EP_CTR_RX) != 0) + { + _ClearEP_CTR_RX(EPindex); + (*pEpInt_OUT[EPindex-1])(); + } + + if ((wEPVal & EP_CTR_TX) != 0) + { + _ClearEP_CTR_TX(EPindex); + (*pEpInt_IN[EPindex-1])(); + } + } + } +} +#if 0 +/******************************************************************************* + * @fn CTR_HP. + * + * @brief High Priority Endpoint Correct Transfer interrupt's service + * routine. + * + * @return None. + */ +void CTR_HP(void) +{ + uint32_t wEPVal = 0; + + while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) + { + _SetISTR((uint16_t)CLR_CTR); + EPindex = (uint8_t)(wIstr & ISTR_EP_ID); + wEPVal = _GetENDPOINT(EPindex); + + if ((wEPVal & EP_CTR_RX) != 0) + { + _ClearEP_CTR_RX(EPindex); + (*pEpInt_OUT[EPindex-1])(); + } + else if ((wEPVal & EP_CTR_TX) != 0) + { + _ClearEP_CTR_TX(EPindex); + (*pEpInt_IN[EPindex-1])(); + } + } +} +#endif + + + + + + + + diff --git a/V203F6P6/ch32v203/usbd/src/usb_istr.c b/V203F6P6/ch32v203/usbd/src/usb_istr.c new file mode 100644 index 0000000..c69fce2 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/usb_istr.c @@ -0,0 +1,196 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_istr.c + * Author : WCH + * Version : V1.0.1 + * Date : 2022/12/28 + * Description : ISTR events interrupt service routines +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "usb_lib.h" +#include "usb_prop.h" +#include "usb_pwr.h" +#include "usb_istr.h" + +uint16_t Ep0RxBlks; + +/* Private variables */ +__IO uint16_t wIstr; +static __IO uint8_t bIntPackSOF = 0; +static __IO uint32_t esof_counter =0; +static __IO uint32_t wCNTR=0; + +/* function pointers to non-control endpoints service routines */ +void (*pEpInt_IN[7])(void) ={ + EP1_IN_Callback, + EP2_IN_Callback, + EP3_IN_Callback, + EP4_IN_Callback, + EP5_IN_Callback, + EP6_IN_Callback, + EP7_IN_Callback, +}; + +void (*pEpInt_OUT[7])(void) ={ + EP1_OUT_Callback, + EP2_OUT_Callback, + EP3_OUT_Callback, + EP4_OUT_Callback, + EP5_OUT_Callback, + EP6_OUT_Callback, + EP7_OUT_Callback, +}; + +/******************************************************************************* + * @fn USB_Istr + * + * @brief ISTR events interrupt service routine + * + * @return None. + */ +void USB_Istr(void) +{ + uint32_t i=0; + __IO uint32_t EP[8]; + if ((*_pEPRxCount(0) & 0xFC00 )!= Ep0RxBlks) + { + *_pEPRxCount(0) |= (Ep0RxBlks & 0xFC00); + } + wIstr = _GetISTR(); +#if (IMR_MSK & ISTR_SOF) + if (wIstr & ISTR_SOF & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_SOF); + bIntPackSOF++; +/* +#ifdef SOF_CALLBACK + SOF_Callback(); + +#endif*/ + } +#endif + + +#if (IMR_MSK & ISTR_CTR) + if (wIstr & ISTR_CTR & wInterrupt_Mask) + { + CTR_LP(); +/*#ifdef CTR_CALLBACK + CTR_Callback(); +#endif*/ + } +#endif + +#if (IMR_MSK & ISTR_RESET) + if (wIstr & ISTR_RESET & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_RESET); + Device_Property.Reset(); + +/*#ifdef RESET_CALLBACK + RESET_Callback(); +#endif*/ + } +#endif + +#if (IMR_MSK & ISTR_DOVR) + if (wIstr & ISTR_DOVR & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_DOVR); +/*#ifdef DOVR_CALLBACK + DOVR_Callback(); +#endif*/ + } +#endif + +#if (IMR_MSK & ISTR_ERR) + if (wIstr & ISTR_ERR & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_ERR); +/*#ifdef ERR_CALLBACK + ERR_Callback(); +#endif*/ + } +#endif + +#if (IMR_MSK & ISTR_WKUP) + if (wIstr & ISTR_WKUP & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_WKUP); + Resume(RESUME_EXTERNAL); +/*#ifdef WKUP_CALLBACK + WKUP_Callback(); +#endif*/ + } +#endif +#if (IMR_MSK & ISTR_SUSP) + if (wIstr & ISTR_SUSP & wInterrupt_Mask) + { + if (fSuspendEnabled) + { + Suspend(); + } + else + { + Resume(RESUME_LATER); + } + _SetISTR((uint16_t)CLR_SUSP); +/*#ifdef SUSP_CALLBACK + SUSP_Callback(); +#endif*/ + } +#endif + +#if (IMR_MSK & ISTR_ESOF) + if (wIstr & ISTR_ESOF & wInterrupt_Mask) + { + _SetISTR((uint16_t)CLR_ESOF); + + if ((_GetFNR()&FNR_RXDP)!=0) + { + esof_counter ++; + + if ((esof_counter >3)&&((_GetCNTR()&CNTR_FSUSP)==0)) + { + + wCNTR = _GetCNTR(); + + for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i); + + wCNTR|=CNTR_FRES; + _SetCNTR(wCNTR); + + wCNTR&=~CNTR_FRES; + _SetCNTR(wCNTR); + + while((_GetISTR()&ISTR_RESET) == 0); + + _SetISTR((uint16_t)CLR_RESET); + + for (i=0;i<8;i++) + _SetENDPOINT(i, EP[i]); + + esof_counter = 0; + } + } + else + { + esof_counter = 0; + } + + Resume(RESUME_ESOF); + +/*#ifdef ESOF_CALLBACK + ESOF_Callback(); +#endif*/ + } +#endif +} /* USB_Istr */ + + + + + + diff --git a/V203F6P6/ch32v203/usbd/src/usb_mem.c b/V203F6P6/ch32v203/usbd/src/usb_mem.c new file mode 100644 index 0000000..7d65f82 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/usb_mem.c @@ -0,0 +1,74 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_mem.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Utility functions for memory transfers to/from PMA +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "usb_lib.h" + + +/******************************************************************************* + * @fn UserToPMABufferCopy + * + * @brief Copy a buffer from user memory area to packet memory area (PMA) + * + * @param pbUsrBuf: pointer to user memory area. + * wPMABufAddr: address into PMA. + * wNBytes: no. of bytes to be copied. + * + * @param None . + */ +void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + uint32_t n = (wNBytes + 1) >> 1; + uint32_t i, temp1, temp2; + uint16_t *pdwVal; + pdwVal = (uint16_t *)(wPMABufAddr * 2 + PMAAddr); + + for (i = n; i != 0; i--) + { + temp1 = (uint16_t) * pbUsrBuf; + pbUsrBuf++; + temp2 = temp1 | (uint16_t) * pbUsrBuf << 8; + *pdwVal++ = temp2; + pdwVal++; + pbUsrBuf++; + } +} + +/******************************************************************************* + * @fn PMAToUserBufferCopy + * + * @brief Copy a buffer from user memory area to packet memory area (PMA) + * + * @param pbUsrBuf: pointer to user memory area. + * wPMABufAddr: address into PMA. + * wNBytes: no. of bytes to be copied. + * + * @param None. + */ +void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + uint32_t n = (wNBytes + 1) >> 1; + uint32_t i; + uint32_t *pdwVal; + + pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr); + + for (i = n; i != 0; i--) + { + *(uint16_t*)pbUsrBuf++ = *pdwVal++; + pbUsrBuf++; + } +} + + + + + + diff --git a/V203F6P6/ch32v203/usbd/src/usb_prop.cpp b/V203F6P6/ch32v203/usbd/src/usb_prop.cpp new file mode 100644 index 0000000..730140c --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/usb_prop.cpp @@ -0,0 +1,423 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_prop.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : All processing related to Virtual Com Port Demo +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "usb_lib.h" +#include "usb_conf.h" +#include "usb_prop.h" +#include "usb_desc.h" +#include "usb_pwr.h" +#include "hw_config.h" +#include "cdc_class.h" + +uint8_t Request = 0; + +//extern uint8_t USBD_Endp3_Busy; +static USB_CDC_LineCoding line_coding; + + +DEVICE Device_Table = +{ + EP_NUM, + 1 +}; + +DEVICE_PROP Device_Property = +{ + USBD_init, + USBD_Reset, + USBD_Status_In, + USBD_Status_Out, + USBD_Data_Setup, + USBD_NoData_Setup, + USBD_Get_Interface_Setting, + USBD_GetDeviceDescriptor, + USBD_GetConfigDescriptor, + USBD_GetStringDescriptor, + 0, + DEF_USBD_UEP0_SIZE +}; + +USER_STANDARD_REQUESTS User_Standard_Requests = +{ + USBD_GetConfiguration, + USBD_SetConfiguration, + USBD_GetInterface, + USBD_SetInterface, + USBD_GetStatus, + USBD_ClearFeature, + USBD_SetEndPointFeature, + USBD_SetDeviceFeature, + USBD_SetDeviceAddress +}; + +ONE_DESCRIPTOR Device_Descriptor = +{ + (uint8_t*)USBD_DeviceDescriptor, + USBD_SIZE_DEVICE_DESC +}; + +ONE_DESCRIPTOR Config_Descriptor = +{ + (uint8_t*)USBD_ConfigDescriptor, + USBD_SIZE_CONFIG_DESC +}; + +ONE_DESCRIPTOR String_Descriptor[4] = +{ + {(uint8_t*)USBD_StringLangID, USBD_SIZE_STRING_LANGID}, + {(uint8_t*)USBD_StringVendor, USBD_SIZE_STRING_VENDOR}, + {(uint8_t*)USBD_StringProduct,USBD_SIZE_STRING_PRODUCT}, + {(uint8_t*)USBD_StringSerial, USBD_SIZE_STRING_SERIAL} +}; + +/********************************************************************* + * @fn USBD_SetConfiguration. + * + * @brief Update the device state to configured. + * + * @return None. + */ +void USBD_SetConfiguration(void) +{ + DEVICE_INFO *pInfo = &Device_Info; + + if (pInfo->Current_Configuration != 0) + { + bDeviceState = CONFIGURED; + } +} + +/******************************************************************************* + * @fn USBD_SetDeviceAddress. + * + * @brief Update the device state to addressed. + * + * @return None. + */ +void USBD_SetDeviceAddress (void) +{ + bDeviceState = ADDRESSED; +} + + +/********************************************************************* + * @fn USBD_SetDeviceFeature. + * + * @brief SetDeviceFeature Routine. + * + * @return none + */ +void USBD_SetDeviceFeature (void) +{ + +} + + + +/********************************************************************* + * @fn USBD_ClearFeature. + * + * @brief ClearFeature Routine. + * + * @return none + */ +void USBD_ClearFeature(void) +{ + +} + + + + + +/********************************************************************* + * @fn USBD_Status_In. + * + * @brief USBD Status In Routine. + * + * @return None. + */ +void USBD_Status_In(void) +{ + uint32_t Request_No = pInformation->USBbRequest; + if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) + { + if (Request_No == CDC_SET_LINE_CODING) + { + //UART2_USB_Init(); // TODO + if (cdc_instance) cdc_instance->ctrl (USB_USART_SET_PARAM, & line_coding, sizeof (line_coding)); + } + } +} + +/******************************************************************************* + * @fn USBD_Status_Out + * + * @brief USBD Status OUT Routine. + * + * @return None. + */ +void USBD_Status_Out(void) +{ + +} + +/******************************************************************************* + * @fn USBD_init. + * + * @brief init routine. + * + * @return None. + */ +extern "C" void Delay_Ms (const unsigned); + +void USBD_init(void) +{ + uint8_t i; + + pInformation->Current_Configuration = 0; + PowerOn(); + for (i=0;i<8;i++) _SetENDPOINT(i,_GetENDPOINT(i) & 0x7F7F & EPREG_MASK);//all clear + _SetISTR((uint16_t)0x00FF);//all clear + USB_SIL_Init(); + bDeviceState = UNCONNECTED; + + USB_Port_Set(DISABLE, DISABLE); + Delay_Ms(20); + USB_Port_Set(ENABLE, ENABLE); +} + +/******************************************************************************* + * @fn USBD_Reset + * + * @brief USBD reset routine + * + * @return None. + */ +void USBD_Reset(void) +{ + pInformation->Current_Configuration = 0; + pInformation->Current_Feature = USBD_ConfigDescriptor[7]; + pInformation->Current_Interface = 0; + + SetBTABLE(BTABLE_ADDRESS); + + SetEPType(ENDP0, EP_CONTROL); + SetEPTxStatus(ENDP0, EP_TX_STALL); + SetEPRxAddr(ENDP0, ENDP0_RXADDR); + SetEPTxAddr(ENDP0, ENDP0_TXADDR); + Clear_Status_Out(ENDP0); + SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); + SetEPRxValid(ENDP0); + _ClearDTOG_RX(ENDP0); + _ClearDTOG_TX(ENDP0); + + SetEPType(ENDP1, EP_INTERRUPT); + SetEPTxStatus(ENDP1, EP_TX_NAK); + SetEPTxAddr(ENDP1, ENDP1_TXADDR); + SetEPRxStatus(ENDP1, EP_RX_DIS); + _ClearDTOG_TX(ENDP1); + _ClearDTOG_RX(ENDP1); + + SetEPType(ENDP2, EP_BULK); + SetEPTxStatus(ENDP2, EP_TX_DIS); + SetEPRxAddr(ENDP2, ENDP2_RXADDR); + SetEPRxCount(ENDP2, DEF_USBD_MAX_PACK_SIZE); + SetEPRxStatus(ENDP2,EP_RX_VALID); + _ClearDTOG_RX(ENDP2); + _ClearDTOG_TX(ENDP2); + + SetEPType(ENDP3, EP_BULK); + SetEPTxStatus(ENDP3, EP_TX_NAK); + SetEPTxAddr(ENDP3, ENDP3_TXADDR); + SetEPRxStatus(ENDP3, EP_RX_DIS); + _ClearDTOG_TX(ENDP3); + _ClearDTOG_RX(ENDP3); + + SetDeviceAddress(0); + + bDeviceState = ATTACHED; +} + +/******************************************************************************* + * @fn USBD_GetDeviceDescriptor. + * + * @brief Gets the device descriptor. + * + * @param Length. + * + * @return The address of the device descriptor. + */ +uint8_t *USBD_GetDeviceDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Device_Descriptor); +} + +/******************************************************************************* + * @fn USBD_GetConfigDescriptor. + * + * @brief get the configuration descriptor. + * + * @param Length. + * + * @return The address of the configuration descriptor. + */ +uint8_t *USBD_GetConfigDescriptor(uint16_t Length) +{ + return Standard_GetDescriptorData(Length, &Config_Descriptor); +} + +/******************************************************************************* + * @fn USBD_GetStringDescriptor + * + * @brief Gets the string descriptors according to the needed index + * + * @param Length. + * + * @return The address of the string descriptors. + */ +uint8_t *USBD_GetStringDescriptor(uint16_t Length) +{ + uint8_t wValue0 = pInformation->USBwValue0; + + if (wValue0 > 4) + { + return nullptr; + } + else + { + return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]); + } +} + +/********************************************************************* + * @fn USBD_Get_Interface_Setting. + * + * @brief test the interface and the alternate setting according to the + * supported one. + * + * @param Interface: interface number. + * AlternateSetting: Alternate Setting number. + * + * @return USB_UNSUPPORT or USB_SUCCESS. + */ +RESULT USBD_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting) +{ + if (AlternateSetting > 0) + { + return USB_UNSUPPORT; + } + else if (Interface > 1) + { + return USB_UNSUPPORT; + } + + return USB_SUCCESS; +} + +/********************************************************************* + * @fn USB_CDC_GetLineCoding. + * + * @brief send the linecoding structure to the PC host. + * + * @param Length + * + * @return Inecoding structure base address. + */ +uint8_t *USB_CDC_GetLineCoding( uint16_t Length ) +{ + if( Length == 0 ) + { + pInformation->Ctrl_Info.Usb_wLength = 7; + return nullptr; + } + return (uint8_t*) & line_coding; +} +/********************************************************************* + * @fn USB_CDC_SetLineCoding. + * + * @brief Set the linecoding structure fields. + * + * @param Length + * + * @return Inecoding structure base address. + */ +uint8_t *USB_CDC_SetLineCoding( uint16_t Length ) +{ + if( Length == 0 ) + { + pInformation->Ctrl_Info.Usb_wLength = 7; + return nullptr; + } + return (uint8_t*) & line_coding; +} + + +/********************************************************************* + * @fn USBD_Data_Setup + * + * @brief handle the data class specific requests + * + * @param Request Nb. + * + * @return USB_UNSUPPORT or USB_SUCCESS. + */ +RESULT USBD_Data_Setup(uint8_t RequestNo) +{ + uint32_t Request_No = pInformation->USBbRequest; + uint8_t *(*CopyRoutine)(uint16_t); + CopyRoutine = nullptr; + if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) { + return USB_UNSUPPORT; + } else if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) { + if (Request_No == CDC_GET_LINE_CODING) { + CopyRoutine = &USB_CDC_GetLineCoding; + } else if (Request_No == CDC_SET_LINE_CODING) { + CopyRoutine = &USB_CDC_SetLineCoding; + } else { + return USB_UNSUPPORT; + } + } + if (CopyRoutine) { + pInformation->Ctrl_Info.CopyData = CopyRoutine; + pInformation->Ctrl_Info.Usb_wOffset = 0; + (*CopyRoutine)( 0 ); + } else { + return( USB_UNSUPPORT ); + } + return USB_SUCCESS; +} + +/******************************************************************************* + * @fn USBD_NoData_Setup. + * + * @brief handle the no data class specific requests. + * + * @param Request Nb. + * + * @return USB_UNSUPPORT or USB_SUCCESS. + */ +RESULT USBD_NoData_Setup(uint8_t RequestNo) +{ + uint32_t Request_No = pInformation->USBbRequest; + + if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) { + if (Request_No == CDC_SET_LINE_CTLSTE) { + uint16_t ww = pInformation->USBwValues.w >> 8; + if (cdc_instance) cdc_instance->ctrl (USB_USART_SET_DTR_RTS, & ww, 2); + } else if (Request_No == CDC_SEND_BREAK) { + + } else { + return USB_UNSUPPORT; + } + } + return USB_SUCCESS; +} diff --git a/V203F6P6/ch32v203/usbd/src/usb_pwr.c b/V203F6P6/ch32v203/usbd/src/usb_pwr.c new file mode 100644 index 0000000..4632069 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/usb_pwr.c @@ -0,0 +1,215 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_pwr.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Connection/disconnection & power management +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "usb_lib.h" +#include "usb_conf.h" +#include "usb_pwr.h" +#include "hw_config.h" + +__IO uint32_t bDeviceState = UNCONNECTED; +__IO bool fSuspendEnabled = TRUE; +__IO uint32_t EP[8]; + +struct +{ + __IO RESUME_STATE eState; + __IO uint8_t bESOFcnt; +} +ResumeS; + +__IO uint32_t remotewakeupon=0; + +/******************************************************************************* + * @fn PowerOn + * + * @brief Enable power on. + * + * @return USB_SUCCESS. + */ +RESULT PowerOn(void) +{ + uint16_t wRegVal; + + wRegVal = CNTR_FRES; + _SetCNTR(wRegVal); + wInterrupt_Mask = 0; + _SetCNTR(wInterrupt_Mask); + _SetISTR(0); + wInterrupt_Mask = CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM; + _SetCNTR(wInterrupt_Mask); + + return USB_SUCCESS; +} + +/******************************************************************************* + * @fn PowerOff + * + * @brief handles switch-off conditions + * + * @return USB_SUCCESS. + */ +RESULT PowerOff() +{ + _SetCNTR(CNTR_FRES); + _SetISTR(0); + _SetCNTR(CNTR_FRES + CNTR_PDWN); + + return USB_SUCCESS; +} + +/******************************************************************************* + * @fn Suspend + * + * @brief sets suspend mode operating conditions + * + * @return USB_SUCCESS. + */ +void Suspend(void) +{ + uint32_t i =0; + uint16_t wCNTR; + + wCNTR = _GetCNTR(); + for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i); + + wCNTR|=CNTR_RESETM; + _SetCNTR(wCNTR); + + wCNTR|=CNTR_FRES; + _SetCNTR(wCNTR); + + wCNTR&=~CNTR_FRES; + _SetCNTR(wCNTR); + + while((_GetISTR()&ISTR_RESET) == 0); + + _SetISTR((uint16_t)CLR_RESET); + + for (i=0;i<8;i++) + _SetENDPOINT(i, EP[i]); + + wCNTR |= CNTR_FSUSP; + _SetCNTR(wCNTR); + + wCNTR = _GetCNTR(); + wCNTR |= CNTR_LPMODE; + _SetCNTR(wCNTR); + + Enter_LowPowerMode(); +} + +/******************************************************************************* + * @fn Resume_Init + * + * @brief Handles wake-up restoring normal operations + * + * @return USB_SUCCESS. + */ +void Resume_Init(void) +{ + uint16_t wCNTR; + + wCNTR = _GetCNTR(); + wCNTR &= (~CNTR_LPMODE); + _SetCNTR(wCNTR); + Leave_LowPowerMode(); + _SetCNTR(IMR_MSK); +} + +/******************************************************************************* + * @fn Resume + * + * @brief This is the state machine handling resume operations and + * timing sequence. The control is based on the Resume structure + * variables and on the ESOF interrupt calling this subroutine + * without changing machine state. + * + * @param a state machine value (RESUME_STATE) + * RESUME_ESOF doesn't change ResumeS.eState allowing + * decrementing of the ESOF counter in different states. + * + * @return None. + */ +void Resume(RESUME_STATE eResumeSetVal) +{ + uint16_t wCNTR; + + if (eResumeSetVal != RESUME_ESOF) + { + ResumeS.eState = eResumeSetVal; + } + + switch (ResumeS.eState) + { + case RESUME_EXTERNAL: + if (remotewakeupon ==0) + { + Resume_Init(); + ResumeS.eState = RESUME_OFF; + } + else + { + ResumeS.eState = RESUME_ON; + } + break; + + case RESUME_INTERNAL: + Resume_Init(); + ResumeS.eState = RESUME_START; + remotewakeupon = 1; + break; + + case RESUME_LATER: + ResumeS.bESOFcnt = 2; + ResumeS.eState = RESUME_WAIT; + break; + + case RESUME_WAIT: + ResumeS.bESOFcnt--; + if (ResumeS.bESOFcnt == 0) + ResumeS.eState = RESUME_START; + break; + + case RESUME_START: + wCNTR = _GetCNTR(); + wCNTR |= CNTR_RESUME; + _SetCNTR(wCNTR); + ResumeS.eState = RESUME_ON; + ResumeS.bESOFcnt = 10; + break; + + case RESUME_ON: + ResumeS.bESOFcnt--; + if (ResumeS.bESOFcnt == 0) + { + wCNTR = _GetCNTR(); + wCNTR &= (~CNTR_RESUME); + _SetCNTR(wCNTR); + ResumeS.eState = RESUME_OFF; + remotewakeupon = 0; + } + break; + + case RESUME_OFF: + + case RESUME_ESOF: + + default: + ResumeS.eState = RESUME_OFF; + break; + } +} + + + + + + diff --git a/V203F6P6/ch32v203/usbd/src/usb_regs.c b/V203F6P6/ch32v203/usbd/src/usb_regs.c new file mode 100644 index 0000000..57a2094 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/usb_regs.c @@ -0,0 +1,852 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_regs.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Interface functions to USB cell registers +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "usb_lib.h" + +/******************************************************************************* + * @fn SetCNTR. + * + * @brief Set the CNTR register value. + * + * @param wRegValue: new register value. + * + * @return None. + */ +void SetCNTR(uint16_t wRegValue) +{ + _SetCNTR(wRegValue); +} + +/******************************************************************************* + * @fn GetCNTR. + * + * @brief returns the CNTR register value. + * + * @param None. + * + * @return CNTR register Value. + */ +uint16_t GetCNTR(void) +{ + return(_GetCNTR()); +} + +/******************************************************************************* + * @fn SetISTR. + * + * @brief Set the ISTR register value. + * + * @param wRegValue: new register value. + * + * @return None. + */ +void SetISTR(uint16_t wRegValue) +{ + _SetISTR(wRegValue); +} + +/******************************************************************************* + * @fn GetISTR + * + * @brief Returns the ISTR register value. + * + * @param None. + * + * @return ISTR register Value + */ +uint16_t GetISTR(void) +{ + return(_GetISTR()); +} + +/******************************************************************************* + * @fn GetFNR + * + * @brief Returns the FNR register value. + * + * @param None. + * + * @return FNR register Value + */ +uint16_t GetFNR(void) +{ + return(_GetFNR()); +} + +/******************************************************************************* + * @fn SetDADDR + * + * @brief Set the DADDR register value. + * + * @param wRegValue: new register value. + * + * @return None. + */ +void SetDADDR(uint16_t wRegValue) +{ + _SetDADDR(wRegValue); +} + +/******************************************************************************* + * @fn GetDADDR + * + * @brief Returns the DADDR register value. + * + * @return DADDR register Value + * + */ +uint16_t GetDADDR(void) +{ + return(_GetDADDR()); +} + +/******************************************************************************* + * @fn SetBTABLE + * + * @brief Set the BTABLE. + * + * @param wRegValue: New register value. + * + * @return None. + */ +void SetBTABLE(uint16_t wRegValue) +{ + _SetBTABLE(wRegValue); +} + +/******************************************************************************* + * @fn GetBTABLE. + * + * @param Returns the BTABLE register value. + * + * @return BTABLE address. + */ +uint16_t GetBTABLE(void) +{ + return(_GetBTABLE()); +} + +/******************************************************************************* + * @fn SetENDPOINT + * + * @brief Set the Endpoint register value. + * + * @param bEpNum: Endpoint Number. + * wRegValue. + * + * @return None. + */ +void SetENDPOINT(uint8_t bEpNum, uint16_t wRegValue) +{ + _SetENDPOINT(bEpNum, wRegValue); +} + +/******************************************************************************* + * @fn GetENDPOINT + * + * @brief Return the Endpoint register value. + * + * @param bEpNum: Endpoint Number. + * + * @return Endpoint register value. + */ +uint16_t GetENDPOINT(uint8_t bEpNum) +{ + return(_GetENDPOINT(bEpNum)); +} + +/******************************************************************************* + * @fn SetEPType + * + * @brief sets the type in the endpoint register. + * + * @param bEpNum: Endpoint Number. + * wType: type definition. + * + * @return None. + */ +void SetEPType(uint8_t bEpNum, uint16_t wType) +{ + _SetEPType(bEpNum, wType); +} + +/******************************************************************************* + * @fn GetEPType + * + * @brief Returns the endpoint type. + * + * @param bEpNum: Endpoint Number. + * + * @return Endpoint Type + */ +uint16_t GetEPType(uint8_t bEpNum) +{ + return(_GetEPType(bEpNum)); +} + +/******************************************************************************* + * @fn SetEPTxStatus + * + * @brief Set the status of Tx endpoint. + * + * @param bEpNum: Endpoint Number. + * wState: new state. + * + * @return None. + */ +void SetEPTxStatus(uint8_t bEpNum, uint16_t wState) +{ + _SetEPTxStatus(bEpNum, wState); +} + +/******************************************************************************* + * @fn SetEPRxStatus + * + * @brief Set the status of Rx endpoint. + * + * @param bEpNum: Endpoint Number. + * wState: new state. + * + * @return None. + */ +void SetEPRxStatus(uint8_t bEpNum, uint16_t wState) +{ + _SetEPRxStatus(bEpNum, wState); +} + +/******************************************************************************* + * @fn SetDouBleBuffEPStall + * + * @brief sets the status for Double Buffer Endpoint to STALL + * + * @param bEpNum: Endpoint Number. + * bDir: Endpoint direction. + * + * @return None. + */ +void SetDouBleBuffEPStall(uint8_t bEpNum, uint8_t bDir) +{ + uint16_t Endpoint_DTOG_Status; + + Endpoint_DTOG_Status = GetENDPOINT(bEpNum); + + if (bDir == EP_DBUF_OUT) + { + _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPRX_DTOG1); + } + else if (bDir == EP_DBUF_IN) + { + _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPTX_DTOG1); + } +} + +/******************************************************************************* + * @fn GetEPTxStatus + * + * @brief Returns the endpoint Tx status. + * + * @param bEpNum: Endpoint Number. + * + * @return Endpoint TX Status + */ +uint16_t GetEPTxStatus(uint8_t bEpNum) +{ + return(_GetEPTxStatus(bEpNum)); +} + +/******************************************************************************* + * @fn GetEPRxStatus + * + * @brief Returns the endpoint Rx status. + * + * @param bEpNum: Endpoint Number. + * + * @return Endpoint RX Status + */ +uint16_t GetEPRxStatus(uint8_t bEpNum) +{ + return(_GetEPRxStatus(bEpNum)); +} + +/******************************************************************************* + * @fn SetEPTxValid + * + * @brief Valid the endpoint Tx Status. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void SetEPTxValid(uint8_t bEpNum) +{ + _SetEPTxStatus(bEpNum, EP_TX_VALID); +} + +/******************************************************************************* + * @fn SetEPRxValid + * + * @brief Valid the endpoint Rx Status. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void SetEPRxValid(uint8_t bEpNum) +{ + _SetEPRxStatus(bEpNum, EP_RX_VALID); +} + +/******************************************************************************* + * @fn SetEP_KIND + * + * @brief Clear the EP_KIND bit. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void SetEP_KIND(uint8_t bEpNum) +{ + _SetEP_KIND(bEpNum); +} + +/******************************************************************************* + * @fn ClearEP_KIND + * + * @brief set the EP_KIND bit. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void ClearEP_KIND(uint8_t bEpNum) +{ + _ClearEP_KIND(bEpNum); +} +/******************************************************************************* + * @fn Clear_Status_Out + * + * @brief Clear the Status Out of the related Endpoint + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void Clear_Status_Out(uint8_t bEpNum) +{ + _ClearEP_KIND(bEpNum); +} +/******************************************************************************* + * @fn Set_Status_Out + * + * @brief Set the Status Out of the related Endpoint + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void Set_Status_Out(uint8_t bEpNum) +{ + _SetEP_KIND(bEpNum); +} +/******************************************************************************* + * @fn SetEPDoubleBuff + * + * @brief Enable the double buffer feature for the endpoint. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void SetEPDoubleBuff(uint8_t bEpNum) +{ + _SetEP_KIND(bEpNum); +} +/******************************************************************************* + * @fn ClearEPDoubleBuff + * + * @brief Disable the double buffer feature for the endpoint. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void ClearEPDoubleBuff(uint8_t bEpNum) +{ + _ClearEP_KIND(bEpNum); +} +/******************************************************************************* + * @fn GetTxStallStatus + * + * @brief Returns the Stall status of the Tx endpoint. + * + * @param bEpNum: Endpoint Number. + * + * @return Tx Stall status. + */ +uint16_t GetTxStallStatus(uint8_t bEpNum) +{ + return(_GetTxStallStatus(bEpNum)); +} +/******************************************************************************* + * @fn GetRxStallStatus + * + * @brief Returns the Stall status of the Rx endpoint. + * + * @param bEpNum: Endpoint Number. + * + * @return Rx Stall status. + */ +uint16_t GetRxStallStatus(uint8_t bEpNum) +{ + return(_GetRxStallStatus(bEpNum)); +} +/******************************************************************************* + * @fn ClearEP_CTR_RX + * + * @brief Clear the CTR_RX bit. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void ClearEP_CTR_RX(uint8_t bEpNum) +{ + _ClearEP_CTR_RX(bEpNum); +} +/******************************************************************************* + * @fn ClearEP_CTR_TX + * + * @brief Clear the CTR_TX bit. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void ClearEP_CTR_TX(uint8_t bEpNum) +{ + _ClearEP_CTR_TX(bEpNum); +} +/******************************************************************************* + * @fn ToggleDTOG_RX + * + * @brief Toggle the DTOG_RX bit. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void ToggleDTOG_RX(uint8_t bEpNum) +{ + _ToggleDTOG_RX(bEpNum); +} +/******************************************************************************* + * @fn ToggleDTOG_TX + * + * @brief Toggle the DTOG_TX bit. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void ToggleDTOG_TX(uint8_t bEpNum) +{ + _ToggleDTOG_TX(bEpNum); +} +/******************************************************************************* + * @fn ClearDTOG_RX. + * + * @brief Clear the DTOG_RX bit. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void ClearDTOG_RX(uint8_t bEpNum) +{ + _ClearDTOG_RX(bEpNum); +} +/******************************************************************************* + * @fn ClearDTOG_TX. + * + * @brief Clear the DTOG_TX bit. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +void ClearDTOG_TX(uint8_t bEpNum) +{ + _ClearDTOG_TX(bEpNum); +} +/******************************************************************************* + * @fn SetEPAddress + * + * @brief Set the endpoint address. + * + * @param bEpNum: Endpoint Number. + * bAddr: New endpoint address. + * + * @return None. + */ +void SetEPAddress(uint8_t bEpNum, uint8_t bAddr) +{ + _SetEPAddress(bEpNum, bAddr); +} +/******************************************************************************* + * @fn GetEPAddress + * + * @brief Get the endpoint address. + * + * @param bEpNum: Endpoint Number. + * + * @return Endpoint address. + */ +uint8_t GetEPAddress(uint8_t bEpNum) +{ + return(_GetEPAddress(bEpNum)); +} +/******************************************************************************* + * @fn SetEPTxAddr + * + * @brief Set the endpoint Tx buffer address. + * + * @param bEpNum: Endpoint Number. + * wAddr: new address. + * + * @return None. + */ +void SetEPTxAddr(uint8_t bEpNum, uint16_t wAddr) +{ + _SetEPTxAddr(bEpNum, wAddr); +} +/******************************************************************************* + * @fn SetEPRxAddr + * + * @brief Set the endpoint Rx buffer address. + * + * @param bEpNum: Endpoint Number. + * wAddr: new address. + * + * @return None. + */ +void SetEPRxAddr(uint8_t bEpNum, uint16_t wAddr) +{ + _SetEPRxAddr(bEpNum, wAddr); +} +/******************************************************************************* + * @fn GetEPTxAddr + * + * @brief Returns the endpoint Tx buffer address. + * + * @param bEpNum: Endpoint Number. + * + * @return Rx buffer address. + */ +uint16_t GetEPTxAddr(uint8_t bEpNum) +{ + return(_GetEPTxAddr(bEpNum)); +} +/******************************************************************************* + * @fn GetEPRxAddr. + * + * @brief Returns the endpoint Rx buffer address. + * + * @param bEpNum: Endpoint Number. + * + * @returnRx buffer address. + */ +uint16_t GetEPRxAddr(uint8_t bEpNum) +{ + return(_GetEPRxAddr(bEpNum)); +} +/******************************************************************************* + * @fn SetEPTxCount. + * + * @brief Set the Tx count. + * + * @param bEpNum: Endpoint Number. + * wCount: new count value. + * + * @return None. + */ +void SetEPTxCount(uint8_t bEpNum, uint16_t wCount) +{ + _SetEPTxCount(bEpNum, wCount); +} +/******************************************************************************* + * @fn SetEPCountRxReg. + * + * @brief Set the Count Rx Register value. + * + * @param *pdwReg: point to the register. + * wCount: the new register value. + * + * @return None. + */ +void SetEPCountRxReg(uint32_t *pdwReg, uint16_t wCount) +{ + _SetEPCountRxReg(dwReg, wCount); +} +/******************************************************************************* + * @fn SetEPRxCount + * + * @brief Set the Rx count. + * + * @param bEpNum: Endpoint Number. + * wCount: the new count value. + * + * @return None. + */ +void SetEPRxCount(uint8_t bEpNum, uint16_t wCount) +{ + _SetEPRxCount(bEpNum, wCount); +} +/******************************************************************************* + * @fn GetEPTxCount + * + * @brief Get the Tx count. + * + * @param bEpNum: Endpoint Number. + * + * @return Tx count value. + */ +uint16_t GetEPTxCount(uint8_t bEpNum) +{ + return(_GetEPTxCount(bEpNum)); +} +/******************************************************************************* + * @fn GetEPRxCount + * + * @brief Get the Rx count. + * + * @param bEpNum: Endpoint Number. + * + * @return Rx count value. + */ +uint16_t GetEPRxCount(uint8_t bEpNum) +{ + return(_GetEPRxCount(bEpNum)); +} +/******************************************************************************* + * @fn SetEPDblBuffAddr + * + * @brief Set the addresses of the buffer 0 and 1. + * + * @param bEpNum: Endpoint Number. + * wBuf0Addr: new address of buffer 0. + * wBuf1Addr: new address of buffer 1. + * + * @return None. + */ +void SetEPDblBuffAddr(uint8_t bEpNum, uint16_t wBuf0Addr, uint16_t wBuf1Addr) +{ + _SetEPDblBuffAddr(bEpNum, wBuf0Addr, wBuf1Addr); +} +/******************************************************************************* + * @fn SetEPDblBuf0Addr + * + * @brief Set the Buffer 1 address. + * + * @param bEpNum: Endpoint Number + * wBuf0Addr: new address. + * + * @return None. + */ +void SetEPDblBuf0Addr(uint8_t bEpNum, uint16_t wBuf0Addr) +{ + _SetEPDblBuf0Addr(bEpNum, wBuf0Addr); +} +/******************************************************************************* + * @fn SetEPDblBuf1Addr + * + * @brief Set the Buffer 1 address. + * + * @param bEpNum: Endpoint Number + * wBuf1Addr: new address. + * + * @return None. + */ +void SetEPDblBuf1Addr(uint8_t bEpNum, uint16_t wBuf1Addr) +{ + _SetEPDblBuf1Addr(bEpNum, wBuf1Addr); +} +/******************************************************************************* + * @fn GetEPDblBuf0Addr + * + * @brief Returns the address of the Buffer 0. + * + * @param bEpNum: Endpoint Number. + * + * @return None. + */ +uint16_t GetEPDblBuf0Addr(uint8_t bEpNum) +{ + return(_GetEPDblBuf0Addr(bEpNum)); +} +/******************************************************************************* + * @fn GetEPDblBuf1Addr + * + * @brief Returns the address of the Buffer 1. + * + * @param bEpNum: Endpoint Number. + * + * @return Address of the Buffer 1. + */ +uint16_t GetEPDblBuf1Addr(uint8_t bEpNum) +{ + return(_GetEPDblBuf1Addr(bEpNum)); +} +/******************************************************************************* + * @fn SetEPDblBuffCount + * + * @brief Set the number of bytes for a double Buffer + * endpoint. + * + * @param bEpNum,bDir, wCount + * + * @return None. + */ +void SetEPDblBuffCount(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) +{ + _SetEPDblBuffCount(bEpNum, bDir, wCount); +} +/******************************************************************************* + * @fn SetEPDblBuf0Count + * + * @brief Set the number of bytes in the buffer 0 of a double Buffer + * endpoint. + * + * @param bEpNum, bDir, wCount + * + * @return None. + */ +void SetEPDblBuf0Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) +{ + _SetEPDblBuf0Count(bEpNum, bDir, wCount); +} +/******************************************************************************* + * @fn SetEPDblBuf1Count + * + * @brief Set the number of bytes in the buffer 0 of a double Buffer +* endpoint. + * + * @param bEpNum, bDir, wCount + * + * @return None. + */ +void SetEPDblBuf1Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) +{ + _SetEPDblBuf1Count(bEpNum, bDir, wCount); +} +/******************************************************************************* + * @fn GetEPDblBuf0Count + * + * @brief Returns the number of byte received in the buffer 0 of a double + * Buffer endpoint. + * + * @param bEpNum: Endpoint Number. + * + * @return Endpoint Buffer 0 count + */ +uint16_t GetEPDblBuf0Count(uint8_t bEpNum) +{ + return(_GetEPDblBuf0Count(bEpNum)); +} +/******************************************************************************* + * @fn GetEPDblBuf1Count + * + * @brief Returns the number of data received in the buffer 1 of a double + * Buffer endpoint. + * + * @param bEpNum: Endpoint Number. + * + * @return Endpoint Buffer 1 count. + */ +uint16_t GetEPDblBuf1Count(uint8_t bEpNum) +{ + return(_GetEPDblBuf1Count(bEpNum)); +} +/******************************************************************************* + * @fn GetEPDblBufDir + * + * @brief gets direction of the double buffered endpoint + * + * @param bEpNum: Endpoint Number. + * + * @return EP_DBUF_OUT, EP_DBUF_IN, + * EP_DBUF_ERR if the endpoint counter not yet programmed. + */ +EP_DBUF_DIR GetEPDblBufDir(uint8_t bEpNum) +{ + if ((uint16_t)(*_pEPRxCount(bEpNum) & 0xFC00) != 0) + return(EP_DBUF_OUT); + else if (((uint16_t)(*_pEPTxCount(bEpNum)) & 0x03FF) != 0) + return(EP_DBUF_IN); + else + return(EP_DBUF_ERR); +} +/******************************************************************************* + * @fn FreeUserBuffer + * + * @brief free buffer used from the application realizing it to the line + toggles bit SW_BUF in the double buffered endpoint register + * + * @param bEpNum, bDir + * + * @return None. + */ +void FreeUserBuffer(uint8_t bEpNum, uint8_t bDir) +{ + if (bDir == EP_DBUF_OUT) + { + _ToggleDTOG_TX(bEpNum); + } + else if (bDir == EP_DBUF_IN) + { + _ToggleDTOG_RX(bEpNum); + } +} + +/******************************************************************************* + * @fn ToWord + * + * @brief merge two byte in a word. + * + * @param bh: byte high, bl: bytes low. + * + * @return resulted word. + */ +uint16_t ToWord(uint8_t bh, uint8_t bl) +{ + uint16_t wRet; + wRet = (uint16_t)bl | ((uint16_t)bh << 8); + + return(wRet); +} +/******************************************************************************* + * @fn ByteSwap + * + * @brief Swap two byte in a word. + * + * @param wSwW: word to Swap. + * + * @return resulted word. + */ +uint16_t ByteSwap(uint16_t wSwW) +{ + uint8_t bTemp; + uint16_t wRet; + bTemp = (uint8_t)(wSwW & 0xff); + wRet = (wSwW >> 8) | ((uint16_t)bTemp << 8); + + return(wRet); +} diff --git a/V203F6P6/ch32v203/usbd/src/usb_sil.c b/V203F6P6/ch32v203/usbd/src/usb_sil.c new file mode 100644 index 0000000..8d7adcf --- /dev/null +++ b/V203F6P6/ch32v203/usbd/src/usb_sil.c @@ -0,0 +1,77 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_sil.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : Simplified Interface Layer for Global Initialization and + * Endpoint Rea/Write operations. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "usb_lib.h" + + +/******************************************************************************* + * @fn USB_SIL_Init + * + * @brief Initialize the USB Device IP and the Endpoint 0. + * + * @return Status. + */ +uint32_t USB_SIL_Init(void) +{ + _SetISTR(0); + wInterrupt_Mask = IMR_MSK; + _SetCNTR(wInterrupt_Mask); + + return 0; +} + +/******************************************************************************* + * @fn USB_SIL_Write + * + * @brief Write a buffer of data to a selected endpoint. + * + * @param bEpAddr: The address of the non control endpoint. + * pBufferPointer: The pointer to the buffer of data to be written + * to the endpoint. + * wBufferSize: Number of data to be written (in bytes). + * + * @return Status. + */ +uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize) +{ + UserToPMABufferCopy(pBufferPointer, GetEPTxAddr(bEpAddr & 0x7F), wBufferSize); + SetEPTxCount((bEpAddr & 0x7F), wBufferSize); + + return 0; +} + +/******************************************************************************* + * @fn USB_SIL_Read + * + * @brief Write a buffer of data to a selected endpoint. + * + * @param bEpAddr: The address of the non control endpoint. + * pBufferPointer: The pointer to which will be saved the + * received data buffer. + * + * @return Number of received data (in Bytes). + */ +uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer) +{ + uint32_t DataLength = 0; + + DataLength = GetEPRxCount(bEpAddr & 0x7F); + PMAToUserBufferCopy(pBufferPointer, GetEPRxAddr(bEpAddr & 0x7F), DataLength); + + return DataLength; +} + + + + + + diff --git a/V203F6P6/ch32v203/usbd/usb_desc.h b/V203F6P6/ch32v203/usbd/usb_desc.h new file mode 100644 index 0000000..2fc5976 --- /dev/null +++ b/V203F6P6/ch32v203/usbd/usb_desc.h @@ -0,0 +1,80 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : usb_desc.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/08/08 + * Description : This file contains all the functions prototypes for the + * USB description firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __USB_DESC_H +#define __USB_DESC_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include +/* file version */ +#define DEF_FILE_VERSION 0x01 +/* usb device info define */ +#define DEF_USB_VID 0x1A86 +#define DEF_USB_PID 0xFE0C +/* USB device descriptor, device serial number(bcdDevice) */ +#define DEF_IC_PRG_VER DEF_FILE_VERSION + +/******************************************************************************/ +/* usb device endpoint size define */ +#define DEF_USBD_UEP0_SIZE 64 /* usb hs/fs device end-point 0 size */ +/* FS */ +#define DEF_USBD_FS_PACK_SIZE 64 /* usb fs device max bluk/int pack size */ +#define DEF_USBD_FS_ISO_PACK_SIZE 1023 /* usb fs device max iso pack size */ +/* LS */ +#define DEF_USBD_LS_UEP0_SIZE 8 /* usb ls device end-point 0 size */ +#define DEF_USBD_LS_PACK_SIZE 64 /* usb ls device max int pack size */ + +/* Pack size */ +#define DEF_USBD_ENDP1_SIZE DEF_USBD_FS_PACK_SIZE +#define DEF_USBD_ENDP2_SIZE DEF_USBD_FS_PACK_SIZE +#define DEF_USBD_ENDP3_SIZE DEF_USBD_FS_PACK_SIZE +#define DEF_USBD_ENDP4_SIZE DEF_USBD_FS_PACK_SIZE +#define DEF_USBD_ENDP5_SIZE DEF_USBD_FS_PACK_SIZE +#define DEF_USBD_ENDP6_SIZE DEF_USBD_FS_PACK_SIZE +#define DEF_USBD_ENDP7_SIZE DEF_USBD_FS_PACK_SIZE + +#define DEF_USBD_REPORT_DESC_LEN 0 + +#define DEF_MAX_STRINGS (4) + +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 + +#define DEF_USBD_UEP0_SIZE 64 +#define DEF_USBD_MAX_PACK_SIZE 64 + +#define USBD_SIZE_DEVICE_DESC ((uint16_t) USBD_DeviceDescriptor[0]) +#define USBD_SIZE_CONFIG_DESC ((uint16_t)(USBD_ConfigDescriptor[2] + ((uint16_t)(USBD_ConfigDescriptor[3]) << 8))) +#define USBD_SIZE_STRING_LANGID ((uint16_t) USBD_StringLangID [0]) +#define USBD_SIZE_STRING_VENDOR ((uint16_t) USBD_StringVendor [0]) +#define USBD_SIZE_STRING_PRODUCT ((uint16_t) USBD_StringProduct[0]) +#define USBD_SIZE_STRING_SERIAL ((uint16_t) USBD_StringSerial [0]) + +extern const uint8_t USBD_DeviceDescriptor[]; +extern const uint8_t USBD_ConfigDescriptor[]; + +extern const uint8_t * USBD_StringLangID; +extern const uint8_t * USBD_StringVendor; +extern const uint8_t * USBD_StringProduct; +extern const uint8_t * USBD_StringSerial; + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_DESC_H */ diff --git a/V203F6P6/common/ctrlinterface.h b/V203F6P6/common/ctrlinterface.h new file mode 100644 index 0000000..ca6bc9d --- /dev/null +++ b/V203F6P6/common/ctrlinterface.h @@ -0,0 +1,30 @@ +#ifndef CTRLINTERFACE_DEF_H +#define CTRLINTERFACE_DEF_H +#include +enum CTRL_TYPES_DEF { + UNKNOWN_TYPE = 0, + USB_USART_SET_PARAM, + USB_USART_SET_DTR_RTS, + USB_USART_INIT, +}; +static_assert (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__, "Bad ENDIAN"); +struct USB_CDC_LineCoding { + uint32_t baud; + uint8_t stop, parity, data; + explicit USB_CDC_LineCoding () noexcept : baud (57600u), stop (0u), parity (0u), data (8u) {} +}__attribute__((packed)); +static_assert (sizeof(USB_CDC_LineCoding) == 7, "USB_CDC_LineCoding size error"); +/** @class CtrlInterface + * Abstraktní interface, které je možné podědit třeba ve třídě USART a pomocí + * jediné virtuální metody zadefinovat chování při událostech měnících parametry + * přenosu, přicházejících po USB. Fakticky místo callback funkce, nutí to + * IOCtrl() opravdu přetížit. + * Je to mimo třídu BaseLayer, protože Up třída nemusí být totožná s kontrolní. + * V cdc_class se proto musí nastavit na toto ukazatel pomocí metody attach(). + * */ +class CDC_CtrlInterface { + public: + virtual bool IOCtrl (const CTRL_TYPES_DEF type, const void * data, const uint32_t len) = 0; +}; + +#endif // CTRLINTERFACE_DEF_H diff --git a/V203F6P6/common/mirror.h b/V203F6P6/common/mirror.h new file mode 100644 index 0000000..26f48ce --- /dev/null +++ b/V203F6P6/common/mirror.h @@ -0,0 +1,60 @@ +#ifndef MIRROR_H +#define MIRROR_H + +#include +#include "baselayer.h" + +/** + * @file + * @brief Obraceč datového toku. + * @class Mirror + * @brief Obraceč datového toku má 2 třídy. + * + * TwoTop je vlastní obraceč, dědí vlastnosti BaseLayer, pouze metoda Up je přetížena - + * to je to vlastní převrácení. Hlavní třída Mirror, jejíž instance je pak v kódu použita + * obsahuje 2 rovnocenné instance třídy TwoTop, které musí být ve stacku vždy navrchu. + * První část stacku volá Up jedné instance, druhá Up té druhé. Proto tam musí být dvě. + * Podobně by šel udělat něco jako Fork, odbočení datového toku. + + * A zase - všechny metody jsou tak jednoduché, že jsou celé v hlavičce, tedy inline. + * + * @class TwoTop + * @brief Vlastní obraceč. + * Ono to vypadá hodně zmateně, ale používá se to snadno - dokonce to funguje. + * +*/ + +class TwoTop : public BaseLayer { + public: + /// Konstruktor + explicit TwoTop () noexcept : BaseLayer (), x (nullptr) {}; + /// Setter pro x + void setX (BaseLayer & bl) { x = & bl; }; + /// Přetížení metody Up, nic jiného není potřeba + uint32_t Up (const char* data, uint32_t len) { + if (!x) return 0; // pro jistotu + // To, co přišlo zespoda, pošlu druhou instancí zase dolů + return x->Down (data, len); + }; + private: + /// Fakticky ukazatel na druhou instanci TwoTop + BaseLayer * x; +}; + +class Mirror { + public: + /// Konstruktor + explicit Mirror () noexcept : L(), R() { + L.setX (R); R.setX (L); + }; + /** + Zřetězení voláme 2x. Poprvé pro jednu +=, podruhé -= pro druhou instanci TwoTop. + Protože je tato třída navrchu (vlevo), operátor nic nevrací. + */ + void operator += (BaseLayer& bl) { L += bl; return; }; + void operator -= (BaseLayer& bl) { R += bl; return; }; + private: + TwoTop L, R; //!< 2 instance Top +}; + +#endif // MIRROR_H diff --git a/V203F6P6/common/usart.h b/V203F6P6/common/usart.h index 9c761e5..8d9c9e6 100644 --- a/V203F6P6/common/usart.h +++ b/V203F6P6/common/usart.h @@ -2,6 +2,7 @@ #define USART_H #include "fifo.h" #include "baselayer.h" +#include "ctrlinterface.h" /** @class Usart * @brief Sériový port. * @@ -10,11 +11,13 @@ * Tady u toho typu je pin řízení směru přenosu dělán čistě softwarově, * překrytí je minimální, zdá se že to nevadí. */ -class Usart : public BaseLayer { +class Usart : public BaseLayer, public CDC_CtrlInterface { FIFO tx_ring; public: - explicit Usart (const uint32_t baud = 9600) noexcept; - uint32_t Down (const char * data, const uint32_t len) override; + explicit Usart (const uint32_t baud = 9600) noexcept; + void setBaud (const uint32_t baud); + uint32_t Down (const char * data, const uint32_t len) override; + bool IOCtrl (const CTRL_TYPES_DEF type, const void * data, const uint32_t len) override; void irq (void); }; diff --git a/V203F6P6/usart/Makefile b/V203F6P6/usart/Makefile index 20bee8e..fd93a44 100644 --- a/V203F6P6/usart/Makefile +++ b/V203F6P6/usart/Makefile @@ -9,15 +9,15 @@ VPATH = . ./$(TARGET) ./common BLD = ./build/ DFLAGS = -d LFLAGS = -g -LDLIBS = +LDLIBS = -L./$(TARGET)/usbd -lusbd BFLAGS = --strip-unneeded CFLAGS = -MMD -Wall -Wno-parentheses -ggdb -fno-exceptions -ffunction-sections -fdata-sections -CFLAGS+= -I. -I./$(TARGET) -I./common +CFLAGS+= -I. -I./$(TARGET) -I./$(TARGET)/usbd -I./common DEL = rm -f # zdrojaky -OBJS = main.o usart.o print.o +OBJS = main.o usart.o usb_desc.o #OBJS += include $(TARGET)/$(TOOL).mk diff --git a/V203F6P6/usart/main.cpp b/V203F6P6/usart/main.cpp index 191eb7a..3a6f979 100644 --- a/V203F6P6/usart/main.cpp +++ b/V203F6P6/usart/main.cpp @@ -1,59 +1,35 @@ #include "system.h" #include "gpio.h" #include "usart.h" -#include "print.h" +#include "cdc_class.h" +#include "mirror.h" /********************************************************************************* Sériový port na CH32V203F6P6 je příklad jak by z dokumentace člověka klepla pepka. Podle DS to má jen jeden sériový port, ale vývody USART1 nejsou nijak vyvedeny -z pouzdra. Tak zkusíte USART2, a ejhle, ono to funguje. +z pouzdra. Tak zkusíte USART2, a ejhle, ono to funguje. + +Pro testování USB v režimu device to bylo předěláno na převodník USB na RS485. +Funguje nastavení baudové rychlosti, ostatní parametry jsou ignorovány a pevně +na 8 bitů 1 stop, bez parity. USB má jen jedinou třídu CDC, původní zdroj je +šíleně komplikovaný, takže je to zabaleno do knihovny libusbd.a, vnitřkem tedy +celkem není nutné se zabývat. **********************************************************************************/ -#if 0 -class TEST : public BaseLayer { // Testovací třída pro test příjmu - OK. - static constexpr unsigned buflen = 64u; - char buffer [buflen]; - unsigned rx_index; - GpioClass & led; -public: - explicit TEST (GpioClass & io) noexcept : BaseLayer(), rx_index(0u), led(io) {} - uint32_t Up(const char * data, const uint32_t len) override { - for (unsigned n=0u; n> 8), // idVendor 0x1A86 + (uint8_t)DEF_USB_PID, (uint8_t)(DEF_USB_PID >> 8), // idProduct 0x5537 + DEF_IC_PRG_VER, 0x00, // bcdDevice 0.01 + 0x01, // iManufacturer (String Index) + 0x02, // iProduct (String Index) + 0x03, // iSerialNumber (String Index) + 0x01, // bNumConfigurations 1 +}; + +/* Configuration Descriptor */ +const uint8_t USBD_ConfigDescriptor[] = +{ + /* Configure descriptor */ + 0x09, 0x02, 0x43, 0x00, 0x02, 0x01, 0x00, 0x80, 0x32, + + /* Interface 0 (CDC) descriptor */ + 0x09, 0x04, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, 0x00, + + /* Functional Descriptors */ + 0x05, 0x24, 0x00, 0x10, 0x01, + + /* Length/management descriptor (data class interface 1) */ + 0x05, 0x24, 0x01, 0x00, 0x01, + 0x04, 0x24, 0x02, 0x02, + 0x05, 0x24, 0x06, 0x00, 0x01, + + /* Interrupt upload endpoint descriptor */ + 0x07, 0x05, 0x81, 0x03, (uint8_t)DEF_USBD_ENDP1_SIZE, (uint8_t)( DEF_USBD_ENDP1_SIZE >> 8 ), 0x01, + + /* Interface 1 (data interface) descriptor */ + 0x09, 0x04, 0x01, 0x00, 0x02, 0x0A, 0x00, 0x00, 0x00, + + /* Endpoint descriptor */ + 0x07, 0x05, 0x02, 0x02, (uint8_t)DEF_USBD_ENDP2_SIZE, (uint8_t)( DEF_USBD_ENDP2_SIZE >> 8 ), 0x00, + + /* Endpoint descriptor */ + 0x07, 0x05, 0x83, 0x02, (uint8_t)DEF_USBD_ENDP3_SIZE, (uint8_t)( DEF_USBD_ENDP3_SIZE >> 8 ), 0x00, +}; +#define DEF_STRDESC(p,n) w_text<(sizeof(p)>>1)>n={sizeof(n)-2u,3u,{p}} +template struct w_text { + uint8_t len, typ; + const char16_t str [N]; +}; +static const DEF_STRDESC((u"Kizarm Labs."), str_1); +static const DEF_STRDESC((u"USB <=> RS485"),str_2); +static const DEF_STRDESC((u"0001"), str_3); +/* Language Descriptor */ +static const uint8_t LangDescr[] = { + 0x04, 0x03, 0x09, 0x04 +}; +const uint8_t * USBD_StringLangID = reinterpret_cast(LangDescr); +const uint8_t * USBD_StringVendor = reinterpret_cast(&str_1); +const uint8_t * USBD_StringProduct = reinterpret_cast(&str_2); +const uint8_t * USBD_StringSerial = reinterpret_cast(&str_3); +