diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3fa9c32 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,23 @@ +language: generic +env: + global: + - IDE_VERSION=1.8.8 + matrix: + - BOARD="arduino:avr:uno" + - BOARD="arduino:avr:mega:cpu=atmega2560" + - BOARD="arduino:samd:arduino_zero_edbg" + +before_install: + - wget http://downloads.arduino.cc/arduino-$IDE_VERSION-linux64.tar.xz + - tar xf arduino-$IDE_VERSION-linux64.tar.xz + - mv arduino-$IDE_VERSION $HOME/arduino-ide + - export PATH=$PATH:$HOME/arduino-ide + - if [[ "$BOARD" =~ "arduino:samd:" ]]; then + arduino --install-boards arduino:samd &> /dev/null; + fi + - buildExampleSketch() { arduino --verbose-build --verify --board $BOARD $PWD/examples/$1/$1.ino; } +install: + - mkdir -p $HOME/Arduino/libraries + - ln -s $PWD $HOME/Arduino/libraries/ArduinoUniqueID +script: + - buildExampleSketch ArduinoUniqueID \ No newline at end of file diff --git a/MCU.md b/MCU.md new file mode 100644 index 0000000..21a454b --- /dev/null +++ b/MCU.md @@ -0,0 +1,103 @@ +# Atmel AVR Microcontroller + +## Unique Serial ID - Hidden Serial Number + +The datasheet of the Atmega328pb chip has a section 'Serial Number' how explain every chip have a unique device ID with 10 bytes.
+ +The datasheet of the Atmega328p chip does not say anything about the serial number, but I tested using the same Z-pointer Address on the datasheet of the Atmega328pb.
+ +Apparently, the chip Atmega328p have a hidden serial number with 9 bytes, and others AVR Microcontroller maybe too, like the table below.
+ +| Z-pointer Address | Atmega328pb | Atmega328p | +| :-------: | :------: | :------:| +| 0x000E | Byte 0 | Byte 0 | +| 0x000F | Byte 1 | Byte 1 | +| 0x0010 | Byte 2 | Byte 2 | +| 0x0011 | Byte 3 | Byte 3 | +| 0x0012 | Byte 4 | Byte 4 | +| 0x0013 | Byte 5 | Byte 5 | +| 0x0014 | Byte 6 | - | +| 0x0015 | Byte 7 | Byte 6 | +| 0x0016 | Byte 8 | Byte 7 | +| 0x0017 | Byte 9 | Byte 8 | + +## Tested Microcontroller + +* Atmega328pb - 10 bytes +* Atmega328p - 9 bytes +* Atmega2560 - 9 bytes +* Attiny85 - 9 bytes + +# Atmel SAM ARM Microcontroller + +Atmel SAM3X8E is used in Arduino Due. + +The Unique Identifier is located in the first 128 bits of the Flash memory mapping. So, at the address 0x400000-0x400003. + +"Each device integrates its own 128-bit unique identifier. These bits are factory configured and cannot be changed by the user. The ERASE pin has no effect on the unique identifier." [Datasheet Section 7.2.3.7](http://ww1.microchip.com/downloads/en/devicedoc/atmel-11057-32-bit-cortex-m3-microcontroller-sam3x-sam3a_datasheet.pdf) + +## Tested Microcontroller + +* Atmel SAM3X8E ARM Cortex-M3 - 16 bytes + +# Atmel SAMD ARM Microcontroller + +Atmel SAMD21 is used in Arduino Zero / Arduino M0. + +Each device has a unique 128-bit serial number which is a concatenation of four 32-bit words contained at the following addresses: + +* Word 0: 0x0080A00C +* Word 1: 0x0080A040 +* Word 2: 0x0080A044 +* Word 3: 0x0080A048 + +The uniqueness of the serial number is guaranteed only when using all 128 bits. [Datasheet Section 9.3.3](https://cdn.sparkfun.com/datasheets/Dev/Arduino/Boards/Atmel-42181-SAM-D21_Datasheet.pdf) + +## Tested Microcontroller + +* Atmel SAMD21 ARM Cortex-M0 - 16 bytes + +# STM32 Microcontroller + +STM32 32-bit Arm Cortex MCUs has a unique 96-bit serial number which is a concatenation of three 32-bit words, the address is different depending on the microcontroller. + +The [Arduino Core STM32](https://github.com/stm32duino/Arduino_Core_STM32) has the functions HAL_GetUIDw0(), HAL_GetUIDw1() and HAL_GetUIDw2() for 96-bit UID. + +## Tested Microcontroller + +* STM32F103C8 (BluePill Board) - 12 bytes +* STM32L073RZ (Nucleo L073RZ) - 12 bytes + +# Espressif ESP Microcontroller + +ESP microcontroller has basically two versions, ESP8266 and ESP32, each one has a specific function to request the chip id.
+ +* ESP8266 - ESP.getChipId() - 4 bytes +* ESP32 - ESP.getEfuseMac() - 6 bytes + +| UniqueID | ESP8266 | ESP32 | +| :-------: | :------: | :------:| +| Byte 0| Byte 0 | Byte 5 | +| Byte 1| Byte 1 | Byte 4 | +| Byte 2| Byte 2 | Byte 3 | +| Byte 3| Byte 3 | Byte 2 | +| Byte 4| - | Byte 1 | +| Byte 5| - | Byte 0 | + +To make the variable UniqueID8 to work propably the library uses the default bytes to 0x00.
+ +| UniqueID8 | ESP8266 | ESP32 | +| :-------: | :------: | :------:| +| Byte 0| 0x00 | 0x00 | +| Byte 1| 0x00 | 0x00 | +| Byte 2| 0x00 | Byte 5 | +| Byte 3| 0x00 | Byte 4 | +| Byte 4| Byte 0 | Byte 3 | +| Byte 5| Byte 1 | Byte 2 | +| Byte 6| Byte 2 | Byte 1 | +| Byte 7| Byte 3 | Byte 0 | + +## Tested Microcontroller + +* ESP8266 - 4 bytes +* ESP32 - 6 bytes \ No newline at end of file diff --git a/README.md b/README.md index d596256..f975ad1 100644 --- a/README.md +++ b/README.md @@ -2,109 +2,17 @@ This Library gets the Unique ID / Manufacture Serial Number from the Atmel AVR, SAM, SAMD, STM32, and ESP Microcontroller. -# Atmel AVR Microcontroller +[![Build Status](https://travis-ci.org/ricaun/ArduinoUniqueID.svg?branch=master)](https://travis-ci.org/ricaun/ArduinoUniqueID) -## Unique Serial ID - Hidden Serial Number +# Microcontrollers -The datasheet of the Atmega328pb chip has a section 'Serial Number' how explain every chip have a unique device ID with 10 bytes.
+ArduinoUniqueID supports the [Microcontrollers](MCU.md). -The datasheet of the Atmega328p chip does not say anything about the serial number, but I tested using the same Z-pointer Address on the datasheet of the Atmega328pb.
- -Apparently, the chip Atmega328p have a hidden serial number with 9 bytes, and others AVR Microcontroller maybe too, like the table below.
- -| Z-pointer Address | Atmega328pb | Atmega328p | -| :-------: | :------: | :------:| -| 0x000E | Byte 0 | Byte 0 | -| 0x000F | Byte 1 | Byte 1 | -| 0x0010 | Byte 2 | Byte 2 | -| 0x0011 | Byte 3 | Byte 3 | -| 0x0012 | Byte 4 | Byte 4 | -| 0x0013 | Byte 5 | Byte 5 | -| 0x0014 | Byte 6 | - | -| 0x0015 | Byte 7 | Byte 6 | -| 0x0016 | Byte 8 | Byte 7 | -| 0x0017 | Byte 9 | Byte 8 | - -## Tested Microcontroller - -* Atmega328pb - 10 bytes -* Atmega328p - 9 bytes -* Atmega2560 - 9 bytes -* Attiny85 - 9 bytes - -# Atmel SAM ARM Microcontroller - -Atmel SAM3X8E is used in Arduino Due. - -The Unique Identifier is located in the first 128 bits of the Flash memory mapping. So, at the address 0x400000-0x400003. - -"Each device integrates its own 128-bit unique identifier. These bits are factory configured and cannot be changed by the user. The ERASE pin has no effect on the unique identifier." [Datasheet Section 7.2.3.7](http://ww1.microchip.com/downloads/en/devicedoc/atmel-11057-32-bit-cortex-m3-microcontroller-sam3x-sam3a_datasheet.pdf) - -## Tested Microcontroller - -* Atmel SAM3X8E ARM Cortex-M3 - 16 bytes - -# Atmel SAMD ARM Microcontroller - -Atmel SAMD21 is used in Arduino Zero / Arduino M0. - -Each device has a unique 128-bit serial number which is a concatenation of four 32-bit words contained at the following addresses: - -* Word 0: 0x0080A00C -* Word 1: 0x0080A040 -* Word 2: 0x0080A044 -* Word 3: 0x0080A048 - -The uniqueness of the serial number is guaranteed only when using all 128 bits. [Datasheet Section 9.3.3](https://cdn.sparkfun.com/datasheets/Dev/Arduino/Boards/Atmel-42181-SAM-D21_Datasheet.pdf) - -## Tested Microcontroller - -* Atmel SAMD21 ARM Cortex-M0 - 16 bytes - -# STM32 Microcontroller - -STM32 32-bit Arm Cortex MCUs has a unique 96-bit serial number which is a concatenation of three 32-bit words, the address is different depending on the microcontroller. - -The [Arduino Core STM32](https://github.com/stm32duino/Arduino_Core_STM32) has the functions HAL_GetUIDw0(), HAL_GetUIDw1() and HAL_GetUIDw2() for 96-bit UID. - -## Tested Microcontroller - -* STM32F103C8 (BluePill Board) - 12 bytes -* STM32L073RZ (Nucleo L073RZ) - 12 bytes - -# Espressif ESP Microcontroller - -ESP microcontroller has basically two versions, ESP8266 and ESP32, each one has a specific function to request the chip id.
- -* ESP8266 - ESP.getChipId() - 4 bytes -* ESP32 - ESP.getEfuseMac() - 6 bytes - -| UniqueID | ESP8266 | ESP32 | -| :-------: | :------: | :------:| -| Byte 0| Byte 0 | Byte 5 | -| Byte 1| Byte 1 | Byte 4 | -| Byte 2| Byte 2 | Byte 3 | -| Byte 3| Byte 3 | Byte 2 | -| Byte 4| - | Byte 1 | -| Byte 5| - | Byte 0 | - -To make the variable UniqueID8 to work propably the library uses the default bytes to 0x00.
- -| UniqueID8 | ESP8266 | ESP32 | -| :-------: | :------: | :------:| -| Byte 0| 0x00 | 0x00 | -| Byte 1| 0x00 | 0x00 | -| Byte 2| 0x00 | Byte 5 | -| Byte 3| 0x00 | Byte 4 | -| Byte 4| Byte 0 | Byte 3 | -| Byte 5| Byte 1 | Byte 2 | -| Byte 6| Byte 2 | Byte 1 | -| Byte 7| Byte 3 | Byte 0 | - -## Tested Microcontroller - -* ESP8266 - 4 bytes -* ESP32 - 6 bytes +* Atmel AVR +* Atmel SAM ARM +* Atmel SAMD ARM +* STM32 +* Espressif ESP # Installation