Browse Source

✅ CI check boards.h, pins.h (#27415)

Scott Lahteine 6 months ago
parent
commit
6528109176

+ 48 - 0
.github/workflows/ci-validate-boards.yml

@@ -0,0 +1,48 @@
+#
+# ci-validate-boards.yml
+# Validate boards.h to make sure it's all set up correctly
+#
+
+name: CI - Validate boards.h
+
+# We can do the on: section as two items, one for pull requests and one for pushes...
+on:
+  pull_request:
+    branches:
+    - bugfix-2.1.x
+    paths:
+    - 'Marlin/src/core/boards.h'
+  push:
+    branches:
+    - bugfix-2.1.x
+    paths:
+    - 'Marlin/src/core/boards.h'
+
+jobs:
+  validate_pins_files:
+    name: Validate boards.h
+    if: github.repository == 'MarlinFirmware/Marlin'
+
+    runs-on: ubuntu-latest
+
+    steps:
+    - name: Check out the PR
+      uses: actions/checkout@v4
+
+    - name: Cache pip
+      uses: actions/cache@v4
+      with:
+        path: ~/.cache/pip
+        key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
+        restore-keys: |
+          ${{ runner.os }}-pip-
+
+    - name: Select Python 3.9
+      uses: actions/setup-python@v5
+      with:
+        python-version: '3.9'
+        architecture: 'x64'
+
+    - name: Validate core/boards.h
+      run: |
+        make validate-boards -j

+ 9 - 0
.zed/settings.json

@@ -0,0 +1,9 @@
+/**
+ * Marlin-specific settings for Zed
+ *
+ * For a full list of overridable settings, and general information on folder-specific settings,
+ * see the documentation: https://zed.dev/docs/configuring-zed#settings-files
+ */
+{
+  "enable_language_servers": false
+}

+ 10 - 1
Makefile

@@ -6,9 +6,10 @@ UNIT_TEST_CONFIG ?= default
 
 help:
 	@echo "Tasks for local development:"
-	@echo "make marlin                    : Build marlin for the configured board"
+	@echo "make marlin                    : Build Marlin for the configured board"
 	@echo "make format-pins -j            : Reformat all pins files (-j for parallel execution)"
 	@echo "make validate-pins -j          : Validate all pins files, fails if any require reformatting"
+	@echo "make validate-boards -j        : Validate boards.h and pins.h for standards compliance"
 	@echo "make tests-single-ci           : Run a single test from inside the CI"
 	@echo "make tests-single-local        : Run a single test locally"
 	@echo "make tests-single-local-docker : Run a single test locally, using docker"
@@ -102,3 +103,11 @@ format-pins: $(PINS)
 validate-pins: format-pins
 	@echo "Validating pins files"
 	@git diff --exit-code || (git status && echo "\nError: Pins files are not formatted correctly. Run \"make format-pins\" to fix.\n" && exit 1)
+
+BOARDS_FILE := Marlin/src/core/boards.h
+
+.PHONY: validate-boards
+
+validate-boards:
+	@echo "Validating boards.h file"
+	@python $(SCRIPTS_DIR)/validate_boards.py $(BOARDS_FILE) || (echo "\nError: boards.h file is not valid. Please check and correct it.\n" && exit 1)

+ 165 - 165
Marlin/src/core/boards.h

@@ -81,59 +81,56 @@
 #define BOARD_KFB_2                   1114  // BigTreeTech or BIQU KFB2.0
 #define BOARD_ZRIB_V20                1115  // zrib V2.0 (Chinese RAMPS replica)
 #define BOARD_ZRIB_V52                1116  // zrib V5.2 (Chinese RAMPS replica)
-#define BOARD_FELIX2                  1117  // Felix 2.0+ Electronics Board (RAMPS like)
-#define BOARD_RIGIDBOARD              1118  // Invent-A-Part RigidBoard
-#define BOARD_RIGIDBOARD_V2           1119  // Invent-A-Part RigidBoard V2
-#define BOARD_SAINSMART_2IN1          1120  // Sainsmart 2-in-1 board
-#define BOARD_ULTIMAKER               1121  // Ultimaker
-#define BOARD_ULTIMAKER_OLD           1122  // Ultimaker (Older electronics. Pre 1.5.4. This is rare)
-#define BOARD_AZTEEG_X3               1123  // Azteeg X3
-#define BOARD_AZTEEG_X3_PRO           1124  // Azteeg X3 Pro
-#define BOARD_ULTIMAIN_2              1125  // Ultimainboard 2.x (Uses TEMP_SENSOR 20)
-#define BOARD_RUMBA                   1126  // Rumba
-#define BOARD_RUMBA_RAISE3D           1127  // Raise3D N series Rumba derivative
-#define BOARD_RL200                   1128  // Rapide Lite 200 (v1, low-cost RUMBA clone with drv)
-#define BOARD_FORMBOT_TREX2PLUS       1129  // Formbot T-Rex 2 Plus
-#define BOARD_FORMBOT_TREX3           1130  // Formbot T-Rex 3
-#define BOARD_FORMBOT_RAPTOR          1131  // Formbot Raptor
-#define BOARD_FORMBOT_RAPTOR2         1132  // Formbot Raptor 2
-#define BOARD_BQ_ZUM_MEGA_3D          1133  // bq ZUM Mega 3D
-#define BOARD_MAKEBOARD_MINI          1134  // MakeBoard Mini v2.1.2 by MicroMake
-#define BOARD_TRIGORILLA_13           1135  // TriGorilla Anycubic version 1.3-based on RAMPS EFB
-#define BOARD_TRIGORILLA_14           1136  //   ... Ver 1.4
-#define BOARD_TRIGORILLA_14_11        1137  //   ... Rev 1.1 (new servo pin order)
-#define BOARD_RAMPS_ENDER_4           1138  // Creality: Ender-4, CR-8
-#define BOARD_RAMPS_CREALITY          1139  // Creality: CR10S, CR20, CR-X
-#define BOARD_DAGOMA_F5               1140  // Dagoma F5
-#define BOARD_FYSETC_F6_13            1141  // FYSETC F6 1.3
-#define BOARD_FYSETC_F6_14            1142  // FYSETC F6 1.4
-#define BOARD_DUPLICATOR_I3_PLUS      1143  // Wanhao Duplicator i3 Plus
-#define BOARD_VORON                   1144  // VORON Design
-#define BOARD_TRONXY_V3_1_0           1145  // Tronxy TRONXY-V3-1.0
-#define BOARD_Z_BOLT_X_SERIES         1146  // Z-Bolt X Series
-#define BOARD_TT_OSCAR                1147  // TT OSCAR
-#define BOARD_OVERLORD                1148  // Overlord/Overlord Pro
-#define BOARD_HJC2560C_REV1           1149  // ADIMLab Gantry v1
-#define BOARD_HJC2560C_REV2           1150  // ADIMLab Gantry v2
-#define BOARD_TANGO                   1151  // BIQU Tango V1
-#define BOARD_MKS_GEN_L_V2            1152  // MKS GEN L V2
-#define BOARD_MKS_GEN_L_V21           1153  // MKS GEN L V2.1
-#define BOARD_COPYMASTER_3D           1154  // Copymaster 3D
-#define BOARD_ORTUR_4                 1155  // Ortur 4
-#define BOARD_TENLOG_D3_HERO          1156  // Tenlog D3 Hero IDEX printer
-#define BOARD_TENLOG_MB1_V23          1157  // Tenlog D3, D5, D6 IDEX Printer
-#define BOARD_RAMPS_S_12_EEFB         1158  // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
-#define BOARD_RAMPS_S_12_EEEB         1159  // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
-#define BOARD_RAMPS_S_12_EFFB         1160  // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
-#define BOARD_LONGER3D_LK1_PRO        1161  // Longer LK1 PRO / Alfawise U20 Pro (PRO version)
-#define BOARD_LONGER3D_LKx_PRO        1162  // Longer LKx PRO / Alfawise Uxx Pro (PRO version)
-#define BOARD_ZRIB_V53                1163  // Zonestar zrib V5.3 (Chinese RAMPS replica)
-#define BOARD_PXMALION_CORE_I3        1164  // Pxmalion Core I3
-#define BOARD_PANOWIN_CUTLASS         1165  // Panowin Cutlass (as found in the Panowin F1)
-#define BOARD_KODAMA_BARDO            1166  // Kodama Bardo V1.x (as found in the Kodama Trinus)
-#define BOARD_DAGOMA_D6               1167  // Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
-#define BOARD_XTLW_MFF_V1             1168  // XTLW MFF V1.0
-#define BOARD_XTLW_MFF_V2             1169  // XTLW MFF V2.0
+#define BOARD_ZRIB_V53                1117  // Zonestar zrib V5.3 (Chinese RAMPS replica)
+#define BOARD_FELIX2                  1118  // Felix 2.0+ Electronics Board (RAMPS like)
+#define BOARD_RIGIDBOARD              1119  // Invent-A-Part RigidBoard
+#define BOARD_RIGIDBOARD_V2           1120  // Invent-A-Part RigidBoard V2
+#define BOARD_SAINSMART_2IN1          1121  // Sainsmart 2-in-1 board
+#define BOARD_ULTIMAKER               1122  // Ultimaker
+#define BOARD_ULTIMAKER_OLD           1123  // Ultimaker (Older electronics. Pre 1.5.4. This is rare)
+#define BOARD_AZTEEG_X3               1124  // Azteeg X3
+#define BOARD_AZTEEG_X3_PRO           1125  // Azteeg X3 Pro
+#define BOARD_ULTIMAIN_2              1126  // Ultimainboard 2.x (Uses TEMP_SENSOR 20)
+#define BOARD_RUMBA                   1127  // Rumba
+#define BOARD_RUMBA_RAISE3D           1128  // Raise3D N series Rumba derivative
+#define BOARD_RL200                   1129  // Rapide Lite 200 (v1, low-cost RUMBA clone with drv)
+#define BOARD_FORMBOT_TREX2PLUS       1130  // Formbot T-Rex 2 Plus
+#define BOARD_FORMBOT_TREX3           1131  // Formbot T-Rex 3
+#define BOARD_FORMBOT_RAPTOR          1132  // Formbot Raptor
+#define BOARD_FORMBOT_RAPTOR2         1133  // Formbot Raptor 2
+#define BOARD_BQ_ZUM_MEGA_3D          1134  // bq ZUM Mega 3D
+#define BOARD_MAKEBOARD_MINI          1135  // MakeBoard Mini v2.1.2 by MicroMake
+#define BOARD_TRIGORILLA_13           1136  // TriGorilla Anycubic version 1.3-based on RAMPS EFB
+#define BOARD_TRIGORILLA_14           1137  //   ... Ver 1.4
+#define BOARD_TRIGORILLA_14_11        1138  //   ... Rev 1.1 (new servo pin order)
+#define BOARD_RAMPS_ENDER_4           1139  // Creality: Ender-4, CR-8
+#define BOARD_RAMPS_CREALITY          1140  // Creality: CR10S, CR20, CR-X
+#define BOARD_DAGOMA_F5               1141  // Dagoma F5
+#define BOARD_DAGOMA_D6               1142  // Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
+#define BOARD_FYSETC_F6_13            1143  // FYSETC F6 1.3
+#define BOARD_FYSETC_F6_14            1144  // FYSETC F6 1.4
+#define BOARD_DUPLICATOR_I3_PLUS      1145  // Wanhao Duplicator i3 Plus
+#define BOARD_VORON                   1146  // VORON Design
+#define BOARD_TRONXY_V3_1_0           1147  // Tronxy TRONXY-V3-1.0
+#define BOARD_Z_BOLT_X_SERIES         1148  // Z-Bolt X Series
+#define BOARD_TT_OSCAR                1149  // TT OSCAR
+#define BOARD_TANGO                   1150  // BIQU Tango V1
+#define BOARD_MKS_GEN_L_V2            1151  // MKS GEN L V2
+#define BOARD_MKS_GEN_L_V21           1152  // MKS GEN L V2.1
+#define BOARD_COPYMASTER_3D           1153  // Copymaster 3D
+#define BOARD_ORTUR_4                 1154  // Ortur 4
+#define BOARD_TENLOG_D3_HERO          1155  // Tenlog D3 Hero IDEX printer
+#define BOARD_TENLOG_MB1_V23          1156  // Tenlog D3, D5, D6 IDEX Printer
+#define BOARD_RAMPS_S_12_EEFB         1157  // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
+#define BOARD_RAMPS_S_12_EEEB         1158  // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
+#define BOARD_RAMPS_S_12_EFFB         1159  // Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
+#define BOARD_LONGER3D_LK1_PRO        1160  // Longer LK1 PRO / Alfawise U20 Pro (PRO version)
+#define BOARD_LONGER3D_LKx_PRO        1161  // Longer LKx PRO / Alfawise Uxx Pro (PRO version)
+#define BOARD_PXMALION_CORE_I3        1162  // Pxmalion Core I3
+#define BOARD_PANOWIN_CUTLASS         1163  // Panowin Cutlass (as found in the Panowin F1)
+#define BOARD_KODAMA_BARDO            1164  // Kodama Bardo V1.x (as found in the Kodama Trinus)
+#define BOARD_XTLW_MFF_V1             1165  // XTLW MFF V1.0
+#define BOARD_XTLW_MFF_V2             1166  // XTLW MFF V2.0
 
 //
 // RAMBo and derivatives
@@ -169,20 +166,23 @@
 #define BOARD_GT2560_REV_A_PLUS       1315  // Geeetech GT2560 Rev A+ (with auto level probe)
 #define BOARD_GT2560_REV_B            1316  // Geeetech GT2560 Rev B
 #define BOARD_GT2560_V3               1317  // Geeetech GT2560 Rev B for A10(M/T/D)
-#define BOARD_GT2560_V4               1318  // Geeetech GT2560 Rev B for A10(M/T/D)
-#define BOARD_GT2560_V3_MC2           1319  // Geeetech GT2560 Rev B for Mecreator2
-#define BOARD_GT2560_V3_A20           1320  // Geeetech GT2560 Rev B for A20(M/T/D)
-#define BOARD_EINSTART_S              1321  // Einstart retrofit
-#define BOARD_WANHAO_ONEPLUS          1322  // Wanhao 0ne+ i3 Mini
-#define BOARD_LEAPFROG_XEED2015       1323  // Leapfrog Xeed 2015
-#define BOARD_PICA_REVB               1324  // PICA Shield (original version)
-#define BOARD_PICA                    1325  // PICA Shield (rev C or later)
-#define BOARD_INTAMSYS40              1326  // Intamsys 4.0 (Funmat HT)
-#define BOARD_MALYAN_M180             1327  // Malyan M180 Mainboard Version 2 (no display function, direct G-code only)
-#define BOARD_GT2560_V4_A20           1328  // Geeetech GT2560 Rev B for A20(M/T/D)
-#define BOARD_PROTONEER_CNC_SHIELD_V3 1329  // Mega controller & Protoneer CNC Shield V3.00
-#define BOARD_WEEDO_62A               1330  // WEEDO 62A board (TINA2, Monoprice Cadet, etc.)
-#define BOARD_GT2560_V41B             1331  // Geeetech GT2560 V4.1B for A10(M/T/D)
+#define BOARD_GT2560_V3_MC2           1318  // Geeetech GT2560 Rev B for Mecreator2
+#define BOARD_GT2560_V3_A20           1319  // Geeetech GT2560 Rev B for A20(M/T/D)
+#define BOARD_GT2560_V4               1320  // Geeetech GT2560 Rev B for A10(M/T/D)
+#define BOARD_GT2560_V4_A20           1321  // Geeetech GT2560 Rev B for A20(M/T/D)
+#define BOARD_EINSTART_S              1322  // Einstart retrofit
+#define BOARD_WANHAO_ONEPLUS          1323  // Wanhao 0ne+ i3 Mini
+#define BOARD_OVERLORD                1324  // Overlord/Overlord Pro
+#define BOARD_HJC2560C_REV1           1325  // ADIMLab Gantry v1
+#define BOARD_HJC2560C_REV2           1326  // ADIMLab Gantry v2
+#define BOARD_LEAPFROG_XEED2015       1327  // Leapfrog Xeed 2015
+#define BOARD_PICA_REVB               1328  // PICA Shield (original version)
+#define BOARD_PICA                    1329  // PICA Shield (rev C or later)
+#define BOARD_INTAMSYS40              1330  // Intamsys 4.0 (Funmat HT)
+#define BOARD_MALYAN_M180             1331  // Malyan M180 Mainboard Version 2 (no display function, direct G-code only)
+#define BOARD_PROTONEER_CNC_SHIELD_V3 1332  // Mega controller & Protoneer CNC Shield V3.00
+#define BOARD_WEEDO_62A               1333  // WEEDO 62A board (TINA2, Monoprice Cadet, etc.)
+#define BOARD_GT2560_V41B             1334  // Geeetech GT2560 V4.1B for A10(M/T/D)
 
 //
 // ATmega1281, ATmega2561
@@ -339,62 +339,62 @@
 #define BOARD_MALYAN_M200             5003  // STM32C8 Libmaple-based STM32F1 controller
 #define BOARD_STM3R_MINI              5004  // STM32F103RE Libmaple-based STM32F1 controller
 #define BOARD_GTM32_PRO_VB            5005  // STM32F103VE controller
-#define BOARD_GTM32_MINI              5006  // STM32F103VE controller
-#define BOARD_GTM32_MINI_A30          5007  // STM32F103VE controller
-#define BOARD_GTM32_REV_B             5008  // STM32F103VE controller
-#define BOARD_MORPHEUS                5009  // STM32F103C8 / STM32F103CB  Libmaple-based STM32F1 controller
-#define BOARD_CHITU3D                 5010  // Chitu3D (STM32F103RE)
-#define BOARD_MKS_ROBIN               5011  // MKS Robin (STM32F103ZE)
-#define BOARD_MKS_ROBIN_MINI          5012  // MKS Robin Mini (STM32F103VE)
-#define BOARD_MKS_ROBIN_NANO          5013  // MKS Robin Nano (STM32F103VE)
-#define BOARD_MKS_ROBIN_NANO_V2       5014  // MKS Robin Nano V2 (STM32F103VE)
-#define BOARD_MKS_ROBIN_LITE          5015  // MKS Robin Lite/Lite2 (STM32F103RC)
-#define BOARD_MKS_ROBIN_LITE3         5016  // MKS Robin Lite3 (STM32F103RC)
-#define BOARD_MKS_ROBIN_PRO           5017  // MKS Robin Pro (STM32F103ZE)
-#define BOARD_MKS_ROBIN_E3            5018  // MKS Robin E3 (STM32F103RC)
-#define BOARD_MKS_ROBIN_E3_V1_1       5019  // MKS Robin E3 V1.1 (STM32F103RC)
-#define BOARD_MKS_ROBIN_E3D           5020  // MKS Robin E3D (STM32F103RC)
-#define BOARD_MKS_ROBIN_E3D_V1_1      5021  // MKS Robin E3D V1.1 (STM32F103RC)
-#define BOARD_MKS_ROBIN_E3P           5022  // MKS Robin E3P (STM32F103VE)
-#define BOARD_BTT_SKR_MINI_V1_1       5023  // BigTreeTech SKR Mini v1.1 (STM32F103RC)
-#define BOARD_BTT_SKR_MINI_E3_V1_0    5024  // BigTreeTech SKR Mini E3 (STM32F103RC)
-#define BOARD_BTT_SKR_MINI_E3_V1_2    5025  // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC)
-#define BOARD_BTT_SKR_MINI_E3_V2_0    5026  // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC / STM32F103RE)
-#define BOARD_BTT_SKR_MINI_MZ_V1_0    5027  // BigTreeTech SKR Mini MZ V1.0 (STM32F103RC)
-#define BOARD_BTT_SKR_E3_DIP          5028  // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE)
-#define BOARD_BTT_SKR_CR6             5029  // BigTreeTech SKR CR6 v1.0 (STM32F103RE)
-#define BOARD_JGAURORA_A5S_A1         5030  // JGAurora A5S A1 (STM32F103ZE)
-#define BOARD_FYSETC_AIO_II           5031  // FYSETC AIO_II (STM32F103RC)
-#define BOARD_FYSETC_CHEETAH          5032  // FYSETC Cheetah (STM32F103RC)
-#define BOARD_FYSETC_CHEETAH_V12      5033  // FYSETC Cheetah V1.2 (STM32F103RC)
-#define BOARD_LONGER3D_LK             5034  // Longer3D LK1/2 - Alfawise U20/U20+/U30 (STM32F103VE)
-#define BOARD_CCROBOT_MEEB_3DP        5035  // ccrobot-online.com MEEB_3DP (STM32F103RC)
-#define BOARD_CHITU3D_V5              5036  // Chitu3D TronXY X5SA V5 Board (STM32F103ZE)
-#define BOARD_CHITU3D_V6              5037  // Chitu3D TronXY X5SA V6 Board (STM32F103ZE)
-#define BOARD_CHITU3D_V9              5038  // Chitu3D TronXY X5SA V9 Board (STM32F103ZE)
-#define BOARD_CREALITY_V4             5039  // Creality v4.x (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V422           5040  // Creality v4.2.2 (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V423           5041  // Creality v4.2.3 (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V425           5042  // Creality v4.2.5 (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V427           5043  // Creality v4.2.7 (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V4210          5044  // Creality v4.2.10 (STM32F103RC / STM32F103RE) as found in the CR-30
-#define BOARD_CREALITY_V431           5045  // Creality v4.3.1 (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V431_A         5046  // Creality v4.3.1a (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V431_B         5047  // Creality v4.3.1b (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V431_C         5048  // Creality v4.3.1c (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V431_D         5049  // Creality v4.3.1d (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V452           5050  // Creality v4.5.2 (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V453           5051  // Creality v4.5.3 (STM32F103RC / STM32F103RE)
-#define BOARD_CREALITY_V521           5052  // Creality v5.2.1 (STM32F103VE) as found in the SV04
-#define BOARD_CREALITY_V24S1          5053  // Creality v2.4.S1 (STM32F103RC / STM32F103RE) CR-FDM-v2.4.S1_v101 as found in the Ender-7
-#define BOARD_CREALITY_V24S1_301      5054  // Creality v2.4.S1_301 (STM32F103RC / STM32F103RE) CR-FDM-v24S1_301 as found in the Ender-3 S1
-#define BOARD_CREALITY_V25S1          5055  // Creality v2.5.S1 (STM32F103RE) CR-FDM-v2.5.S1_100 as found in the CR-10 Smart Pro
-#define BOARD_TRIGORILLA_PRO          5056  // Trigorilla Pro (STM32F103ZE)
-#define BOARD_FLY_MINI                5057  // FLYmaker FLY MINI (STM32F103RC)
-#define BOARD_FLSUN_HISPEED           5058  // FLSUN HiSpeedV1 (STM32F103VE)
-#define BOARD_BEAST                   5059  // STM32F103RE Libmaple-based controller
-#define BOARD_MINGDA_MPX_ARM_MINI     5060  // STM32F103ZE Mingda MD-16
-#define BOARD_GTM32_PRO_VD            5061  // STM32F103VE controller
+#define BOARD_GTM32_PRO_VD            5006  // STM32F103VE controller
+#define BOARD_GTM32_MINI              5007  // STM32F103VE controller
+#define BOARD_GTM32_MINI_A30          5008  // STM32F103VE controller
+#define BOARD_GTM32_REV_B             5009  // STM32F103VE controller
+#define BOARD_MORPHEUS                5010  // STM32F103C8 / STM32F103CB  Libmaple-based STM32F1 controller
+#define BOARD_CHITU3D                 5011  // Chitu3D (STM32F103RE)
+#define BOARD_MKS_ROBIN               5012  // MKS Robin (STM32F103ZE)
+#define BOARD_MKS_ROBIN_MINI          5013  // MKS Robin Mini (STM32F103VE)
+#define BOARD_MKS_ROBIN_NANO          5014  // MKS Robin Nano (STM32F103VE)
+#define BOARD_MKS_ROBIN_NANO_V2       5015  // MKS Robin Nano V2 (STM32F103VE)
+#define BOARD_MKS_ROBIN_LITE          5016  // MKS Robin Lite/Lite2 (STM32F103RC)
+#define BOARD_MKS_ROBIN_LITE3         5017  // MKS Robin Lite3 (STM32F103RC)
+#define BOARD_MKS_ROBIN_PRO           5018  // MKS Robin Pro (STM32F103ZE)
+#define BOARD_MKS_ROBIN_E3            5019  // MKS Robin E3 (STM32F103RC)
+#define BOARD_MKS_ROBIN_E3_V1_1       5020  // MKS Robin E3 V1.1 (STM32F103RC)
+#define BOARD_MKS_ROBIN_E3D           5021  // MKS Robin E3D (STM32F103RC)
+#define BOARD_MKS_ROBIN_E3D_V1_1      5022  // MKS Robin E3D V1.1 (STM32F103RC)
+#define BOARD_MKS_ROBIN_E3P           5023  // MKS Robin E3P (STM32F103VE)
+#define BOARD_BTT_SKR_MINI_V1_1       5024  // BigTreeTech SKR Mini v1.1 (STM32F103RC)
+#define BOARD_BTT_SKR_MINI_E3_V1_0    5025  // BigTreeTech SKR Mini E3 (STM32F103RC)
+#define BOARD_BTT_SKR_MINI_E3_V1_2    5026  // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC)
+#define BOARD_BTT_SKR_MINI_E3_V2_0    5027  // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC / STM32F103RE)
+#define BOARD_BTT_SKR_MINI_MZ_V1_0    5028  // BigTreeTech SKR Mini MZ V1.0 (STM32F103RC)
+#define BOARD_BTT_SKR_E3_DIP          5029  // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE)
+#define BOARD_BTT_SKR_CR6             5030  // BigTreeTech SKR CR6 v1.0 (STM32F103RE)
+#define BOARD_JGAURORA_A5S_A1         5031  // JGAurora A5S A1 (STM32F103ZE)
+#define BOARD_FYSETC_AIO_II           5032  // FYSETC AIO_II (STM32F103RC)
+#define BOARD_FYSETC_CHEETAH          5033  // FYSETC Cheetah (STM32F103RC)
+#define BOARD_FYSETC_CHEETAH_V12      5034  // FYSETC Cheetah V1.2 (STM32F103RC)
+#define BOARD_LONGER3D_LK             5035  // Longer3D LK1/2 - Alfawise U20/U20+/U30 (STM32F103VE)
+#define BOARD_CCROBOT_MEEB_3DP        5036  // ccrobot-online.com MEEB_3DP (STM32F103RC)
+#define BOARD_CHITU3D_V5              5037  // Chitu3D TronXY X5SA V5 Board (STM32F103ZE)
+#define BOARD_CHITU3D_V6              5038  // Chitu3D TronXY X5SA V6 Board (STM32F103ZE)
+#define BOARD_CHITU3D_V9              5039  // Chitu3D TronXY X5SA V9 Board (STM32F103ZE)
+#define BOARD_CREALITY_V4             5040  // Creality v4.x (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V422           5041  // Creality v4.2.2 (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V423           5042  // Creality v4.2.3 (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V425           5043  // Creality v4.2.5 (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V427           5044  // Creality v4.2.7 (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V4210          5045  // Creality v4.2.10 (STM32F103RC / STM32F103RE) as found in the CR-30
+#define BOARD_CREALITY_V431           5046  // Creality v4.3.1 (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V431_A         5047  // Creality v4.3.1a (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V431_B         5048  // Creality v4.3.1b (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V431_C         5049  // Creality v4.3.1c (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V431_D         5050  // Creality v4.3.1d (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V452           5051  // Creality v4.5.2 (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V453           5052  // Creality v4.5.3 (STM32F103RC / STM32F103RE)
+#define BOARD_CREALITY_V521           5053  // Creality v5.2.1 (STM32F103VE) as found in the SV04
+#define BOARD_CREALITY_V24S1          5054  // Creality v2.4.S1 (STM32F103RC / STM32F103RE) CR-FDM-v2.4.S1_v101 as found in the Ender-7
+#define BOARD_CREALITY_V24S1_301      5055  // Creality v2.4.S1_301 (STM32F103RC / STM32F103RE) CR-FDM-v24S1_301 as found in the Ender-3 S1
+#define BOARD_CREALITY_V25S1          5056  // Creality v2.5.S1 (STM32F103RE) CR-FDM-v2.5.S1_100 as found in the CR-10 Smart Pro
+#define BOARD_TRIGORILLA_PRO          5057  // Trigorilla Pro (STM32F103ZE)
+#define BOARD_FLY_MINI                5058  // FLYmaker FLY MINI (STM32F103RC)
+#define BOARD_FLSUN_HISPEED           5059  // FLSUN HiSpeedV1 (STM32F103VE)
+#define BOARD_BEAST                   5060  // STM32F103RE Libmaple-based controller
+#define BOARD_MINGDA_MPX_ARM_MINI     5061  // STM32F103ZE Mingda MD-16
 #define BOARD_ZONESTAR_ZM3E2          5062  // Zonestar ZM3E2    (STM32F103RC)
 #define BOARD_ZONESTAR_ZM3E4          5063  // Zonestar ZM3E4 V1 (STM32F103VC)
 #define BOARD_ZONESTAR_ZM3E4V2        5064  // Zonestar ZM3E4 V2 (STM32F103VC)
@@ -423,8 +423,8 @@
 #define BOARD_RUMBA32_V1_1            5202  // RUMBA32 STM32F446VE based controller from Aus3D
 #define BOARD_RUMBA32_MKS             5203  // RUMBA32 STM32F446VE based controller from Makerbase
 #define BOARD_RUMBA32_BTT             5204  // RUMBA32 STM32F446VE based controller from BIGTREETECH
-#define BOARD_BLACK_STM32F407VE       5205  // BLACK_STM32F407VE
-#define BOARD_BLACK_STM32F407ZE       5206  // BLACK_STM32F407ZE
+#define BOARD_BLACK_STM32F407VE       5205  // Black STM32F407VE development board
+#define BOARD_BLACK_STM32F407ZE       5206  // Black STM32F407ZE development board
 #define BOARD_BTT_SKR_MINI_E3_V3_0_1  5207  // BigTreeTech SKR Mini E3 V3.0.1 (STM32F401RC)
 #define BOARD_BTT_SKR_PRO_V1_1        5208  // BigTreeTech SKR Pro v1.1 (STM32F407ZG)
 #define BOARD_BTT_SKR_PRO_V1_2        5209  // BigTreeTech SKR Pro v1.2 (STM32F407ZG)
@@ -442,33 +442,33 @@
 #define BOARD_FYSETC_S6               5221  // FYSETC S6 (STM32F446VE)
 #define BOARD_FYSETC_S6_V2_0          5222  // FYSETC S6 v2.0 (STM32F446VE)
 #define BOARD_FYSETC_SPIDER           5223  // FYSETC Spider (STM32F446VE)
-#define BOARD_FLYF407ZG               5224  // FLYmaker FLYF407ZG (STM32F407ZG)
-#define BOARD_MKS_ROBIN2              5225  // MKS Robin2 V1.0 (STM32F407ZE)
-#define BOARD_MKS_ROBIN_PRO_V2        5226  // MKS Robin Pro V2 (STM32F407VE)
-#define BOARD_MKS_ROBIN_NANO_V3       5227  // MKS Robin Nano V3 (STM32F407VG)
-#define BOARD_MKS_ROBIN_NANO_V3_1     5228  // MKS Robin Nano V3.1 (STM32F407VE)
-#define BOARD_MKS_MONSTER8_V1         5229  // MKS Monster8 V1 (STM32F407VE)
-#define BOARD_MKS_MONSTER8_V2         5230  // MKS Monster8 V2 (STM32F407VE)
-#define BOARD_ANET_ET4                5231  // ANET ET4 V1.x (STM32F407VG)
-#define BOARD_ANET_ET4P               5232  // ANET ET4P V1.x (STM32F407VG)
-#define BOARD_FYSETC_CHEETAH_V20      5233  // FYSETC Cheetah V2.0 (STM32F401RC)
-#define BOARD_TH3D_EZBOARD_V2         5234  // TH3D EZBoard v2.0 (STM32F405RG)
-#define BOARD_OPULO_LUMEN_REV3        5235  // Opulo Lumen PnP Controller REV3 (STM32F407VE / STM32F407VG)
-#define BOARD_MKS_ROBIN_NANO_V1_3_F4  5236  // MKS Robin Nano V1.3 and MKS Robin Nano-S V1.3 (STM32F407VE)
-#define BOARD_MKS_EAGLE               5237  // MKS Eagle (STM32F407VE)
-#define BOARD_ARTILLERY_RUBY          5238  // Artillery Ruby (STM32F401RC)
-#define BOARD_FYSETC_SPIDER_V2_2      5239  // FYSETC Spider V2.2 (STM32F446VE)
-#define BOARD_CREALITY_V24S1_301F4    5240  // Creality v2.4.S1_301F4 (STM32F401RC) as found in the Ender-3 S1 F4
-#define BOARD_CREALITY_CR4NTXXC10     5241  // Creality E3 Free-runs Silent Motherboard (STM32F401RET6)
-#define BOARD_OPULO_LUMEN_REV4        5242  // Opulo Lumen PnP Controller REV4 (STM32F407VE / STM32F407VG)
-#define BOARD_FYSETC_SPIDER_KING407   5243  // FYSETC Spider King407 (STM32F407ZG)
-#define BOARD_MKS_SKIPR_V1            5244  // MKS SKIPR v1.0 all-in-one board (STM32F407VE)
-#define BOARD_TRONXY_CXY_446_V10      5245  // TRONXY CXY-446-V10-220413/CXY-V6-191121 (STM32F446ZE)
-#define BOARD_CREALITY_F401RE         5246  // Creality CR4NS200141C13 (STM32F401RE) as found in the Ender-5 S1
-#define BOARD_BLACKPILL_CUSTOM        5247  // Custom board based on STM32F401CDU6.
-#define BOARD_I3DBEEZ9_V1             5248  // I3DBEEZ9 V1 (STM32F407ZG)
-#define BOARD_MELLOW_FLY_E3_V2        5249  // Mellow Fly E3 V2 (STM32F407VG)
-#define BOARD_FYSETC_CHEETAH_V30      5250  // FYSETC Cheetah V3.0 (STM32F446RC)
+#define BOARD_FYSETC_SPIDER_V2_2      5224  // FYSETC Spider V2.2 (STM32F446VE)
+#define BOARD_FLYF407ZG               5225  // FLYmaker FLYF407ZG (STM32F407ZG)
+#define BOARD_MKS_ROBIN2              5226  // MKS Robin2 V1.0 (STM32F407ZE)
+#define BOARD_MKS_ROBIN_PRO_V2        5227  // MKS Robin Pro V2 (STM32F407VE)
+#define BOARD_MKS_ROBIN_NANO_V3       5228  // MKS Robin Nano V3 (STM32F407VG)
+#define BOARD_MKS_ROBIN_NANO_V3_1     5229  // MKS Robin Nano V3.1 (STM32F407VE)
+#define BOARD_MKS_MONSTER8_V1         5230  // MKS Monster8 V1 (STM32F407VE)
+#define BOARD_MKS_MONSTER8_V2         5231  // MKS Monster8 V2 (STM32F407VE)
+#define BOARD_ANET_ET4                5232  // ANET ET4 V1.x (STM32F407VG)
+#define BOARD_ANET_ET4P               5233  // ANET ET4P V1.x (STM32F407VG)
+#define BOARD_FYSETC_CHEETAH_V20      5234  // FYSETC Cheetah V2.0 (STM32F401RC)
+#define BOARD_FYSETC_CHEETAH_V30      5235  // FYSETC Cheetah V3.0 (STM32F446RC)
+#define BOARD_TH3D_EZBOARD_V2         5236  // TH3D EZBoard v2.0 (STM32F405RG)
+#define BOARD_OPULO_LUMEN_REV3        5237  // Opulo Lumen PnP Controller REV3 (STM32F407VE / STM32F407VG)
+#define BOARD_MKS_ROBIN_NANO_V1_3_F4  5238  // MKS Robin Nano V1.3 and MKS Robin Nano-S V1.3 (STM32F407VE)
+#define BOARD_MKS_EAGLE               5239  // MKS Eagle (STM32F407VE)
+#define BOARD_ARTILLERY_RUBY          5240  // Artillery Ruby (STM32F401RC)
+#define BOARD_CREALITY_V24S1_301F4    5241  // Creality v2.4.S1_301F4 (STM32F401RC) as found in the Ender-3 S1 F4
+#define BOARD_CREALITY_CR4NTXXC10     5242  // Creality E3 Free-runs Silent Motherboard (STM32F401RET6)
+#define BOARD_OPULO_LUMEN_REV4        5243  // Opulo Lumen PnP Controller REV4 (STM32F407VE / STM32F407VG)
+#define BOARD_FYSETC_SPIDER_KING407   5244  // FYSETC Spider King407 (STM32F407ZG)
+#define BOARD_MKS_SKIPR_V1            5245  // MKS SKIPR v1.0 all-in-one board (STM32F407VE)
+#define BOARD_TRONXY_CXY_446_V10      5246  // TRONXY CXY-446-V10-220413/CXY-V6-191121 (STM32F446ZE)
+#define BOARD_CREALITY_F401RE         5247  // Creality CR4NS200141C13 (STM32F401RE) as found in the Ender-5 S1
+#define BOARD_BLACKPILL_CUSTOM        5248  // Custom board based on STM32F401CDU6.
+#define BOARD_I3DBEEZ9_V1             5249  // I3DBEEZ9 V1 (STM32F407ZG)
+#define BOARD_MELLOW_FLY_E3_V2        5250  // Mellow Fly E3 V2 (STM32F407VG)
 #define BOARD_BLACKBEEZMINI_V1        5251  // BlackBeezMini V1 (STM32F401CCU6)
 #define BOARD_XTLW_CLIMBER_8TH        5252  // XTLW Climber-8th (STM32F407VGT6)
 
@@ -482,18 +482,18 @@
 //
 
 #define BOARD_REMRAM_V1               6000  // RemRam v1
-#define BOARD_TEENSY41                6001  // Teensy 4.1
-#define BOARD_T41U5XBB                6002  // T41U5XBB Teensy 4.1 breakout board
-#define BOARD_NUCLEO_F767ZI           6003  // ST NUCLEO-F767ZI Dev Board
-#define BOARD_BTT_SKR_SE_BX_V2        6004  // BigTreeTech SKR SE BX V2.0 (STM32H743II)
-#define BOARD_BTT_SKR_SE_BX_V3        6005  // BigTreeTech SKR SE BX V3.0 (STM32H743II)
-#define BOARD_BTT_SKR_V3_0            6006  // BigTreeTech SKR V3.0 (STM32H743VI / STM32H723VG)
-#define BOARD_BTT_SKR_V3_0_EZ         6007  // BigTreeTech SKR V3.0 EZ (STM32H743VI / STM32H723VG)
-#define BOARD_BTT_OCTOPUS_MAX_EZ_V1_0 6008  // BigTreeTech Octopus Max EZ V1.0 (STM32H723ZE)
-#define BOARD_BTT_OCTOPUS_PRO_V1_0_1  6009  // BigTreeTech Octopus Pro v1.0.1 (STM32H723ZE)
-#define BOARD_BTT_OCTOPUS_PRO_V1_1    6010  // BigTreeTech Octopus Pro v1.1 (STM32H723ZE)
-#define BOARD_BTT_MANTA_M8P_V2_0      6011  // BigTreeTech Manta M8P V2.0 (STM32H723ZE)
-#define BOARD_BTT_KRAKEN_V1_0         6012  // BigTreeTech Kraken v1.0 (STM32H723ZG)
+#define BOARD_NUCLEO_F767ZI           6001  // ST NUCLEO-F767ZI Dev Board
+#define BOARD_BTT_SKR_SE_BX_V2        6002  // BigTreeTech SKR SE BX V2.0 (STM32H743II)
+#define BOARD_BTT_SKR_SE_BX_V3        6003  // BigTreeTech SKR SE BX V3.0 (STM32H743II)
+#define BOARD_BTT_SKR_V3_0            6004  // BigTreeTech SKR V3.0 (STM32H743VI / STM32H723VG)
+#define BOARD_BTT_SKR_V3_0_EZ         6005  // BigTreeTech SKR V3.0 EZ (STM32H743VI / STM32H723VG)
+#define BOARD_BTT_OCTOPUS_MAX_EZ_V1_0 6006  // BigTreeTech Octopus Max EZ V1.0 (STM32H723ZE)
+#define BOARD_BTT_OCTOPUS_PRO_V1_0_1  6007  // BigTreeTech Octopus Pro v1.0.1 (STM32H723ZE)
+#define BOARD_BTT_OCTOPUS_PRO_V1_1    6008  // BigTreeTech Octopus Pro v1.1 (STM32H723ZE)
+#define BOARD_BTT_MANTA_M8P_V2_0      6009  // BigTreeTech Manta M8P V2.0 (STM32H723ZE)
+#define BOARD_BTT_KRAKEN_V1_0         6010  // BigTreeTech Kraken v1.0 (STM32H723ZG)
+#define BOARD_TEENSY41                6011  // Teensy 4.1
+#define BOARD_T41U5XBB                6012  // T41U5XBB Teensy 4.1 breakout board
 
 //
 // Espressif ESP32 WiFi
@@ -543,7 +543,7 @@
 // Simulations
 //
 
-#define BOARD_SIMULATED               9999
+#define BOARD_SIMULATED               9999  // Simulated 3D Printer with LCD / TFT for development
 
 #define _MB_1(B)  (defined(BOARD_##B) && MOTHERBOARD==BOARD_##B)
 #define MB(V...)  DO(MB,||,V)

+ 68 - 56
Marlin/src/pins/pins.h

@@ -202,20 +202,20 @@
   #include "ramps/pins_AZTEEG_X3_PRO.h"             // ATmega2560                           env:mega2560
 #elif MB(ULTIMAIN_2)
   #include "ramps/pins_ULTIMAIN_2.h"                // ATmega2560                           env:mega2560ext
-#elif MB(FORMBOT_RAPTOR)
-  #include "ramps/pins_FORMBOT_RAPTOR.h"            // ATmega2560                           env:mega2560
-#elif MB(FORMBOT_RAPTOR2)
-  #include "ramps/pins_FORMBOT_RAPTOR2.h"           // ATmega2560                           env:mega2560
-#elif MB(FORMBOT_TREX2PLUS)
-  #include "ramps/pins_FORMBOT_TREX2PLUS.h"         // ATmega2560                           env:mega2560
-#elif MB(FORMBOT_TREX3)
-  #include "ramps/pins_FORMBOT_TREX3.h"             // ATmega2560                           env:mega2560
 #elif MB(RUMBA)
   #include "ramps/pins_RUMBA.h"                     // ATmega2560                           env:mega2560
 #elif MB(RUMBA_RAISE3D)
   #include "ramps/pins_RUMBA_RAISE3D.h"             // ATmega2560                           env:mega2560
 #elif MB(RL200)
   #include "ramps/pins_RL200.h"                     // ATmega2560                           env:mega2560
+#elif MB(FORMBOT_TREX2PLUS)
+  #include "ramps/pins_FORMBOT_TREX2PLUS.h"         // ATmega2560                           env:mega2560
+#elif MB(FORMBOT_TREX3)
+  #include "ramps/pins_FORMBOT_TREX3.h"             // ATmega2560                           env:mega2560
+#elif MB(FORMBOT_RAPTOR)
+  #include "ramps/pins_FORMBOT_RAPTOR.h"            // ATmega2560                           env:mega2560
+#elif MB(FORMBOT_RAPTOR2)
+  #include "ramps/pins_FORMBOT_RAPTOR2.h"           // ATmega2560                           env:mega2560
 #elif MB(BQ_ZUM_MEGA_3D)
   #include "ramps/pins_BQ_ZUM_MEGA_3D.h"            // ATmega2560                           env:mega2560ext
 #elif MB(MAKEBOARD_MINI)
@@ -250,6 +250,8 @@
   #include "ramps/pins_TANGO.h"                     // ATmega2560                           env:mega2560
 #elif MB(MKS_GEN_L_V2)
   #include "ramps/pins_MKS_GEN_L_V2.h"              // ATmega2560                           env:mega2560
+#elif MB(MKS_GEN_L_V21)
+  #include "ramps/pins_MKS_GEN_L_V21.h"             // ATmega2560                           env:mega2560
 #elif MB(COPYMASTER_3D)
   #include "ramps/pins_COPYMASTER_3D.h"             // ATmega2560                           env:mega2560
 #elif MB(ORTUR_4)
@@ -258,8 +260,6 @@
   #include "ramps/pins_TENLOG_D3_HERO.h"            // ATmega2560                           env:mega2560
 #elif MB(TENLOG_MB1_V23)
   #include "ramps/pins_TENLOG_MB1_V23.h"            // ATmega2560                           env:mega2560
-#elif MB(MKS_GEN_L_V21)
-  #include "ramps/pins_MKS_GEN_L_V21.h"             // ATmega2560                           env:mega2560
 #elif MB(RAMPS_S_12_EEFB, RAMPS_S_12_EEEB, RAMPS_S_12_EFFB)
   #include "ramps/pins_RAMPS_S_12.h"                // ATmega2560                           env:mega2560
 #elif MB(LONGER3D_LK1_PRO, LONGER3D_LKx_PRO)
@@ -302,12 +302,12 @@
   #include "mega/pins_CNCONTROLS_12.h"              // ATmega2560, ATmega1280               env:mega2560 env:mega1280
 #elif MB(CNCONTROLS_15)
   #include "mega/pins_CNCONTROLS_15.h"              // ATmega2560, ATmega1280               env:mega2560 env:mega1280
-#elif MB(MIGHTYBOARD_REVE)
-  #include "mega/pins_MIGHTYBOARD_REVE.h"           // ATmega2560, ATmega1280               env:mega2560ext env:MightyBoard1280 env:MightyBoard2560
 #elif MB(CHEAPTRONIC)
   #include "mega/pins_CHEAPTRONIC.h"                // ATmega2560                           env:mega2560
 #elif MB(CHEAPTRONIC_V2)
   #include "mega/pins_CHEAPTRONICv2.h"              // ATmega2560                           env:mega2560
+#elif MB(MIGHTYBOARD_REVE)
+  #include "mega/pins_MIGHTYBOARD_REVE.h"           // ATmega2560, ATmega1280               env:mega2560ext env:MightyBoard1280 env:MightyBoard2560
 #elif MB(MEGATRONICS)
   #include "mega/pins_MEGATRONICS.h"                // ATmega2560                           env:mega2560
 #elif MB(MEGATRONICS_2)
@@ -324,18 +324,18 @@
   #include "mega/pins_GT2560_REV_A.h"               // ATmega2560, ATmega1280               env:mega2560 env:mega1280
 #elif MB(GT2560_REV_A_PLUS)
   #include "mega/pins_GT2560_REV_A_PLUS.h"          // ATmega2560, ATmega1280               env:mega2560 env:mega1280
-#elif MB(GT2560_V3)
-  #include "mega/pins_GT2560_V3.h"                  // ATmega2560                           env:mega2560
 #elif MB(GT2560_REV_B)
   #include "mega/pins_GT2560_REV_B.h"               // ATmega2560                           env:mega2560
-#elif MB(GT2560_V4)
-  #include "mega/pins_GT2560_V4.h"                  // ATmega2560                           env:mega2560
-#elif MB(GT2560_V4_A20)
-  #include "mega/pins_GT2560_V4_A20.h"              // ATmega2560                           env:mega2560
+#elif MB(GT2560_V3)
+  #include "mega/pins_GT2560_V3.h"                  // ATmega2560                           env:mega2560
 #elif MB(GT2560_V3_MC2)
   #include "mega/pins_GT2560_V3_MC2.h"              // ATmega2560                           env:mega2560
 #elif MB(GT2560_V3_A20)
   #include "mega/pins_GT2560_V3_A20.h"              // ATmega2560                           env:mega2560
+#elif MB(GT2560_V4)
+  #include "mega/pins_GT2560_V4.h"                  // ATmega2560                           env:mega2560
+#elif MB(GT2560_V4_A20)
+  #include "mega/pins_GT2560_V4_A20.h"              // ATmega2560                           env:mega2560
 #elif MB(EINSTART_S)
   #include "mega/pins_EINSTART-S.h"                 // ATmega2560, ATmega1280               env:mega2560ext env:mega1280
 #elif MB(WANHAO_ONEPLUS)
@@ -348,10 +348,10 @@
   #include "mega/pins_HJC2560C_REV2.h"              // ATmega2560                           env:mega2560
 #elif MB(LEAPFROG_XEED2015)
   #include "mega/pins_LEAPFROG_XEED2015.h"          // ATmega2560                           env:mega2560
-#elif MB(PICA)
-  #include "mega/pins_PICA.h"                       // ATmega2560                           env:mega2560
 #elif MB(PICA_REVB)
   #include "mega/pins_PICAOLD.h"                    // ATmega2560                           env:mega2560
+#elif MB(PICA)
+  #include "mega/pins_PICA.h"                       // ATmega2560                           env:mega2560
 #elif MB(INTAMSYS40)
   #include "mega/pins_INTAMSYS40.h"                 // ATmega2560                           env:mega2560
 #elif MB(MALYAN_M180)
@@ -398,6 +398,8 @@
   #include "sanguino/pins_STB_11.h"                 // ATmega644P, ATmega1284P              env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p
 #elif MB(AZTEEG_X1)
   #include "sanguino/pins_AZTEEG_X1.h"              // ATmega644P, ATmega1284P              env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p
+#elif MB(ANET_10)
+  #include "sanguino/pins_ANET_10.h"                // ATmega1284P                          env:sanguino1284p env:sanguino1284p_optimized env:melzi_optiboot
 #elif MB(ZMIB_V2)
   #include "sanguino/pins_ZMIB_V2.h"                // ATmega644P, ATmega1284P              env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p
 
@@ -425,8 +427,6 @@
   #include "sanguino/pins_OMCA_A.h"                 // ATmega644                            env:sanguino644p
 #elif MB(OMCA)
   #include "sanguino/pins_OMCA.h"                   // ATmega644P, ATmega644                env:sanguino644p
-#elif MB(ANET_10)
-  #include "sanguino/pins_ANET_10.h"                // ATmega1284P                          env:sanguino1284p env:sanguino1284p_optimized env:melzi_optiboot
 #elif MB(SETHI)
   #include "sanguino/pins_SETHI.h"                  // ATmega644P, ATmega644, ATmega1284P   env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p
 
@@ -459,8 +459,6 @@
   #include "lpc1768/pins_RAMPS_RE_ARM.h"            // LPC1768                              env:LPC1768
 #elif MB(MKS_SBASE)
   #include "lpc1768/pins_MKS_SBASE.h"               // LPC1768                              env:LPC1768
-#elif MB(MKS_SGEN_L)
-  #include "lpc1768/pins_MKS_SGEN_L.h"              // LPC1768                              env:LPC1768
 #elif MB(AZSMZ_MINI)
   #include "lpc1768/pins_AZSMZ_MINI.h"              // LPC1768                              env:LPC1768
 #elif MB(BIQU_BQ111_A4)
@@ -469,6 +467,8 @@
   #include "lpc1768/pins_SELENA_COMPACT.h"          // LPC1768                              env:LPC1768
 #elif MB(BIQU_B300_V1_0)
   #include "lpc1768/pins_BIQU_B300_V1.0.h"          // LPC1768                              env:LPC1768
+#elif MB(MKS_SGEN_L)
+  #include "lpc1768/pins_MKS_SGEN_L.h"              // LPC1768                              env:LPC1768
 #elif MB(GMARSH_X6_REV1)
   #include "lpc1768/pins_GMARSH_X6_REV1.h"          // LPC1768                              env:LPC1768
 #elif MB(BTT_SKR_V1_1)
@@ -512,7 +512,7 @@
   #include "lpc1769/pins_XTLW_CLIMBER_8TH_LPC.h"    // LPC1769                              env:LPC1769
 
 //
-// Due (ATSAM) boards
+// SAM3X8E ARM Cortex-M3
 //
 
 #elif MB(DUE3DOM)
@@ -521,10 +521,6 @@
   #include "sam/pins_DUE3DOM_MINI.h"                // SAM3X8E                              env:DUE env:DUE_USB env:DUE_debug
 #elif MB(RADDS)
   #include "sam/pins_RADDS.h"                       // SAM3X8E                              env:DUE env:DUE_USB env:DUE_debug
-#elif MB(RURAMPS4D_11)
-  #include "sam/pins_RURAMPS4D_11.h"                // SAM3X8E                              env:DUE env:DUE_USB env:DUE_debug
-#elif MB(RURAMPS4D_13)
-  #include "sam/pins_RURAMPS4D_13.h"                // SAM3X8E                              env:DUE env:DUE_USB env:DUE_debug
 #elif MB(RAMPS_FD_V1)
   #include "sam/pins_RAMPS_FD_V1.h"                 // SAM3X8E                              env:DUE env:DUE_USB env:DUE_debug
 #elif MB(RAMPS_FD_V2)
@@ -535,6 +531,10 @@
   #include "sam/pins_RAMPS_DUO.h"                   // SAM3X8E                              env:DUE env:DUE_USB env:DUE_debug
 #elif MB(RAMPS4DUE_EFB, RAMPS4DUE_EEB, RAMPS4DUE_EFF, RAMPS4DUE_EEF, RAMPS4DUE_SF)
   #include "sam/pins_RAMPS4DUE.h"                   // SAM3X8E                              env:DUE env:DUE_USB env:DUE_debug
+#elif MB(RURAMPS4D_11)
+  #include "sam/pins_RURAMPS4D_11.h"                // SAM3X8E                              env:DUE env:DUE_USB env:DUE_debug
+#elif MB(RURAMPS4D_13)
+  #include "sam/pins_RURAMPS4D_13.h"                // SAM3X8E                              env:DUE env:DUE_USB env:DUE_debug
 #elif MB(ULTRATRONICS_PRO)
   #include "sam/pins_ULTRATRONICS_PRO.h"            // SAM3X8E                              env:DUE env:DUE_debug
 #elif MB(ARCHIM1)
@@ -547,19 +547,15 @@
   #include "sam/pins_CNCONTROLS_15D.h"              // SAM3X8E                              env:DUE env:DUE_USB
 #elif MB(KRATOS32)
   #include "sam/pins_KRATOS32.h"                    // SAM3X8E                              env:DUE env:DUE_USB
-#elif MB(PRINTRBOARD_G2)
-  #include "sam/pins_PRINTRBOARD_G2.h"              // SAM3X8C                              env:DUE_USB
-#elif MB(ADSK)
-  #include "sam/pins_ADSK.h"                        // SAM3X8C                              env:DUE env:DUE_debug
 
 //
-// STM32 ARM Cortex-M0
+// SAM3X8C ARM Cortex-M3
 //
 
-#elif MB(MALYAN_M200_V2)
-  #include "stm32f0/pins_MALYAN_M200_V2.h"          // STM32F0                              env:STM32F070RB_malyan env:STM32F070CB_malyan
-#elif MB(MALYAN_M300)
-  #include "stm32f0/pins_MALYAN_M300.h"             // STM32F0                              env:malyan_M300
+#elif MB(PRINTRBOARD_G2)
+  #include "sam/pins_PRINTRBOARD_G2.h"              // SAM3X8C                              env:DUE_USB
+#elif MB(ADSK)
+  #include "sam/pins_ADSK.h"                        // SAM3X8C                              env:DUE env:DUE_debug
 
 //
 // STM32 ARM Cortex-M0+
@@ -569,17 +565,26 @@
   #include "stm32g0/pins_BTT_EBB42_V1_1.h"          // STM32G0                              env:BTT_EBB42_V1_1_filament_extruder
 #elif MB(BTT_SKR_MINI_E3_V3_0)
   #include "stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h"    // STM32G0                              env:STM32G0B1RE_btt env:STM32G0B1RE_btt_xfer
+#elif MB(BTT_MANTA_E3_EZ_V1_0)
+  #include "stm32g0/pins_BTT_MANTA_E3_EZ_V1_0.h"    // STM32G0                              env:STM32G0B1RE_manta_btt
 #elif MB(BTT_MANTA_M4P_V2_1)
   #include "stm32g0/pins_BTT_MANTA_M4P_V2_1.h"      // STM32G0                              env:STM32G0B1RE_manta_btt
 #elif MB(BTT_MANTA_M5P_V1_0)
   #include "stm32g0/pins_BTT_MANTA_M5P_V1_0.h"      // STM32G0                              env:STM32G0B1RE_manta_btt
-#elif MB(BTT_MANTA_E3_EZ_V1_0)
-  #include "stm32g0/pins_BTT_MANTA_E3_EZ_V1_0.h"    // STM32G0                              env:STM32G0B1RE_manta_btt
 #elif MB(BTT_MANTA_M8P_V1_0)
   #include "stm32g0/pins_BTT_MANTA_M8P_V1_0.h"      // STM32G0                              env:STM32G0B1VE_btt
 #elif MB(BTT_MANTA_M8P_V1_1)
   #include "stm32g0/pins_BTT_MANTA_M8P_V1_1.h"      // STM32G0                              env:STM32G0B1VE_btt
 
+//
+// STM32 ARM Cortex-M0
+//
+
+#elif MB(MALYAN_M200_V2)
+  #include "stm32f0/pins_MALYAN_M200_V2.h"          // STM32F0                              env:STM32F070RB_malyan env:STM32F070CB_malyan
+#elif MB(MALYAN_M300)
+  #include "stm32f0/pins_MALYAN_M300.h"             // STM32F0                              env:malyan_M300
+
 //
 // STM32 ARM Cortex-M3
 //
@@ -662,30 +667,30 @@
   #include "stm32f1/pins_CHITU3D_V9.h"              // STM32F1                              env:chitu_f103 env:chitu_f103_maple
 #elif MB(CREALITY_V4)
   #include "stm32f1/pins_CREALITY_V4.h"             // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
-#elif MB(CREALITY_V4210)
-  #include "stm32f1/pins_CREALITY_V4210.h"          // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
-#elif MB(CREALITY_V425)
-  #include "stm32f1/pins_CREALITY_V425.h"           // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
 #elif MB(CREALITY_V422)
   #include "stm32f1/pins_CREALITY_V422.h"           // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
 #elif MB(CREALITY_V423)
   #include "stm32f1/pins_CREALITY_V423.h"           // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer
+#elif MB(CREALITY_V425)
+  #include "stm32f1/pins_CREALITY_V425.h"           // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
 #elif MB(CREALITY_V427)
   #include "stm32f1/pins_CREALITY_V427.h"           // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
+#elif MB(CREALITY_V4210)
+  #include "stm32f1/pins_CREALITY_V4210.h"          // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
 #elif MB(CREALITY_V431, CREALITY_V431_A, CREALITY_V431_B, CREALITY_V431_C, CREALITY_V431_D)
   #include "stm32f1/pins_CREALITY_V431.h"           // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
 #elif MB(CREALITY_V452)
   #include "stm32f1/pins_CREALITY_V452.h"           // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
 #elif MB(CREALITY_V453)
   #include "stm32f1/pins_CREALITY_V453.h"           // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
+#elif MB(CREALITY_V521)
+  #include "stm32f1/pins_CREALITY_V521.h"           // STM32F1                              env:STM32F103VE_creality
 #elif MB(CREALITY_V24S1)
   #include "stm32f1/pins_CREALITY_V24S1.h"          // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
 #elif MB(CREALITY_V24S1_301)
   #include "stm32f1/pins_CREALITY_V24S1_301.h"      // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple
 #elif MB(CREALITY_V25S1)
   #include "stm32f1/pins_CREALITY_V25S1.h"          // STM32F1                              env:STM32F103RE_creality_smartPro env:STM32F103RE_creality_smartPro_maple
-#elif MB(CREALITY_V521)
-  #include "stm32f1/pins_CREALITY_V521.h"           // STM32F1                              env:STM32F103VE_creality
 #elif MB(TRIGORILLA_PRO)
   #include "stm32f1/pins_TRIGORILLA_PRO.h"          // STM32F1                              env:trigorilla_pro env:trigorilla_pro_maple env:trigorilla_pro_disk
 #elif MB(FLY_MINI)
@@ -718,8 +723,6 @@
   #include "gd32f1/pins_VOXELAB_AQUILA.h"           // GD32F1, N32G4, STM32F1               env:GD32F103RC_voxelab_maple env:N32G455RE_voxelab_maple env:STM32F103RE_creality_maple env:STM32F103RE_creality
 #elif MB(SPRINGER_CONTROLLER)
   #include "stm32f1/pins_ORCA_3D_SPRINGER.h"        // STM32F1                              env:STM32F103VC_orca3d
-#elif MB(CREALITY_CR4NS)
-  #include "stm32f1/pins_CREALITY_CR4NS.h"          // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_maple
 
 //
 // ARM Cortex-M4F
@@ -744,22 +747,24 @@
   #include "stm32f4/pins_RUMBA32_BTT.h"             // STM32F4                              env:rumba32
 #elif MB(BLACK_STM32F407VE)
   #include "stm32f4/pins_BLACK_STM32F407VE.h"       // STM32F4                              env:STM32F407VE_black
+#elif MB(BLACK_STM32F407ZE)
+  #error "BLACK_STM32F407ZE is not yet supported."
+#elif MB(BTT_SKR_MINI_E3_V3_0_1)
+  #include "stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h"  // STM32F4                              env:STM32F401RC_btt env:STM32F401RC_btt_xfer
 #elif MB(BTT_SKR_PRO_V1_1)
   #include "stm32f4/pins_BTT_SKR_PRO_V1_1.h"        // STM32F4                              env:BTT_SKR_PRO env:BTT_SKR_PRO_usb_flash_drive
 #elif MB(BTT_SKR_PRO_V1_2)
   #include "stm32f4/pins_BTT_SKR_PRO_V1_2.h"        // STM32F4                              env:BTT_SKR_PRO env:BTT_SKR_PRO_usb_flash_drive
-#elif MB(BTT_GTR_V1_0)
-  #include "stm32f4/pins_BTT_GTR_V1_0.h"            // STM32F4                              env:BTT_GTR_V1_0 env:BTT_GTR_V1_0_usb_flash_drive
 #elif MB(BTT_BTT002_V1_0)
   #include "stm32f4/pins_BTT_BTT002_V1_0.h"         // STM32F4                              env:BTT_BTT002 env:BTT_BTT002_VET6
 #elif MB(BTT_E3_RRF)
   #include "stm32f4/pins_BTT_E3_RRF.h"              // STM32F4                              env:BTT_E3_RRF
-#elif MB(BTT_SKR_MINI_E3_V3_0_1)
-  #include "stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h"  // STM32F4                              env:STM32F401RC_btt env:STM32F401RC_btt_xfer
 #elif MB(BTT_SKR_V2_0_REV_A)
   #include "stm32f4/pins_BTT_SKR_V2_0_REV_A.h"      // STM32F4                              env:STM32F407VG_btt env:STM32F407VG_btt_USB env:STM32F407VG_btt_USB_debug
 #elif MB(BTT_SKR_V2_0_REV_B)
   #include "stm32f4/pins_BTT_SKR_V2_0_REV_B.h"      // STM32F4                              env:STM32F407VG_btt env:STM32F407VG_btt_USB env:STM32F407VG_btt_USB_debug env:STM32F429VG_btt env:STM32F429VG_btt_USB env:STM32F429VG_btt_USB_debug
+#elif MB(BTT_GTR_V1_0)
+  #include "stm32f4/pins_BTT_GTR_V1_0.h"            // STM32F4                              env:BTT_GTR_V1_0 env:BTT_GTR_V1_0_usb_flash_drive
 #elif MB(BTT_OCTOPUS_V1_0)
   #include "stm32f4/pins_BTT_OCTOPUS_V1_0.h"        // STM32F4                              env:STM32F446ZE_btt env:STM32F446ZE_btt_usb_flash_drive
 #elif MB(BTT_OCTOPUS_V1_1)
@@ -790,6 +795,10 @@
   #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h"       // STM32F4                              env:mks_robin_nano_v3 env:mks_robin_nano_v3_usb_flash_drive env:mks_robin_nano_v3_usb_flash_drive_msc
 #elif MB(MKS_ROBIN_NANO_V3_1)
   #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h"       // STM32F4                              env:mks_robin_nano_v3_1 env:mks_robin_nano_v3_1_usb_flash_drive env:mks_robin_nano_v3_1_usb_flash_drive_msc
+#elif MB(MKS_MONSTER8_V1)
+  #include "stm32f4/pins_MKS_MONSTER8_V1.h"         // STM32F4                              env:mks_monster8 env:mks_monster8_usb_flash_drive env:mks_monster8_usb_flash_drive_msc
+#elif MB(MKS_MONSTER8_V2)
+  #include "stm32f4/pins_MKS_MONSTER8_V2.h"         // STM32F4                              env:mks_monster8 env:mks_monster8_usb_flash_drive env:mks_monster8_usb_flash_drive_msc
 #elif MB(ANET_ET4)
   #include "stm32f4/pins_ANET_ET4.h"                // STM32F4                              env:Anet_ET4_no_bootloader env:Anet_ET4_OpenBLT
 #elif MB(ANET_ET4P)
@@ -798,10 +807,6 @@
   #include "stm32f4/pins_FYSETC_CHEETAH_V20.h"      // STM32F4                              env:FYSETC_CHEETAH_V20
 #elif MB(FYSETC_CHEETAH_V30)
   #include "stm32f4/pins_FYSETC_CHEETAH_V30.h"      // STM32F4                              env:FYSETC_CHEETAH_V30
-#elif MB(MKS_MONSTER8_V1)
-  #include "stm32f4/pins_MKS_MONSTER8_V1.h"         // STM32F4                              env:mks_monster8 env:mks_monster8_usb_flash_drive env:mks_monster8_usb_flash_drive_msc
-#elif MB(MKS_MONSTER8_V2)
-  #include "stm32f4/pins_MKS_MONSTER8_V2.h"         // STM32F4                              env:mks_monster8 env:mks_monster8_usb_flash_drive env:mks_monster8_usb_flash_drive_msc
 #elif MB(TH3D_EZBOARD_V2)
   #include "stm32f4/pins_TH3D_EZBOARD_V2.h"         // STM32F4                              env:TH3D_EZBoard_V2_no_bootloader env:TH3D_EZBoard_V2_OpenBLT
 #elif MB(OPULO_LUMEN_REV3)
@@ -837,6 +842,13 @@
 #elif MB(XTLW_CLIMBER_8TH)
   #include "stm32f4/pins_XTLW_CLIMBER_8TH.h"        // STM32F4                              env:XTLW_CLIMBER_8TH
 
+//
+// Other ARM Cortex-M4
+//
+
+#elif MB(CREALITY_CR4NS)
+  #include "stm32f1/pins_CREALITY_CR4NS.h"          // STM32F1                              env:STM32F103RE_creality env:STM32F103RE_creality_maple
+
 //
 // ARM Cortex-M7
 //

+ 128 - 0
buildroot/share/scripts/validate_boards.py

@@ -0,0 +1,128 @@
+#!/usr/bin/env python3
+#
+# buildroot/share/scripts/validate_boards.py
+# Assert standards for boards.h and pins.h
+#
+
+import sys, re
+
+do_log = False
+def logmsg(msg, line):
+    if do_log: print(msg, line)
+
+# Print a formatted error
+def err(board, msg):
+  print(f'[ERROR] {board:30} {msg}')
+
+# Print a formatted warning
+def warn(board, msg):
+  print(f'[WARNING] {board:30} {msg}')
+
+def bshort(board):
+    return board.replace('BOARD_', '')
+
+#
+# Run standards checks on boards.h and pins.h
+#
+def boards_checks(argv):
+    ERRS = 0
+    src_file = 'Marlin/src/core/boards.h'
+
+    scnt = 0
+    for arg in argv:
+        if arg == '-v':
+            global do_log
+            do_log = True
+        elif scnt == 0:
+            src_file = arg
+            scnt += 1
+
+    logmsg('Checking boards file:', src_file)
+
+    # Open the file
+    with open(src_file, 'r') as f:
+        lines = f.readlines()
+
+    # Get the board names and numbers
+    boards = []
+    for line in lines:
+        m = re.match(r'^\s*#define\s+(BO\w+)\s+(\d+)(\s+//\s*(.+))?', line)
+        if not m: continue
+        board, number, comment = m.group(1), int(m.group(2)), m.group(4)
+        boards.append((board, number, comment))
+
+    #
+    # Examine boards.h to check the formatting of the file
+    #
+    last_number, last_groun = (-1, -1)
+
+    for board, number, comment in boards:
+        logmsg('Checking:', board)
+        group = int(number / 100)
+        if not re.match(r'^BOARD_\w+$', board):
+            err(board, 'is not of the form BOARD_NAME')
+            ERRS += 1
+        if number != last_number + 1:
+            if int(number / 100) != int(last_number / 100):
+                if number % 100 != 0 and number < 9900:
+                    err(board, f'is {number} (should be {group * 100}?)')
+                    ERRS += 1
+            elif number > 1040:
+                err(board, f'is {number} but previous board is {last_number}')
+                ERRS += 1
+        if not comment:
+            err(board, ' has no comment')
+            ERRS += 1
+        else:
+            cshor = bshort(board)
+            cbore = cshor.replace('_', '')
+            if comment == board or comment == cshor or comment == cbore:
+                warn(board, f'comment needs more detail')
+        last_number = number
+        last_group = number % 100
+
+    #
+    # Validate that pins.h has all the boards mentioned in it
+    #
+    pins_boards = []
+    with open('Marlin/src/pins/pins.h', 'r') as f:
+        lines = f.readlines()
+        if_count = 0
+        for line in lines:
+            m = re.search(r'#(if|elif)\s+MB\(([^)]+)\)', line)
+            if not m: continue
+            if (m.group(1) == 'if'):
+                if_count += 1
+                if if_count == 3: break
+            if if_count == 2:
+                mb_items = m.group(2).split(',')
+                for board in mb_items:
+                    pins_boards.append('BOARD_' + board.strip())
+
+    # Check that the list from boards.h matches the list from pins.h
+    boards_boards = [b[0] for b in boards]
+    if set(pins_boards) != set(boards_boards):
+        ERRS += 1
+        print(f'[ERROR] Boards in pins.h do not match boards.h')
+        # Show the differences only
+        for b in boards:
+            if b[0] not in pins_boards:
+                print(f'   pins.h missing: {b[0]}')
+        for b in pins_boards:
+            if b not in boards_boards:
+                print(f' boards.h missing: {b}')
+
+    # Check that boards_boards and pins_boards are in the same order
+    for i in range(len(boards_boards)):
+        if boards_boards[i] != pins_boards[i]:
+            ERRS += 1
+            print(f'[ERROR] Non-matching boards order in pins.h. Expected {bshort(boards_boards[i])} but got {bshort(pins_boards[i])}')
+            break
+
+    return ERRS;
+
+if __name__ == '__main__':
+    ERR_COUNT = boards_checks(sys.argv[1:])
+    if ERR_COUNT:
+        print(f'\nFound {ERR_COUNT} errors')
+        sys.exit(1)