libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
ch32_usb_fsdev_regs.hpp
1// NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast,performance-no-int-to-ptr)
2#pragma once
3
4#include <cstdint>
5
6#include "ch32_usb.hpp"
7
8// Register helpers for the classic FSDEV/PMA peripheral path.
9#if defined(RCC_APB1Periph_USB)
10
11namespace LibXR::CH32::FSDEV
12{
13
14#ifdef USB_BASE
15static constexpr uintptr_t REG_BASE = USB_BASE;
16#else
17static constexpr uintptr_t REG_BASE = 0x40005C00UL;
18#endif
19
20static inline volatile uint16_t* cntr()
21{
22 return reinterpret_cast<volatile uint16_t*>(REG_BASE + 0x40U);
23}
24static inline volatile uint16_t* istr()
25{
26 return reinterpret_cast<volatile uint16_t*>(REG_BASE + 0x44U);
27}
28static inline volatile uint16_t* daddr()
29{
30 return reinterpret_cast<volatile uint16_t*>(REG_BASE + 0x4CU);
31}
32static inline volatile uint16_t* btable()
33{
34 return reinterpret_cast<volatile uint16_t*>(REG_BASE + 0x50U);
35}
36static inline volatile uint16_t* ep_reg(uint8_t ep)
37{
38 return reinterpret_cast<volatile uint16_t*>(REG_BASE + static_cast<uintptr_t>(ep) * 4U);
39}
40
41// Compatibility aliases from vendor macro names to USB_* names.
42#if !defined(USB_ISTR_CTR) && defined(ISTR_CTR)
43#define USB_ISTR_CTR ISTR_CTR
44#endif
45#if !defined(USB_ISTR_RESET) && defined(ISTR_RESET)
46#define USB_ISTR_RESET ISTR_RESET
47#endif
48#if !defined(USB_ISTR_SUSP) && defined(ISTR_SUSP)
49#define USB_ISTR_SUSP ISTR_SUSP
50#endif
51#if !defined(USB_ISTR_WKUP) && defined(ISTR_WKUP)
52#define USB_ISTR_WKUP ISTR_WKUP
53#endif
54#if !defined(USB_ISTR_EP_ID) && defined(ISTR_EP_ID)
55#define USB_ISTR_EP_ID ISTR_EP_ID
56#endif
57
58#if !defined(USB_CNTR_FRES) && defined(CNTR_FRES)
59#define USB_CNTR_FRES CNTR_FRES
60#endif
61#if !defined(USB_CNTR_CTRM) && defined(CNTR_CTRM)
62#define USB_CNTR_CTRM CNTR_CTRM
63#endif
64#if !defined(USB_CNTR_RESETM) && defined(CNTR_RESETM)
65#define USB_CNTR_RESETM CNTR_RESETM
66#endif
67#if !defined(USB_CNTR_SUSPM) && defined(CNTR_SUSPM)
68#define USB_CNTR_SUSPM CNTR_SUSPM
69#endif
70#if !defined(USB_CNTR_WKUPM) && defined(CNTR_WKUPM)
71#define USB_CNTR_WKUPM CNTR_WKUPM
72#endif
73
74#if !defined(USB_DADDR_EF) && defined(DADDR_EF)
75#define USB_DADDR_EF DADDR_EF
76#endif
77
78#if !defined(USB_EP_CTR_TX) && defined(EP_CTR_TX)
79#define USB_EP_CTR_TX EP_CTR_TX
80#endif
81#if !defined(USB_EP_CTR_RX) && defined(EP_CTR_RX)
82#define USB_EP_CTR_RX EP_CTR_RX
83#endif
84#if !defined(USB_EP_SETUP) && defined(EP_SETUP)
85#define USB_EP_SETUP EP_SETUP
86#endif
87#if !defined(USB_EP_KIND) && defined(EP_KIND)
88#define USB_EP_KIND EP_KIND
89#endif
90#if !defined(USB_EP_T_FIELD) && defined(EP_T_FIELD)
91#define USB_EP_T_FIELD EP_T_FIELD
92#endif
93#if !defined(USB_EPADDR_FIELD) && defined(EPADDR_FIELD)
94#define USB_EPADDR_FIELD EPADDR_FIELD
95#endif
96
97#ifndef USB_ISTR_CTR
98#define USB_ISTR_CTR 0x8000u
99#endif
100#ifndef USB_ISTR_RESET
101#define USB_ISTR_RESET 0x0400u
102#endif
103#ifndef USB_ISTR_SUSP
104#define USB_ISTR_SUSP 0x0800u
105#endif
106#ifndef USB_ISTR_WKUP
107#define USB_ISTR_WKUP 0x1000u
108#endif
109#ifndef USB_ISTR_EP_ID
110#define USB_ISTR_EP_ID 0x000Fu
111#endif
112
113#ifndef USB_CNTR_FRES
114#define USB_CNTR_FRES 0x0001u
115#endif
116#ifndef USB_CNTR_CTRM
117#define USB_CNTR_CTRM 0x8000u
118#endif
119#ifndef USB_CNTR_RESETM
120#define USB_CNTR_RESETM 0x0400u
121#endif
122#ifndef USB_CNTR_SUSPM
123#define USB_CNTR_SUSPM 0x0800u
124#endif
125#ifndef USB_CNTR_WKUPM
126#define USB_CNTR_WKUPM 0x1000u
127#endif
128
129#ifndef USB_DADDR_EF
130#define USB_DADDR_EF 0x0080u
131#endif
132
133#ifndef USB_EP_CTR_RX
134#define USB_EP_CTR_RX 0x8000u
135#endif
136#ifndef USB_EP_CTR_TX
137#define USB_EP_CTR_TX 0x0080u
138#endif
139#ifndef USB_EP_SETUP
140#define USB_EP_SETUP 0x0800u
141#endif
142#ifndef USB_EP_KIND
143#define USB_EP_KIND 0x0100u
144#endif
145#ifndef USB_EP_T_FIELD
146#define USB_EP_T_FIELD 0x0600u
147#endif
148#ifndef USB_EPADDR_FIELD
149#define USB_EPADDR_FIELD 0x000Fu
150#endif
151
152#ifndef USB_EP_TX_NAK
153#define USB_EP_TX_NAK 0x0020u
154#endif
155#ifndef USB_EP_RX_VALID
156#define USB_EP_RX_VALID 0x3000u
157#endif
158#ifndef USB_EP_RX_NAK
159#define USB_EP_RX_NAK 0x2000u
160#endif
161
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 | \
165 USB_EPADDR_FIELD)
166#endif
167
168static inline void clear_istr(uint16_t mask) { *istr() = static_cast<uint16_t>(~mask); }
169
170// Update endpoint address field after clearing previous EA bits.
171static inline void set_ep_address(uint8_t ep, uint8_t addr)
172{
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));
178 *reg = V;
179}
180
181} // namespace LibXR::CH32::FSDEV
182
183#endif // defined(RCC_APB1Periph_USB)
184
185// NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast,performance-no-int-to-ptr)