Skip to content

Commit 6ffb679

Browse files
committed
Implement getUniqueSerialNumber as in mbed core
1 parent 7310e8a commit 6ffb679

File tree

1 file changed

+42
-29
lines changed

1 file changed

+42
-29
lines changed

examples/utility/SelfProvisioning/SelfProvisioning.ino

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,6 @@
2323
#include <Arduino_JSON.h>
2424
#include <WiFiNINA.h>
2525

26-
// from section 10.3.3 of the SAMD datasheet
27-
#define SERIAL_NUMBER_WORD_0 *(volatile uint32_t*)(0x0080A00C)
28-
#define SERIAL_NUMBER_WORD_1 *(volatile uint32_t*)(0x0080A040)
29-
#define SERIAL_NUMBER_WORD_2 *(volatile uint32_t*)(0x0080A044)
30-
#define SERIAL_NUMBER_WORD_3 *(volatile uint32_t*)(0x0080A048)
31-
3226
const bool DEBUG = true;
3327

3428
char ssid[] = SECRET_SSID;
@@ -116,31 +110,12 @@ void setup() {
116110

117111
//Random number for device name
118112
board_name += String(secureElement.random(65535));
119-
120-
uint32_t BoardUniqueID[4];
121-
BoardUniqueID[0] = SERIAL_NUMBER_WORD_0;
122-
BoardUniqueID[1] = SERIAL_NUMBER_WORD_1;
123-
BoardUniqueID[2] = SERIAL_NUMBER_WORD_2;
124-
BoardUniqueID[3] = SERIAL_NUMBER_WORD_3;
125-
uint8_t bid[32];
126-
for (int i = 0; i < 4; i++)
127-
{
128-
bid[i*4+0] = (uint8_t)(BoardUniqueID[i] >> 24);
129-
bid[i*4+1] = (uint8_t)(BoardUniqueID[i] >> 16);
130-
bid[i*4+2] = (uint8_t)(BoardUniqueID[i] >> 8);
131-
bid[i*4+3] = (uint8_t)(BoardUniqueID[i] >> 0);
132-
}
133-
134-
for (size_t i = 0; i < 16; i++) {
135-
if (bid[i] < 16) {
136-
ArduinoID += String(0, HEX);
137-
}
138-
ArduinoID += String(bid[i], HEX);
139-
}
140-
ArduinoID.toUpperCase();
141-
142113
Serial.print("Device Name: ");
143114
Serial.println(board_name);
115+
//Board Serial Number
116+
ArduinoID = ArduinoSerialNumber();
117+
Serial.print("SN: ");
118+
Serial.println(ArduinoID);
144119
// Create Arduino Token
145120
ArduinoToken(client_id, secret_id);
146121
Serial.print("Bearer Token: ");
@@ -314,6 +289,44 @@ void hexStringToBytes(String& in, byte out[], int length) {
314289
}
315290
}
316291

292+
#ifdef ARDUINO_ARCH_SAMD
293+
294+
static void utox8(uint32_t val, uint8_t* s) {
295+
for (int i = 0; i < 16; i=i+2) {
296+
int d = val & 0XF;
297+
val = (val >> 4);
298+
299+
s[15 - i -1] = d > 9 ? 'A' + d - 10 : '0' + d;
300+
s[15 - i] = '\0';
301+
}
302+
}
303+
304+
uint8_t getUniqueSerialNumber(uint8_t* name) {
305+
utox8(*(volatile uint32_t*)(0x0080A00C), &name[0]);
306+
utox8(*(volatile uint32_t*)(0x0080A040), &name[16]);
307+
utox8(*(volatile uint32_t*)(0x0080A044), &name[32]);
308+
utox8(*(volatile uint32_t*)(0x0080A048), &name[48]);
309+
return 64;
310+
}
311+
312+
#endif
313+
314+
String ArduinoSerialNumber() {
315+
316+
uint8_t uniqueSerialNumber[64 + 1] = {0};
317+
char BoardUniqueID[32 + 1] = {0};
318+
319+
int uniqueSerialNumberLength = getUniqueSerialNumber(uniqueSerialNumber);
320+
for(int i = 0, k = 0; i < uniqueSerialNumberLength; i = i+2, k++) {
321+
BoardUniqueID[k] = uniqueSerialNumber[i];
322+
}
323+
324+
String serialNumber = String(BoardUniqueID);
325+
serialNumber.toUpperCase();
326+
return serialNumber;
327+
328+
}
329+
317330
void ArduinoToken(String client_id, String client_secret) {
318331
Serial.println("Creating Bearer Token...");
319332
String PostData = "grant_type=client_credentials&client_id=";

0 commit comments

Comments
 (0)