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...)
This commit is contained in:
OutOfSync1 2021-04-12 11:40:56 +02:00 committed by GitHub
parent 036bd54c79
commit e57bbf9dbe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 80 additions and 3 deletions

View File

@ -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");

View File

@ -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();

View File

@ -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");

View File

@ -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;
};

View File

@ -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)
{}

View File

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

View File

@ -49,18 +49,21 @@ template <class P, class B> 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);
}

View File

@ -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");

View File

@ -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();

View File

@ -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();

View File

@ -8,6 +8,9 @@ public:
Stm32Platform( HardwareSerial* s);
~Stm32Platform();
// unique serial number
uint32_t uniqueSerialNumber() override;
// basic stuff
void restart();