|
| 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