From 04a2e47fb3f34587725982d461e0922e175a0f47 Mon Sep 17 00:00:00 2001 From: Andrew Mirsky Date: Thu, 16 Oct 2025 14:18:38 -0400 Subject: [PATCH] Arduino Uno Q - STM32U585 (preliminary) --- ports/stm/boards/arduino_uno_q/board.c | 29 +++ .../stm/boards/arduino_uno_q/mpconfigboard.h | 46 +++++ .../stm/boards/arduino_uno_q/mpconfigboard.mk | 36 ++++ ports/stm/boards/arduino_uno_q/pins.c | 168 ++++++++++++++++++ 4 files changed, 279 insertions(+) create mode 100644 ports/stm/boards/arduino_uno_q/board.c create mode 100644 ports/stm/boards/arduino_uno_q/mpconfigboard.h create mode 100644 ports/stm/boards/arduino_uno_q/mpconfigboard.mk create mode 100644 ports/stm/boards/arduino_uno_q/pins.c diff --git a/ports/stm/boards/arduino_uno_q/board.c b/ports/stm/boards/arduino_uno_q/board.c new file mode 100644 index 0000000000000..f37ed04cfe45a --- /dev/null +++ b/ports/stm/boards/arduino_uno_q/board.c @@ -0,0 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2025 ajmirsky + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/stm/boards/arduino_uno_q/mpconfigboard.h b/ports/stm/boards/arduino_uno_q/mpconfigboard.h new file mode 100644 index 0000000000000..0d82d87eb42a7 --- /dev/null +++ b/ports/stm/boards/arduino_uno_q/mpconfigboard.h @@ -0,0 +1,46 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2025 ajmirsky + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "Arduino Uno Q" +#define MICROPY_HW_MCU_NAME "STM32U585" + +#define FLASH_SIZE (0x200000) // 2MB +#define FLASH_PAGE_SIZE (0x4000) // 8kB + +#define HSE_VALUE ((uint32_t)25000000) +#define BOARD_NO_VBUS_SENSE (1) + +// optional +// #define BOARD_HAS_LOW_SPEED_CRYSTAL (1) +// #define LSE_VALUE ((uint32_t)32000U) +#define BOARD_HAS_LOW_SPEED_CRYSTAL (0) + +#define DEFAULT_I2C_BUS_SCL (&pin_PD12) +#define DEFAULT_I2C_BUS_SDA (&pin_PD12) + +#define MICROPY_FATFS_EXFAT 0 diff --git a/ports/stm/boards/arduino_uno_q/mpconfigboard.mk b/ports/stm/boards/arduino_uno_q/mpconfigboard.mk new file mode 100644 index 0000000000000..c47c42e701238 --- /dev/null +++ b/ports/stm/boards/arduino_uno_q/mpconfigboard.mk @@ -0,0 +1,36 @@ +USB_VID = 0x0483 +USB_PID = 0x5xxx +USB_PRODUCT = "ARDUINO-UNO-Q - CPy" +USB_MANUFACTURER = "STMicroelectronics" + +INTERNAL_FLASH_FILESYSTEM = 1 + +MCU_SERIES = F4 +MCU_VARIANT = STM32U585xx +MCU_PACKAGE = LQFP48 + +LD_COMMON = boards/common_default.ld +LD_FILE = boards/STM32U585_fs.ld + +# Too big for the flash +CIRCUITPY_AUDIOCORE = 0 +CIRCUITPY_AUDIOPWMIO = 0 +CIRCUITPY_BITMAPFILTER = 0 +CIRCUITPY_BITMAPTOOLS = 0 +CIRCUITPY_BLEIO_HCI = 0 +CIRCUITPY_VECTORIO = 0 +CIRCUITPY_TOUCHIO = 0 +CIRCUITPY_RAINBOWIO = 0 +CIRCUITPY_USB_HID = 0 +CIRCUITPY_USB_MIDI = 0 +CIRCUITPY_JSON = 0 +# Requires neopixel_write or SPI (dotstar) +CIRCUITPY_PIXELBUF = 0 +# No requirements, but takes extra flash +CIRCUITPY_ULAB = 0 +CIRCUITPY_GAMEPADSHIFT = 0 +CIRCUITPY_BITBANGIO = 0 +CIRCUITPY_NEOPIXEL_WRITE = 0 +CIRCUITPY_SDCARDIO = 0 +CIRCUITPY_DISPLAYIO = 0 +CIRCUITPY_KEYPAD = 0 diff --git a/ports/stm/boards/arduino_uno_q/pins.c b/ports/stm/boards/arduino_uno_q/pins.c new file mode 100644 index 0000000000000..5ffeb727d8ab9 --- /dev/null +++ b/ports/stm/boards/arduino_uno_q/pins.c @@ -0,0 +1,168 @@ +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + {MP_ROM_QSTR(MP_QSTR_ID), MP_ROM_PTR(&board_module_id_obj)}, + + {MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PB07)}, + {MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PB06)}, + {MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PB03)}, + {MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PB00)}, + {MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA12)}, + {MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA11)}, + {MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PB01)}, + {MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PB02)}, + {MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PB04)}, + {MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PB08)}, + {MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PB09)}, + {MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PB15)}, + {MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PB14)}, + {MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PB13)}, + {MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_PA04)}, + {MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_PA05)}, + {MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_PA06)}, + {MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_PA07)}, + {MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_PC01)}, + {MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_PC00)}, + {MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_PB10)}, + {MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_PB10)}, + + {MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA04)}, + {MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA05)}, + {MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA06)}, + {MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA07)}, + {MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PC01)}, + {MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PC00)}, + + {MP_ROM_QSTR(MP_QSTR_MATRIX_0), MP_ROM_PTR(&pin_PF00)}, + {MP_ROM_QSTR(MP_QSTR_MATRIX_1), MP_ROM_PTR(&pin_PF01)}, + {MP_ROM_QSTR(MP_QSTR_MATRIX_2), MP_ROM_PTR(&pin_PF02)}, + {MP_ROM_QSTR(MP_QSTR_MATRIX_3), MP_ROM_PTR(&pin_PF03)}, + {MP_ROM_QSTR(MP_QSTR_MATRIX_4), MP_ROM_PTR(&pin_PF04)}, + {MP_ROM_QSTR(MP_QSTR_MATRIX_5), MP_ROM_PTR(&pin_PF05)}, + {MP_ROM_QSTR(MP_QSTR_MATRIX_6), MP_ROM_PTR(&pin_PF06)}, + {MP_ROM_QSTR(MP_QSTR_MATRIX_7), MP_ROM_PTR(&pin_PF07)}, + {MP_ROM_QSTR(MP_QSTR_MATRIX_8), MP_ROM_PTR(&pin_PF08)}, + {MP_ROM_QSTR(MP_QSTR_MATRIX_9), MP_ROM_PTR(&pin_PF09)}, + {MP_ROM_QSTR(MP_QSTR_MATRIX_10), MP_ROM_PTR(&pin_PF10)}, + + {MP_ROM_QSTR(MP_QSTR_LED3_R), MP_ROM_PTR(&pin_PH10)}, + {MP_ROM_QSTR(MP_QSTR_LED3_G), MP_ROM_PTR(&pin_PH11)}, + {MP_ROM_QSTR(MP_QSTR_LED3_B), MP_ROM_PTR(&pin_PH12)}, + {MP_ROM_QSTR(MP_QSTR_LED4_R), MP_ROM_PTR(&pin_PH13)}, + {MP_ROM_QSTR(MP_QSTR_LED4_G), MP_ROM_PTR(&pin_PH14)}, + {MP_ROM_QSTR(MP_QSTR_LED4_B), MP_ROM_PTR(&pin_PH15)}, + + {MP_ROM_QSTR(MP_QSTR_JMISC1), MP_ROM_PTR(&pin_PC06)}, + {MP_ROM_QSTR(MP_QSTR_JMISC2), MP_ROM_PTR(&pin_PD02)}, + {MP_ROM_QSTR(MP_QSTR_JMISC3), MP_ROM_PTR(&pin_PC07)}, + {MP_ROM_QSTR(MP_QSTR_JMISC4), MP_ROM_PTR(&pin_PE02)}, + {MP_ROM_QSTR(MP_QSTR_JMISC5), MP_ROM_PTR(&pin_PC08)}, + {MP_ROM_QSTR(MP_QSTR_JMISC6), MP_ROM_PTR(&pin_PE03)}, + {MP_ROM_QSTR(MP_QSTR_JMISC7), MP_ROM_PTR(&pin_PC09)}, + {MP_ROM_QSTR(MP_QSTR_JMISC8), MP_ROM_PTR(&pin_PE05)}, + {MP_ROM_QSTR(MP_QSTR_JMISC9), MP_ROM_PTR(&pin_PE04)}, + {MP_ROM_QSTR(MP_QSTR_JMISC10), MP_ROM_PTR(&pin_PE06)}, + {MP_ROM_QSTR(MP_QSTR_JMISC11), MP_ROM_PTR(&pin_PI04)}, + {MP_ROM_QSTR(MP_QSTR_JMISC12), MP_ROM_PTR(&pin_PE07)}, + {MP_ROM_QSTR(MP_QSTR_JMISC13), MP_ROM_PTR(&pin_PI06)}, + {MP_ROM_QSTR(MP_QSTR_JMISC14), MP_ROM_PTR(&pin_PE08)}, + {MP_ROM_QSTR(MP_QSTR_JMISC15), MP_ROM_PTR(&pin_PI07)}, + {MP_ROM_QSTR(MP_QSTR_JMISC16), MP_ROM_PTR(&pin_PF14)}, + {MP_ROM_QSTR(MP_QSTR_JMISC17), MP_ROM_PTR(&pin_PD09)}, + {MP_ROM_QSTR(MP_QSTR_JMISC18), MP_ROM_PTR(&pin_PF15)}, + {MP_ROM_QSTR(MP_QSTR_JMISC19), MP_ROM_PTR(&pin_PI05)}, + {MP_ROM_QSTR(MP_QSTR_JMISC20), MP_ROM_PTR(&pin_PA05)}, + {MP_ROM_QSTR(MP_QSTR_JMISC21), MP_ROM_PTR(&pin_PD08)}, + {MP_ROM_QSTR(MP_QSTR_JMISC22), MP_ROM_PTR(&pin_PA00)}, + {MP_ROM_QSTR(MP_QSTR_JMISC23), MP_ROM_PTR(&pin_PA08)}, + {MP_ROM_QSTR(MP_QSTR_JMISC24), MP_ROM_PTR(&pin_PA01)}, + {MP_ROM_QSTR(MP_QSTR_JMISC25), MP_ROM_PTR(&pin_PA10)}, + + {MP_ROM_QSTR(MP_QSTR_PA0), MP_ROM_PTR(&pin_PA00)}, + {MP_ROM_QSTR(MP_QSTR_PA1), MP_ROM_PTR(&pin_PA01)}, + {MP_ROM_QSTR(MP_QSTR_PA2), MP_ROM_PTR(&pin_PA02)}, + {MP_ROM_QSTR(MP_QSTR_PA3), MP_ROM_PTR(&pin_PA03)}, + {MP_ROM_QSTR(MP_QSTR_PA4), MP_ROM_PTR(&pin_PA04)}, + {MP_ROM_QSTR(MP_QSTR_PA5), MP_ROM_PTR(&pin_PA05)}, + {MP_ROM_QSTR(MP_QSTR_PA6), MP_ROM_PTR(&pin_PA06)}, + {MP_ROM_QSTR(MP_QSTR_PA7), MP_ROM_PTR(&pin_PA07)}, + {MP_ROM_QSTR(MP_QSTR_PA8), MP_ROM_PTR(&pin_PA08)}, + {MP_ROM_QSTR(MP_QSTR_PA10), MP_ROM_PTR(&pin_PA10)}, + {MP_ROM_QSTR(MP_QSTR_PA11), MP_ROM_PTR(&pin_PA11)}, + {MP_ROM_QSTR(MP_QSTR_PA12), MP_ROM_PTR(&pin_PA12)}, + {MP_ROM_QSTR(MP_QSTR_PA15), MP_ROM_PTR(&pin_PA15)}, + + {MP_ROM_QSTR(MP_QSTR_PB0), MP_ROM_PTR(&pin_PB00)}, + {MP_ROM_QSTR(MP_QSTR_PB1), MP_ROM_PTR(&pin_PB01)}, + {MP_ROM_QSTR(MP_QSTR_PB2), MP_ROM_PTR(&pin_PB02)}, + {MP_ROM_QSTR(MP_QSTR_PB3), MP_ROM_PTR(&pin_PB03)}, + {MP_ROM_QSTR(MP_QSTR_PB4), MP_ROM_PTR(&pin_PB04)}, + {MP_ROM_QSTR(MP_QSTR_PB5), MP_ROM_PTR(&pin_PB05)}, + {MP_ROM_QSTR(MP_QSTR_PB6), MP_ROM_PTR(&pin_PB06)}, + {MP_ROM_QSTR(MP_QSTR_PB7), MP_ROM_PTR(&pin_PB07)}, + {MP_ROM_QSTR(MP_QSTR_PB8), MP_ROM_PTR(&pin_PB08)}, + {MP_ROM_QSTR(MP_QSTR_PB9), MP_ROM_PTR(&pin_PB09)}, + {MP_ROM_QSTR(MP_QSTR_PB10), MP_ROM_PTR(&pin_PB10)}, + {MP_ROM_QSTR(MP_QSTR_PB13), MP_ROM_PTR(&pin_PB13)}, + {MP_ROM_QSTR(MP_QSTR_PB14), MP_ROM_PTR(&pin_PB14)}, + {MP_ROM_QSTR(MP_QSTR_PB15), MP_ROM_PTR(&pin_PB15)}, + + {MP_ROM_QSTR(MP_QSTR_PC0), MP_ROM_PTR(&pin_PC00)}, + {MP_ROM_QSTR(MP_QSTR_PC1), MP_ROM_PTR(&pin_PC01)}, + {MP_ROM_QSTR(MP_QSTR_PC2), MP_ROM_PTR(&pin_PC02)}, + {MP_ROM_QSTR(MP_QSTR_PC3), MP_ROM_PTR(&pin_PC03)}, + {MP_ROM_QSTR(MP_QSTR_PC6), MP_ROM_PTR(&pin_PC06)}, + {MP_ROM_QSTR(MP_QSTR_PC7), MP_ROM_PTR(&pin_PC07)}, + {MP_ROM_QSTR(MP_QSTR_PC8), MP_ROM_PTR(&pin_PC08)}, + {MP_ROM_QSTR(MP_QSTR_PC9), MP_ROM_PTR(&pin_PC09)}, + + {MP_ROM_QSTR(MP_QSTR_PD1), MP_ROM_PTR(&pin_PD01)}, + {MP_ROM_QSTR(MP_QSTR_PD2), MP_ROM_PTR(&pin_PD02)}, + {MP_ROM_QSTR(MP_QSTR_PD8), MP_ROM_PTR(&pin_PD08)}, + {MP_ROM_QSTR(MP_QSTR_PD9), MP_ROM_PTR(&pin_PD09)}, + {MP_ROM_QSTR(MP_QSTR_PD12), MP_ROM_PTR(&pin_PD12)}, + {MP_ROM_QSTR(MP_QSTR_PD13), MP_ROM_PTR(&pin_PD13)}, + + {MP_ROM_QSTR(MP_QSTR_PE2), MP_ROM_PTR(&pin_PE02)}, + {MP_ROM_QSTR(MP_QSTR_PE3), MP_ROM_PTR(&pin_PE03)}, + {MP_ROM_QSTR(MP_QSTR_PE4), MP_ROM_PTR(&pin_PE04)}, + {MP_ROM_QSTR(MP_QSTR_PE5), MP_ROM_PTR(&pin_PE05)}, + {MP_ROM_QSTR(MP_QSTR_PE6), MP_ROM_PTR(&pin_PE06)}, + {MP_ROM_QSTR(MP_QSTR_PE7), MP_ROM_PTR(&pin_PE07)}, + {MP_ROM_QSTR(MP_QSTR_PE8), MP_ROM_PTR(&pin_PE08)}, + + {MP_ROM_QSTR(MP_QSTR_PF0), MP_ROM_PTR(&pin_PF00)}, + {MP_ROM_QSTR(MP_QSTR_PF1), MP_ROM_PTR(&pin_PF01)}, + {MP_ROM_QSTR(MP_QSTR_PF2), MP_ROM_PTR(&pin_PF02)}, + {MP_ROM_QSTR(MP_QSTR_PF3), MP_ROM_PTR(&pin_PF03)}, + {MP_ROM_QSTR(MP_QSTR_PF4), MP_ROM_PTR(&pin_PF04)}, + {MP_ROM_QSTR(MP_QSTR_PF5), MP_ROM_PTR(&pin_PF05)}, + {MP_ROM_QSTR(MP_QSTR_PF6), MP_ROM_PTR(&pin_PF06)}, + {MP_ROM_QSTR(MP_QSTR_PF7), MP_ROM_PTR(&pin_PF07)}, + {MP_ROM_QSTR(MP_QSTR_PF8), MP_ROM_PTR(&pin_PF08)}, + {MP_ROM_QSTR(MP_QSTR_PF9), MP_ROM_PTR(&pin_PF09)}, + {MP_ROM_QSTR(MP_QSTR_PF10), MP_ROM_PTR(&pin_PF10)}, + + {MP_ROM_QSTR(MP_QSTR_PG5), MP_ROM_PTR(&pin_PG05)}, + {MP_ROM_QSTR(MP_QSTR_PG6), MP_ROM_PTR(&pin_PG06)}, + {MP_ROM_QSTR(MP_QSTR_PG7), MP_ROM_PTR(&pin_PG07)}, + {MP_ROM_QSTR(MP_QSTR_PG8), MP_ROM_PTR(&pin_PG08)}, + {MP_ROM_QSTR(MP_QSTR_PG9), MP_ROM_PTR(&pin_PG09)}, + {MP_ROM_QSTR(MP_QSTR_PG10), MP_ROM_PTR(&pin_PF10)}, + {MP_ROM_QSTR(MP_QSTR_PG12), MP_ROM_PTR(&pin_PF12)}, + {MP_ROM_QSTR(MP_QSTR_PG13), MP_ROM_PTR(&pin_PF13)}, + + {MP_ROM_QSTR(MP_QSTR_LED3_R), MP_ROM_PTR(&pin_PH10)}, + {MP_ROM_QSTR(MP_QSTR_LED3_G), MP_ROM_PTR(&pin_PH11)}, + {MP_ROM_QSTR(MP_QSTR_LED3_B), MP_ROM_PTR(&pin_PH12)}, + {MP_ROM_QSTR(MP_QSTR_LED4_R), MP_ROM_PTR(&pin_PH13)}, + {MP_ROM_QSTR(MP_QSTR_LED4_G), MP_ROM_PTR(&pin_PH14)}, + {MP_ROM_QSTR(MP_QSTR_LED4_B), MP_ROM_PTR(&pin_PH15)}, + + {MP_ROM_QSTR(MP_QSTR_PI4), MP_ROM_PTR(&pin_PI04)}, + {MP_ROM_QSTR(MP_QSTR_PI5), MP_ROM_PTR(&pin_PI05)}, + {MP_ROM_QSTR(MP_QSTR_PI6), MP_ROM_PTR(&pin_PI06)}, + {MP_ROM_QSTR(MP_QSTR_PI7), MP_ROM_PTR(&pin_PI07)}, + +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);