Skip to content

Commit 0d344fa

Browse files
authored
Add tinyusb builtin-core support with menu selection (openwch#121)
* add makeboards.py for generating boards.txt use the newly generated boards.txt * add Adafruit TinyUSB as submodule in libraries * add TinyUSB core support for ch32v20x * added tiyusb usbfs/usbhs for ch32v3 * update tinyusb lib * update makeboards.py for CH32L10x_EVT HSI_LP
1 parent b2c30ee commit 0d344fa

File tree

7 files changed

+427
-93
lines changed

7 files changed

+427
-93
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "libraries/Adafruit_TinyUSB_Arduino"]
2+
path = libraries/Adafruit_TinyUSB_Arduino
3+
url = https://github.com/adafruit/Adafruit_TinyUSB_Arduino.git

boards.txt

Lines changed: 111 additions & 90 deletions
Large diffs are not rendered by default.

cores/arduino/WSerial.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
#include "variant.h"
55
#include "HardwareSerial.h"
66

7+
#if defined(USE_TINYUSB)
8+
#include "Adafruit_USBD_CDC.h"
9+
#define Serial SerialTinyUSB
10+
#endif
711

812
#if defined(UART_MODULE_ENABLED) && !defined(UART_MODULE_ONLY)
913

cores/arduino/main.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,17 @@
1010
int main( void )
1111
{
1212
pre_init( );
13+
#if defined(USE_TINYUSB)
14+
TinyUSB_Device_Init(0);
15+
#endif
1316
setup( );
1417

1518
do {
1619
loop( );
17-
20+
#if defined(USE_TINYUSB)
21+
TinyUSB_Device_Task();
22+
TinyUSB_Device_FlushCDC();
23+
#endif
1824
} while (1);
1925

2026
return 0;

libraries/Adafruit_TinyUSB_Arduino

platform.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ compiler.elf2lst.extra_flags=
7979

8080
# USB Flags
8181
# ---------
82-
build.usb_flags=-DUSBCON {build.usb_speed} -DUSBD_VID={build.vid} -DUSBD_PID={build.pid} -DHAL_PCD_MODULE_ENABLED
82+
#build.usb_flags=-DUSBCON {build.usb_speed} -DUSBD_VID={build.vid} -DUSBD_PID={build.pid} -DHAL_PCD_MODULE_ENABLED
83+
build.usb_flags=
8384

8485
# Specify defaults for vid/pid, since an empty value is impossible to
8586
# detect in the preprocessor, but a 0 can be checked for.
@@ -89,7 +90,7 @@ build.pid=0
8990

9091
# Build information's
9192
#####################-D{build.board} -DARDUINO_ARCH_{build.arch} -DBOARD_NAME="{build.board}" -DVARIANT_H="{build.variant_h}"
92-
build.info.flags=-DARDUINO_ARCH_CH32 -D{build.series} -DARDUINO={runtime.ide.version} -D{build.chip} -DVARIANT_H="{build.variant_h}"
93+
build.info.flags=-DARDUINO_ARCH_CH32 -D{build.series} -DARDUINO={runtime.ide.version} -D{build.chip} -DVARIANT_H="{build.variant_h}" {build.usb_flags}
9394

9495
# Defaults config
9596
build.xSerial=

tools/makeboards.py

Lines changed: 298 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
#!/usr/bin/env python3
2+
3+
4+
# mcu: march, mabi, math_lib_gcc, IQ_math_RV32, ch_extra_lib
5+
mcu_list = {
6+
'QingKe-V2A': {'march': 'rv32ecxw', 'mabi': 'ilp32e', 'ch_extra_lib': '-lprintf'},
7+
'QingKe-V2C': {'march': 'rv32ecxw', 'mabi': 'ilp32e', 'ch_extra_lib': '-lprintf'},
8+
'QingKe-V3A': {'march': 'rv32imac', 'mabi': 'ilp32', 'ch_extra_lib': '-lprintf'},
9+
'QingKe-V4B': {'march': 'rv32imacxw', 'mabi': 'ilp32', 'ch_extra_lib': '-lprintf'},
10+
'QingKe-V4C': {'march': 'rv32imacxw', 'mabi': 'ilp32', 'ch_extra_lib': '-lprintf'},
11+
'QingKe-V4F': {'march': 'rv32imafcxw', 'mabi': 'ilp32f', 'ch_extra_lib': '-lprintfloat'},
12+
}
13+
14+
usb_list = {
15+
'tinyusb_usbd': {
16+
'name': 'Adafruit TinyUSB with USBD',
17+
'usb_flags': '-DUSBCON -DUSE_TINYUSB -DCFG_TUD_WCH_USBIP_FSDEV=1 "-I{runtime.platform.path}/libraries/Adafruit_TinyUSB_Arduino/src/arduino"'
18+
},
19+
'tinyusb_usbfs': {
20+
'name': 'Adafruit TinyUSB with USBFS',
21+
'usb_flags': '-DUSBCON -DUSE_TINYUSB -DCFG_TUD_WCH_USBIP_USBFS=1 "-I{runtime.platform.path}/libraries/Adafruit_TinyUSB_Arduino/src/arduino"'
22+
},
23+
'tinyusb_usbhs': {
24+
'name': 'Adafruit TinyUSB with USBHS',
25+
'usb_flags': '-DUSBCON -DUSE_TINYUSB -DCFG_TUD_WCH_USBIP_USBHS=1 "-I{runtime.platform.path}/libraries/Adafruit_TinyUSB_Arduino/src/arduino"'
26+
},
27+
}
28+
29+
# series: name, pnums
30+
board_list = {
31+
'CH32V00x': {
32+
'name': 'CH32V00x_EVT',
33+
'info': '',
34+
'usb': [],
35+
'hsi': [48, 24, 8],
36+
'hse': [48, 24, 8],
37+
'pnums': {
38+
'CH32V003F4': {'name': 'CH32V003F4 EVT', 'maximum_size': 16384, 'maximum_data_size': 2048, 'mcu': 'QingKe-V2A', 'chip': 'CH32V003F4'},
39+
}
40+
},
41+
'CH32VM00X': {
42+
'name': 'CH32VM00X_EVT',
43+
'info': 'including V/M 002 004 005 006 007',
44+
'usb': [],
45+
'hsi': [48, 24, 8],
46+
'hse': [48, 24, 8],
47+
'pnums': {
48+
'CH32V006K8': {'name': 'CH32V006K8 EVT', 'maximum_size': 63488, 'maximum_data_size': 8192, 'mcu': 'QingKe-V2C', 'chip': 'CH32V006K8'},
49+
}
50+
},
51+
'CH32X035': {
52+
'name': 'CH32X035_EVT',
53+
'info': '',
54+
'usb': [],
55+
'hsi': [48, 24, 16, 12, 8],
56+
'hse': [],
57+
'pnums': {
58+
'CH32X035G8U': {'name': 'CH32X035G8U EVT', 'maximum_size': 63488, 'maximum_data_size': 20480, 'mcu': 'QingKe-V4C', 'chip': 'CH32X035G8U'},
59+
}
60+
},
61+
'CH32V10x': {
62+
'name': 'CH32V10x_EVT',
63+
'info': '-lprintf, CH32V10x_3V3: 3.3V power supply CH32V10x_5V: 5V power supply',
64+
'usb': [],
65+
'hsi': [72, 56, 48, 8],
66+
'hse': [72, 56, 48, 8],
67+
'pnums': {
68+
'CH32V103R8T6': {'name': 'CH32V103R8T6 EVT', 'maximum_size': 65536, 'maximum_data_size': 20480, 'mcu': 'QingKe-V3A', 'chip': 'CH32V10x_3V3'},
69+
}
70+
},
71+
'CH32V20x': {
72+
'name': 'CH32V20x_EVT',
73+
'info': '',
74+
'usb': ['tinyusb_usbd', 'tinyusb_usbfs'],
75+
'hsi': [144, 120, 96, 72, 56, 48, 0],
76+
'hse': [144, 120, 96, 72, 56, 48, 0],
77+
'pnums': {
78+
'CH32V203RB': {'name': 'CH32V203RB EVT', 'maximum_size': 131072, 'maximum_data_size': 65536, 'mcu': 'QingKe-V4C', 'chip': 'CH32V203'},
79+
'CH32V203G8': {'name': 'CH32V203G8 EVT', 'maximum_size': 65536, 'maximum_data_size': 20480, 'mcu': 'QingKe-V4B', 'chip': 'CH32V203'},
80+
'CH32V203C8': {'name': 'CH32V203C8', 'maximum_size': 65536, 'maximum_data_size': 20480, 'mcu': 'QingKe-V4B', 'chip': 'CH32V203'},
81+
'CH32V203C6': {'name': 'CH32V203C6', 'maximum_size': 32768, 'maximum_data_size': 20480, 'mcu': 'QingKe-V4B', 'chip': 'CH32V203'},
82+
}
83+
},
84+
'CH32V30x': {
85+
'name': 'CH32V30x_EVT',
86+
'info': '-lprintfloat, CH32V30x_C: connected product_line CH32V30x: normal product_line',
87+
'usb': ['tinyusb_usbhs', 'tinyusb_usbfs'],
88+
'hsi': [144, 120, 96, 72, 56, 48, 0],
89+
'hse': [144, 120, 96, 72, 56, 48, 0],
90+
'pnums': {
91+
'CH32V307VCT6': {'name': 'CH32V307VCT6 EVT', 'maximum_size': 262144, 'maximum_data_size': 65536, 'mcu': 'QingKe-V4F', 'chip': 'CH32V30x_C'},
92+
}
93+
},
94+
'CH32L10x': {
95+
'name': 'CH32L10x_EVT',
96+
'info': '-lprintf',
97+
'usb': [],
98+
'hsi': [96, 72, 56, 48, 0, 'HSI_LP'],
99+
'hse': [96, 72, 56, 48, 0],
100+
'pnums': {
101+
'CH32L103C8T6': {'name': 'CH32L103C8T6 EVT', 'maximum_size': 65536, 'maximum_data_size': 20480, 'mcu': 'QingKe-V4C', 'chip': 'CH32L10x'},
102+
}
103+
}
104+
}
105+
106+
107+
def build_global_menu():
108+
print("""# See: https://arduino.github.io/arduino-cli/latest/platform-specification/
109+
110+
menu.pnum=Board Select
111+
menu.clock=Clock Select
112+
menu.xserial=U(S)ART support
113+
menu.usb=USB support (if available)
114+
menu.xusb=USB speed (if available)
115+
menu.virtio=Virtual serial support
116+
117+
menu.opt=Optimize
118+
menu.dbg=Debug symbols and core logs
119+
menu.rtlib=C Runtime Library
120+
menu.upload_method=Upload method""")
121+
122+
123+
def build_header(series, values):
124+
print()
125+
print()
126+
print()
127+
print('#'*78)
128+
name = values["name"]
129+
print(f'##{name} Board {values["info"]}')
130+
print()
131+
print(f'{name}.name={series}')
132+
print(f'{name}.build.core=arduino')
133+
print(f'{name}.build.board={name}')
134+
print(f'{name}.upload.maximum_size=0')
135+
print(f'{name}.upload.maximum_data_size=0')
136+
print(f'{name}.build.variant_h=variant_{{build.board}}.h')
137+
print(f'{name}.debug.tool=gdb-WCH_LinkE')
138+
print()
139+
140+
141+
def build_pnum(series, values):
142+
print()
143+
for p, pv in values['pnums'].items():
144+
menu = f'{values["name"]}.menu.pnum.{p}'
145+
mcu = pv["mcu"]
146+
print(f'#{pv["name"]} Board')
147+
print(f'{menu}={pv["name"]}')
148+
print(f'{menu}.node={p.replace("CH32", "NODE_")}')
149+
print(f'{menu}.upload.maximum_size={pv["maximum_size"]}')
150+
print(f'{menu}.upload.maximum_data_size={pv["maximum_data_size"]}')
151+
print(f'{menu}.build.mcu={mcu}')
152+
print(f'{menu}.build.board={p}')
153+
print(f'{menu}.build.series={series}')
154+
print(f'{menu}.build.variant={series}/{p}')
155+
print(f'{menu}.build.chip={pv["chip"]}')
156+
print(f'{menu}.build.march={mcu_list[mcu]["march"]}')
157+
print(f'{menu}.build.mabi={mcu_list[mcu]["mabi"]}')
158+
print(f'{menu}.build.math_lib_gcc=-lm')
159+
print(f'{menu}.build.IQ_math_RV32=')
160+
print(f'{menu}.build.ch_extra_lib={mcu_list[mcu]["ch_extra_lib"]}')
161+
print()
162+
163+
164+
def build_usb(series, values):
165+
if len(values['usb']) == 0:
166+
return
167+
print()
168+
print("# USB support")
169+
name = values["name"]
170+
menu = f'{name}.menu.usb'
171+
print(f'{menu}.none=None')
172+
print(f'{menu}.none.build.usb_flags=')
173+
for usb in values['usb']:
174+
print(f'{menu}.{usb}={usb_list[usb]["name"]}')
175+
print(f'{menu}.{usb}.build.usb_flags={usb_list[usb]["usb_flags"]}')
176+
177+
178+
def build_upload(series, values):
179+
print()
180+
print("# Upload menu")
181+
name = values["name"]
182+
menu = f'{name}.menu.upload_method'
183+
print(f'{menu}.swdMethod=WCH-SWD')
184+
print(f'{menu}.swdMethod.upload.protocol=')
185+
print(f'{menu}.swdMethod.upload.options=')
186+
print(f'{menu}.swdMethod.upload.tool=WCH_linkE')
187+
print()
188+
189+
190+
def build_optimization(series, values):
191+
print()
192+
print("# Optimizations")
193+
name = values["name"]
194+
menu = f'{name}.menu.opt'
195+
196+
print(f'{menu}.osstd=Smallest (-Os default)')
197+
print(f'{menu}.osstd.build.flags.optimize=-Os')
198+
print(f'{menu}.oslto=Smallest (-Os) with LTO')
199+
print(f'{menu}.oslto.build.flags.optimize=-Os -flto')
200+
201+
print(f'{menu}.o1std=Fast (-O1)')
202+
print(f'{menu}.o1std.build.flags.optimize=-O1')
203+
print(f'{menu}.o1lto=Fast (-O1) with LTO')
204+
print(f'{menu}.o1lto.build.flags.optimize=-O1 -flto')
205+
206+
print(f'{menu}.o2std=Faster (-O2)')
207+
print(f'{menu}.o2std.build.flags.optimize=-O2')
208+
print(f'{menu}.o2lto=Faster (-O2) with LTO')
209+
print(f'{menu}.o2lto.build.flags.optimize=-O2 -flto')
210+
211+
print(f'{menu}.o3std=Fastest (-O3)')
212+
print(f'{menu}.o3std.build.flags.optimize=-O3')
213+
print(f'{menu}.o3lto=Fastest (-O3) with LTO')
214+
print(f'{menu}.o3lto.build.flags.optimize=-O3 -flto')
215+
216+
print(f'{menu}.ogstd=Debug (-Og)')
217+
print(f'{menu}.ogstd.build.flags.optimize=-Og')
218+
print(f'{menu}.o0std=No Optimization (-O0)')
219+
print(f'{menu}.o0std.build.flags.optimize=-O0')
220+
print()
221+
222+
223+
def build_clock(series, values):
224+
print()
225+
print("# Clock Select")
226+
name = values["name"]
227+
menu = f'{name}.menu.clock'
228+
for hsi in values['hsi']:
229+
if hsi == 0:
230+
print(f'{menu}.HSI=HSI Internal')
231+
print(f'{menu}.HSI.build.flags.clock=-DSYSCLK_FREQ_HSI=HSI_VALUE')
232+
elif hsi == 'HSI_LP':
233+
print(f'{menu}.HSI_LP=HSI_LP Internal')
234+
print(f'{menu}.HSI_LP.build.flags.clock=-DSYSCLK_FREQ_HSI_LP=HSI_LP_VALUE')
235+
else:
236+
print(f'{menu}.{hsi}MHz_HSI={hsi}MHz Internal')
237+
print(f'{menu}.{hsi}MHz_HSI.build.flags.clock=-DSYSCLK_FREQ_{hsi}MHz_HSI={hsi}000000')
238+
for hse in values['hse']:
239+
if hse == 0:
240+
print(f'{menu}.HSE=HSE External')
241+
print(f'{menu}.HSE.build.flags.clock=-DSYSCLK_FREQ_HSE=HSE_VALUE')
242+
else:
243+
print(f'{menu}.{hse}MHz_HSE={hse}MHz External')
244+
print(f'{menu}.{hse}MHz_HSE.build.flags.clock=-DSYSCLK_FREQ_{hse}MHz_HSE={hse}000000')
245+
print()
246+
247+
248+
def build_debug(series, values):
249+
print()
250+
print("# Debug information")
251+
name = values["name"]
252+
menu = f'{name}.menu.dbg'
253+
print(f'{menu}.none=None')
254+
print(f'{menu}.none.build.flags.debug=-DNDEBUG')
255+
print(f'{menu}.enable_sym=Symbols Enabled (-g)')
256+
print(f'{menu}.enable_sym.build.flags.debug=-g -DNDEBUG')
257+
print(f'{menu}.enable_log=Core logs Enabled')
258+
print(f'{menu}.enable_log.build.flags.debug=')
259+
print(f'{menu}.enable_all=Core Logs and Symbols Enabled (-g)')
260+
print(f'{menu}.enable_all.build.flags.debug=-g')
261+
print()
262+
263+
264+
def build_runtimelib(series, values):
265+
print()
266+
print("# C Runtime Library")
267+
name = values["name"]
268+
menu = f'{name}.menu.rtlib'
269+
print(f'{menu}.nano=Newlib Nano (default)')
270+
print(f'{menu}.nano.build.flags.ldflags=--specs=nano.specs --specs=nosys.specs')
271+
print(f'{menu}.nanofp=Newlib Nano + Float Printf')
272+
print(f'{menu}.nanofp.build.flags.ldflags=--specs=nano.specs --specs=nosys.specs -u _printf_float')
273+
print(f'{menu}.nanofs=Newlib Nano + Float Scanf')
274+
print(f'{menu}.nanofs.build.flags.ldflags=--specs=nano.specs --specs=nosys.specs -u _scanf_float')
275+
print(f'{menu}.nanofps=Newlib Nano + Float Printf/Scanf')
276+
print(f'{menu}.nanofps.build.flags.ldflags=--specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float')
277+
print(f'{menu}.full=Newlib Standard')
278+
print(f'{menu}.full.build.flags.ldflags=--specs=nosys.specs')
279+
print()
280+
281+
282+
def make_board(series, values):
283+
build_header(series, values)
284+
build_pnum(series, values)
285+
build_usb(series, values)
286+
build_upload(series, values)
287+
build_clock(series, values)
288+
build_optimization(series, values)
289+
build_debug(series, values)
290+
build_runtimelib(series, values)
291+
292+
# ------------------------------
293+
# main
294+
# ------------------------------
295+
build_global_menu()
296+
297+
for k, v in board_list.items():
298+
make_board(k, v)

0 commit comments

Comments
 (0)