9#if defined(RCC_APB1Periph_USB)
11namespace LibXR::CH32::FSDEV
15static constexpr uintptr_t REG_BASE = USB_BASE;
17static constexpr uintptr_t REG_BASE = 0x40005C00UL;
20static inline volatile uint16_t* cntr()
22 return reinterpret_cast<volatile uint16_t*
>(REG_BASE + 0x40U);
24static inline volatile uint16_t* istr()
26 return reinterpret_cast<volatile uint16_t*
>(REG_BASE + 0x44U);
28static inline volatile uint16_t* daddr()
30 return reinterpret_cast<volatile uint16_t*
>(REG_BASE + 0x4CU);
32static inline volatile uint16_t* btable()
34 return reinterpret_cast<volatile uint16_t*
>(REG_BASE + 0x50U);
36static inline volatile uint16_t* ep_reg(uint8_t ep)
38 return reinterpret_cast<volatile uint16_t*
>(REG_BASE +
static_cast<uintptr_t
>(ep) * 4U);
42#if !defined(USB_ISTR_CTR) && defined(ISTR_CTR)
43#define USB_ISTR_CTR ISTR_CTR
45#if !defined(USB_ISTR_RESET) && defined(ISTR_RESET)
46#define USB_ISTR_RESET ISTR_RESET
48#if !defined(USB_ISTR_SUSP) && defined(ISTR_SUSP)
49#define USB_ISTR_SUSP ISTR_SUSP
51#if !defined(USB_ISTR_WKUP) && defined(ISTR_WKUP)
52#define USB_ISTR_WKUP ISTR_WKUP
54#if !defined(USB_ISTR_EP_ID) && defined(ISTR_EP_ID)
55#define USB_ISTR_EP_ID ISTR_EP_ID
58#if !defined(USB_CNTR_FRES) && defined(CNTR_FRES)
59#define USB_CNTR_FRES CNTR_FRES
61#if !defined(USB_CNTR_CTRM) && defined(CNTR_CTRM)
62#define USB_CNTR_CTRM CNTR_CTRM
64#if !defined(USB_CNTR_RESETM) && defined(CNTR_RESETM)
65#define USB_CNTR_RESETM CNTR_RESETM
67#if !defined(USB_CNTR_SUSPM) && defined(CNTR_SUSPM)
68#define USB_CNTR_SUSPM CNTR_SUSPM
70#if !defined(USB_CNTR_WKUPM) && defined(CNTR_WKUPM)
71#define USB_CNTR_WKUPM CNTR_WKUPM
74#if !defined(USB_DADDR_EF) && defined(DADDR_EF)
75#define USB_DADDR_EF DADDR_EF
78#if !defined(USB_EP_CTR_TX) && defined(EP_CTR_TX)
79#define USB_EP_CTR_TX EP_CTR_TX
81#if !defined(USB_EP_CTR_RX) && defined(EP_CTR_RX)
82#define USB_EP_CTR_RX EP_CTR_RX
84#if !defined(USB_EP_SETUP) && defined(EP_SETUP)
85#define USB_EP_SETUP EP_SETUP
87#if !defined(USB_EP_KIND) && defined(EP_KIND)
88#define USB_EP_KIND EP_KIND
90#if !defined(USB_EP_T_FIELD) && defined(EP_T_FIELD)
91#define USB_EP_T_FIELD EP_T_FIELD
93#if !defined(USB_EPADDR_FIELD) && defined(EPADDR_FIELD)
94#define USB_EPADDR_FIELD EPADDR_FIELD
98#define USB_ISTR_CTR 0x8000u
100#ifndef USB_ISTR_RESET
101#define USB_ISTR_RESET 0x0400u
104#define USB_ISTR_SUSP 0x0800u
107#define USB_ISTR_WKUP 0x1000u
109#ifndef USB_ISTR_EP_ID
110#define USB_ISTR_EP_ID 0x000Fu
114#define USB_CNTR_FRES 0x0001u
117#define USB_CNTR_CTRM 0x8000u
119#ifndef USB_CNTR_RESETM
120#define USB_CNTR_RESETM 0x0400u
122#ifndef USB_CNTR_SUSPM
123#define USB_CNTR_SUSPM 0x0800u
125#ifndef USB_CNTR_WKUPM
126#define USB_CNTR_WKUPM 0x1000u
130#define USB_DADDR_EF 0x0080u
134#define USB_EP_CTR_RX 0x8000u
137#define USB_EP_CTR_TX 0x0080u
140#define USB_EP_SETUP 0x0800u
143#define USB_EP_KIND 0x0100u
145#ifndef USB_EP_T_FIELD
146#define USB_EP_T_FIELD 0x0600u
148#ifndef USB_EPADDR_FIELD
149#define USB_EPADDR_FIELD 0x000Fu
153#define USB_EP_TX_NAK 0x0020u
155#ifndef USB_EP_RX_VALID
156#define USB_EP_RX_VALID 0x3000u
159#define USB_EP_RX_NAK 0x2000u
162#ifndef USB_EPREG_MASK
163#define USB_EPREG_MASK \
164 (USB_EP_CTR_RX | USB_EP_SETUP | USB_EP_T_FIELD | USB_EP_KIND | USB_EP_CTR_TX | \
168static inline void clear_istr(uint16_t mask) { *istr() =
static_cast<uint16_t
>(~mask); }
171static inline void set_ep_address(uint8_t ep, uint8_t addr)
173 volatile uint16_t* reg = ep_reg(ep);
174 const uint16_t CUR = *reg;
175 const uint16_t V =
static_cast<uint16_t
>(USB_EP_CTR_RX | USB_EP_CTR_TX |
176 (CUR & (USB_EPREG_MASK & ~USB_EPADDR_FIELD)) |
177 (addr & USB_EPADDR_FIELD));