From e57bbf9dbe25505a9f02d83f111d9df7852c18df Mon Sep 17 00:00:00 2001 From: OutOfSync1 Date: Mon, 12 Apr 2021 11:40:56 +0200 Subject: [PATCH] generate unique serial number (#90) (#131) * generate unique serial number (#90) * see https://github.com/ricaun/ArduinoUniqueID * calculated from ESP.getEfuseMac() on ESP32 * ESP.getChipId() on ESP8266 * SERIAL_NUMBER_WORD_0-3 on SAMD * HAL_GetUIDw0-2() on STM32 * defaults to 0x01020304 on other platforms * fix variable name for ESP platform * another fix variable name for ESP platform (need more coffee...) --- src/esp32_platform.cpp | 12 ++++++++++++ src/esp32_platform.h | 3 +++ src/esp_platform.cpp | 9 +++++++++ src/esp_platform.h | 5 ++++- src/knx/platform.cpp | 5 +++++ src/knx/platform.h | 3 +++ src/knx_facade.h | 7 +++++-- src/samd_platform.cpp | 24 ++++++++++++++++++++++++ src/samd_platform.h | 3 +++ src/stm32_platform.cpp | 9 +++++++++ src/stm32_platform.h | 3 +++ 11 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/esp32_platform.cpp b/src/esp32_platform.cpp index ccf74a8..585464f 100644 --- a/src/esp32_platform.cpp +++ b/src/esp32_platform.cpp @@ -37,6 +37,18 @@ void Esp32Platform::macAddress(uint8_t * addr) esp_wifi_get_mac(WIFI_IF_STA, addr); } +uint32_t Esp32Platform::uniqueSerialNumber() +{ + uint64_t chipid = ESP.getEfuseMac(); + uint32_t upperId = (chipid >> 32) & 0xFFFFFFFF; + uint32_t lowerId = (chipid & 0xFFFFFFFF); + uint32_t uniqueId = (upperId ^ lowerId); + + Serial.printf("uniqueSerialNumber: %0X ^ %0X ==> %0X\n", upperId, lowerId, uniqueId); + + return uniqueId; +} + void Esp32Platform::restart() { println("restart"); diff --git a/src/esp32_platform.h b/src/esp32_platform.h index 3c006ba..ff06179 100644 --- a/src/esp32_platform.h +++ b/src/esp32_platform.h @@ -16,6 +16,9 @@ public: uint32_t currentDefaultGateway() override; void macAddress(uint8_t* addr) override; + // unique serial number + uint32_t uniqueSerialNumber() override; + // basic stuff void restart(); diff --git a/src/esp_platform.cpp b/src/esp_platform.cpp index eb2b545..ffb3414 100644 --- a/src/esp_platform.cpp +++ b/src/esp_platform.cpp @@ -38,6 +38,15 @@ void EspPlatform::macAddress(uint8_t * addr) wifi_get_macaddr(STATION_IF, addr); } +uint32_t EspPlatform::uniqueSerialNumber() +{ + uint32_t chipid = ESP.getChipId(); + + Serial.printf("uniqueSerialNumber: %0X\n", chipid); + + return chipid; +} + void EspPlatform::restart() { println("restart"); diff --git a/src/esp_platform.h b/src/esp_platform.h index cd026d8..04234a4 100644 --- a/src/esp_platform.h +++ b/src/esp_platform.h @@ -16,6 +16,9 @@ class EspPlatform : public ArduinoPlatform uint32_t currentDefaultGateway() override; void macAddress(uint8_t* addr) override; + // unique serial number + uint32_t uniqueSerialNumber() override; + // basic stuff void restart(); @@ -30,7 +33,7 @@ class EspPlatform : public ArduinoPlatform void commitToEeprom(); private: WiFiUDP _udp; - uint32_t _mulitcastAddr; + uint32_t _mulitcastAddr; uint16_t _mulitcastPort; }; diff --git a/src/knx/platform.cpp b/src/knx/platform.cpp index 2484ba1..1816960 100644 --- a/src/knx/platform.cpp +++ b/src/knx/platform.cpp @@ -72,6 +72,11 @@ uint32_t Platform::currentDefaultGateway() void Platform::macAddress(uint8_t *data) {} +uint32_t Platform::uniqueSerialNumber() +{ + return 0x01020304; +} + void Platform::setupMultiCast(uint32_t addr, uint16_t port) {} diff --git a/src/knx/platform.h b/src/knx/platform.h index 8604484..769083f 100644 --- a/src/knx/platform.h +++ b/src/knx/platform.h @@ -20,6 +20,9 @@ class Platform virtual uint32_t currentDefaultGateway(); virtual void macAddress(uint8_t* data); + // unique serial number + virtual uint32_t uniqueSerialNumber(); + // basic stuff virtual void restart() = 0; virtual void fatalError() = 0; diff --git a/src/knx_facade.h b/src/knx_facade.h index 27e024a..e858440 100644 --- a/src/knx_facade.h +++ b/src/knx_facade.h @@ -49,18 +49,21 @@ template class KnxFacade : private SaveRestore KnxFacade() : _platformPtr(new P()), _bauPtr(new B(*_platformPtr)), _bau(*_bauPtr) { manufacturerId(0xfa); + bauNumber(platform().uniqueSerialNumber()); _bau.addSaveRestore(this); } KnxFacade(B& bau) : _bau(bau) { manufacturerId(0xfa); + bauNumber(platform().uniqueSerialNumber()); _bau.addSaveRestore(this); } KnxFacade(IsrFunctionPtr buttonISRFunction) : _platformPtr(new P()), _bauPtr(new B(*_platformPtr)), _bau(*_bauPtr) { manufacturerId(0xfa); + bauNumber(platform().uniqueSerialNumber()); _bau.addSaveRestore(this); setButtonISRFunction(buttonISRFunction); } @@ -221,7 +224,7 @@ template class KnxFacade : private SaveRestore { _bau.deviceObject().bauNumber(value); } - + void orderNumber(const uint8_t* value) { _bau.deviceObject().orderNumber(value); @@ -231,7 +234,7 @@ template class KnxFacade : private SaveRestore { _bau.deviceObject().hardwareType(value); } - + void version(uint16_t value) { _bau.deviceObject().version(value); diff --git a/src/samd_platform.cpp b/src/samd_platform.cpp index 23f4e08..c003838 100644 --- a/src/samd_platform.cpp +++ b/src/samd_platform.cpp @@ -17,6 +17,30 @@ SamdPlatform::SamdPlatform( HardwareSerial* s) : ArduinoPlatform(s) { } +uint32_t SamdPlatform::uniqueSerialNumber() +{ + #if defined (__SAMD51__) + // SAMD51 from section 9.6 of the datasheet + #define SERIAL_NUMBER_WORD_0 *(volatile uint32_t*)(0x008061FC) + #define SERIAL_NUMBER_WORD_1 *(volatile uint32_t*)(0x00806010) + #define SERIAL_NUMBER_WORD_2 *(volatile uint32_t*)(0x00806014) + #define SERIAL_NUMBER_WORD_3 *(volatile uint32_t*)(0x00806018) + #else + //#elif defined (__SAMD21E17A__) || defined(__SAMD21G18A__) || defined(__SAMD21E18A__) || defined(__SAMD21J18A__) + // SAMD21 from section 9.3.3 of the datasheet + #define SERIAL_NUMBER_WORD_0 *(volatile uint32_t*)(0x0080A00C) + #define SERIAL_NUMBER_WORD_1 *(volatile uint32_t*)(0x0080A040) + #define SERIAL_NUMBER_WORD_2 *(volatile uint32_t*)(0x0080A044) + #define SERIAL_NUMBER_WORD_3 *(volatile uint32_t*)(0x0080A048) + #endif + + uint32_t uniqueId = SERIAL_NUMBER_WORD_0 ^ SERIAL_NUMBER_WORD_1 ^ SERIAL_NUMBER_WORD_2 ^ SERIAL_NUMBER_WORD_3; + + printf("uniqueSerialNumber: %0X\n", uniqueId); + + return uniqueId; +} + void SamdPlatform::restart() { println("restart"); diff --git a/src/samd_platform.h b/src/samd_platform.h index 6b45c83..dd1765d 100644 --- a/src/samd_platform.h +++ b/src/samd_platform.h @@ -10,6 +10,9 @@ public: SamdPlatform(); SamdPlatform( HardwareSerial* s); + // unique serial number + uint32_t uniqueSerialNumber() override; + void restart(); uint8_t* getEepromBuffer(uint16_t size); void commitToEeprom(); diff --git a/src/stm32_platform.cpp b/src/stm32_platform.cpp index ea3d405..9b7c979 100644 --- a/src/stm32_platform.cpp +++ b/src/stm32_platform.cpp @@ -20,6 +20,15 @@ Stm32Platform::~Stm32Platform() delete [] _eepromPtr; } +uint32_t Stm32Platform::uniqueSerialNumber() +{ + uint32_t uniqueId = HAL_GetUIDw0() ^ HAL_GetUIDw1() ^ HAL_GetUIDw2(); + + printf("uniqueSerialNumber: %0X", uniqueId); + + return uniqueId; +} + void Stm32Platform::restart() { NVIC_SystemReset(); diff --git a/src/stm32_platform.h b/src/stm32_platform.h index 04870ec..056a327 100644 --- a/src/stm32_platform.h +++ b/src/stm32_platform.h @@ -8,6 +8,9 @@ public: Stm32Platform( HardwareSerial* s); ~Stm32Platform(); + // unique serial number + uint32_t uniqueSerialNumber() override; + // basic stuff void restart();