Skip to content

Commit 624226c

Browse files
ellenspthinkyhead
andauthored
🩹 Fix STM32 CPU serial UUID (MarlinFirmware#26715)
Co-authored-by: Scott Lahteine <[email protected]>
1 parent 3adf73a commit 624226c

File tree

9 files changed

+64
-43
lines changed

9 files changed

+64
-43
lines changed

Marlin/src/core/language.h

-4
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,6 @@
8989
#define MACHINE_NAME DEFAULT_MACHINE_NAME
9090
#endif
9191

92-
#ifndef MACHINE_UUID
93-
#define MACHINE_UUID DEFAULT_MACHINE_UUID
94-
#endif
95-
9692
#define MARLIN_WEBSITE_URL "marlinfw.org"
9793

9894
//#if !defined(STRING_SPLASH_LINE3) && defined(WEBSITE_URL)

Marlin/src/gcode/host/M115.cpp

+23-15
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
#include "../../feature/caselight.h"
3636
#endif
3737

38-
#if ENABLED(HAS_STM32_UID) && !defined(MACHINE_UUID)
38+
#if !defined(MACHINE_UUID) && HAS_STM32_UID
3939
#include "../../libs/hex_print.h"
4040
#endif
4141

@@ -62,6 +62,7 @@
6262
* at https://reprap.org/wiki/Firmware_Capabilities_Protocol
6363
*/
6464
void GcodeSuite::M115() {
65+
6566
SERIAL_ECHOPGM("FIRMWARE_NAME:Marlin"
6667
" " DETAILED_BUILD_VERSION " (" __DATE__ " " __TIME__ ")"
6768
" SOURCE_CODE_URL:" SOURCE_CODE_URL
@@ -71,24 +72,31 @@ void GcodeSuite::M115() {
7172
#if NUM_AXES != XYZ
7273
" AXIS_COUNT:" STRINGIFY(NUM_AXES)
7374
#endif
75+
#if defined(MACHINE_UUID) || HAS_STM32_UID
76+
" UUID:"
77+
#endif
7478
#ifdef MACHINE_UUID
75-
" UUID:" MACHINE_UUID
79+
MACHINE_UUID
7680
#endif
7781
);
7882

79-
// STM32UID:111122223333
80-
#if ENABLED(HAS_STM32_UID) && !defined(MACHINE_UUID)
81-
// STM32 based devices output the CPU device serial number
82-
// Used by LumenPnP / OpenPNP to keep track of unique hardware/configurations
83-
// https://github.com/opulo-inc/lumenpnp
84-
// Although this code should work on all STM32 based boards
85-
SERIAL_ECHOPGM(" UUID:");
86-
uint32_t *uid_address = (uint32_t*)UID_BASE;
87-
for (uint8_t i = 0; i < 3; ++i) {
88-
const uint32_t UID = uint32_t(READ_REG(*(uid_address)));
89-
uid_address += 4U;
90-
for (int B = 24; B >= 0; B -= 8) print_hex_byte(UID >> B);
91-
}
83+
#if !defined(MACHINE_UUID) && HAS_STM32_UID
84+
/**
85+
* STM32-based devices have a 96-bit CPU device serial number.
86+
* Used by LumenPnP / OpenPNP to keep track of unique hardware/configurations.
87+
* https://github.com/opulo-inc/lumenpnp
88+
* This code should work on all STM32-based boards.
89+
*/
90+
#if ENABLED(STM32_UID_SHORT_FORM)
91+
uint32_t * const UID = (uint32_t*)UID_BASE;
92+
SERIAL_ECHO(hex_long(UID[0]), hex_long(UID[1]), hex_long(UID[2]));
93+
#else
94+
uint16_t * const UID = (uint16_t*)UID_BASE;
95+
SERIAL_ECHO(
96+
F("CEDE2A2F-"), hex_word(UID[0]), '-', hex_word(UID[1]), '-', hex_word(UID[2]), '-',
97+
hex_word(UID[3]), hex_word(UID[4]), hex_word(UID[5])
98+
);
99+
#endif
92100
#endif
93101

94102
SERIAL_EOL();

Marlin/src/inc/Conditionals_adv.h

-5
Original file line numberDiff line numberDiff line change
@@ -1243,11 +1243,6 @@
12431243
#define NO_EEPROM_SELECTED 1
12441244
#endif
12451245

1246-
// Flag whether hex_print.cpp is used
1247-
#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE, DEBUG_CARDREADER, M20_TIMESTAMP_SUPPORT)
1248-
#define NEED_HEX_PRINT 1
1249-
#endif
1250-
12511246
// Flags for Case Light having a color property or a single pin
12521247
#if ENABLED(CASE_LIGHT_ENABLE)
12531248
#if ANY(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED)

Marlin/src/inc/Conditionals_post.h

+12
Original file line numberDiff line numberDiff line change
@@ -3417,3 +3417,15 @@
34173417
FIL_RUNOUT5_PULLDOWN, FIL_RUNOUT6_PULLDOWN, FIL_RUNOUT7_PULLDOWN, FIL_RUNOUT8_PULLDOWN)
34183418
#define USING_PULLDOWNS 1
34193419
#endif
3420+
3421+
// Machine UUID can come from STM32 CPU Serial Number
3422+
#ifdef MACHINE_UUID
3423+
#undef HAS_STM32_UID
3424+
#elif !HAS_STM32_UID && defined(DEFAULT_MACHINE_UUID)
3425+
#define MACHINE_UUID DEFAULT_MACHINE_UUID
3426+
#endif
3427+
3428+
// Flag whether hex_print.cpp is needed
3429+
#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE, DEBUG_CARDREADER, M20_TIMESTAMP_SUPPORT, HAS_STM32_UID)
3430+
#define NEED_HEX_PRINT 1
3431+
#endif

Marlin/src/libs/hex_print.cpp

+14-16
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*
2121
*/
2222

23-
#include "../inc/MarlinConfigPre.h"
23+
#include "../inc/MarlinConfig.h"
2424

2525
#if NEED_HEX_PRINT
2626

@@ -41,28 +41,26 @@ char* hex_byte(const uint8_t b) {
4141
return &_hex[byte_start + 4];
4242
}
4343

44-
inline void _hex_word(const uint16_t w) {
44+
inline void __hex_word(const uint16_t w) {
4545
_hex[byte_start + 2] = hex_nybble(w >> 12);
4646
_hex[byte_start + 3] = hex_nybble(w >> 8);
4747
_hex[byte_start + 4] = hex_nybble(w >> 4);
4848
_hex[byte_start + 5] = hex_nybble(w);
4949
}
5050

51-
char* hex_word(const uint16_t w) {
52-
_hex_word(w);
51+
char* _hex_word(const uint16_t w) {
52+
__hex_word(w);
5353
return &_hex[byte_start + 2];
5454
}
5555

56-
#ifdef CPU_32_BIT
57-
char* hex_long(const uintptr_t l) {
58-
_hex[2] = hex_nybble(l >> 28);
59-
_hex[3] = hex_nybble(l >> 24);
60-
_hex[4] = hex_nybble(l >> 20);
61-
_hex[5] = hex_nybble(l >> 16);
62-
_hex_word((uint16_t)(l & 0xFFFF));
63-
return &_hex[2];
64-
}
65-
#endif
56+
char* _hex_long(const uintptr_t l) {
57+
_hex[2] = hex_nybble(l >> 28);
58+
_hex[3] = hex_nybble(l >> 24);
59+
_hex[4] = hex_nybble(l >> 20);
60+
_hex[5] = hex_nybble(l >> 16);
61+
__hex_word((uint16_t)(l & 0xFFFF));
62+
return &_hex[2];
63+
}
6664

6765
char* hex_address(const void * const w) {
6866
#ifdef CPU_32_BIT
@@ -78,11 +76,11 @@ void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); }
7876
void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); }
7977
void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); }
8078

81-
void print_hex_long(const uint32_t w, const char delimiter) {
79+
void print_hex_long(const uint32_t w, const char delimiter/*='\0'*/) {
8280
SERIAL_ECHOPGM("0x");
8381
for (int B = 24; B >= 8; B -= 8) {
8482
print_hex_byte(w >> B);
85-
SERIAL_CHAR(delimiter);
83+
if (delimiter) SERIAL_CHAR(delimiter);
8684
}
8785
print_hex_byte(w);
8886
}

Marlin/src/libs/hex_print.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,15 @@ constexpr char hex_nybble(const uint8_t n) {
3131
return (n & 0xF) + ((n & 0xF) < 10 ? '0' : 'A' - 10);
3232
}
3333
char* hex_byte(const uint8_t b);
34-
char* hex_word(const uint16_t w);
34+
char* _hex_word(const uint16_t w);
3535
char* hex_address(const void * const w);
36+
char* _hex_long(const uintptr_t l);
37+
38+
template<typename T> char* hex_word(T w) { return hex_word((uint16_t)w); }
39+
template<typename T> char* hex_long(T w) { return hex_long((uint32_t)w); }
3640

3741
void print_hex_nybble(const uint8_t n);
3842
void print_hex_byte(const uint8_t b);
3943
void print_hex_word(const uint16_t w);
4044
void print_hex_address(const void * const w);
41-
void print_hex_long(const uint32_t w, const char delimiter);
45+
void print_hex_long(const uint32_t w, const char delimiter='\0');

Marlin/src/pins/stm32f4/pins_OPULO_LUMEN_REV3.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@
4444

4545
// I2C MCP3426 (16-Bit, 240SPS, dual-channel ADC)
4646
#define HAS_MCP3426_ADC
47+
48+
// Opulo Lumen uses the CPU serial number
4749
#ifdef STM32F4
48-
#define HAS_STM32_UID
50+
#define HAS_STM32_UID 1
4951
#endif
5052

5153
//

Marlin/src/pins/stm32f4/pins_OPULO_LUMEN_REV4.h

+5
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@
4545
// I2C MCP3426 (16-Bit, 240SPS, dual-channel ADC)
4646
#define HAS_MCP3426_ADC
4747

48+
// Opulo Lumen uses the CPU serial number
49+
#ifdef STM32F4
50+
#define HAS_STM32_UID 1
51+
#endif
52+
4853
//
4954
// Servos
5055
//

buildroot/tests/Opulo_Lumen_REV3

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
set -e
88

99
use_example_configs Opulo/Lumen_REV3
10+
opt_disable TMC_DEBUG
1011
exec_test $1 $2 "Opulo Lumen REV3 Pick-and-Place" "$3"
1112

1213
# cleanup

0 commit comments

Comments
 (0)