aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhauptmech <hauptmech@gmail.com>2015-01-19 16:50:52 +1300
committerLorenz Meier <lm@inf.ethz.ch>2015-01-28 10:20:19 +0100
commit5444972347606333dd61206011263e4a2e5d83e8 (patch)
treed309fda7ba918708f5dfbff285cb29bd5ee1d08e
parent4dd06c4c7368e14ae0c5119321095236f7d13fd4 (diff)
downloadpx4-firmware-5444972347606333dd61206011263e4a2e5d83e8.tar.gz
px4-firmware-5444972347606333dd61206011263e4a2e5d83e8.tar.bz2
px4-firmware-5444972347606333dd61206011263e4a2e5d83e8.zip
Add call to access the mcu unique id. Expose via the 'ver' command.
This is prep for verifying calibration parameters against the hardware they were gathered on.
-rw-r--r--src/modules/systemlib/mcu_version.c11
-rw-r--r--src/modules/systemlib/mcu_version.h11
-rw-r--r--src/systemcmds/ver/ver.c14
3 files changed, 33 insertions, 3 deletions
diff --git a/src/modules/systemlib/mcu_version.c b/src/modules/systemlib/mcu_version.c
index 4bcf95784..24f4e4207 100644
--- a/src/modules/systemlib/mcu_version.c
+++ b/src/modules/systemlib/mcu_version.c
@@ -47,7 +47,8 @@
#ifdef CONFIG_ARCH_CHIP_STM32
#include <up_arch.h>
-#define DBGMCU_IDCODE 0xE0042000
+#define DBGMCU_IDCODE 0xE0042000 //STM DocID018909 Rev 8 Sect 38.18 (MCU device ID code)
+#define UNIQUE_ID 0x1FFF7A10 //STM DocID018909 Rev 8 Sect 39.1 (Unique device ID Register)
#define STM32F40x_41x 0x413
#define STM32F42x_43x 0x419
@@ -57,7 +58,13 @@
#endif
-
+/** Copy the 96bit MCU Unique ID into the provided pointer */
+void mcu_unique_id(uint32_t *uid_96_bit)
+{
+ uid_96_bit[0] = getreg32(UNIQUE_ID);
+ uid_96_bit[1] = getreg32(UNIQUE_ID+4);
+ uid_96_bit[2] = getreg32(UNIQUE_ID+8);
+}
int mcu_version(char* rev, char** revstr)
{
diff --git a/src/modules/systemlib/mcu_version.h b/src/modules/systemlib/mcu_version.h
index 1b3d0aba9..c8a0bf5cd 100644
--- a/src/modules/systemlib/mcu_version.h
+++ b/src/modules/systemlib/mcu_version.h
@@ -33,6 +33,8 @@
#pragma once
+#include <stdint.h>
+
/* magic numbers from reference manual */
enum MCU_REV {
MCU_REV_STM32F4_REV_A = 0x1000,
@@ -42,6 +44,15 @@ enum MCU_REV {
MCU_REV_STM32F4_REV_3 = 0x2001
};
+
+/**
+ * Reports the microcontroller unique id.
+ *
+ * This ID is guaranteed to be unique for every mcu.
+ * @param uid_96_bit A uint32_t[3] array to copy the data to.
+ */
+__EXPORT void mcu_unique_id(uint32_t *uid_96_bit);
+
/**
* Reports the microcontroller version of the main CPU.
*
diff --git a/src/systemcmds/ver/ver.c b/src/systemcmds/ver/ver.c
index 2ead3e632..087eb52e3 100644
--- a/src/systemcmds/ver/ver.c
+++ b/src/systemcmds/ver/ver.c
@@ -54,6 +54,7 @@ static const char sz_ver_bdate_str[] = "bdate";
static const char sz_ver_gcc_str[] = "gcc";
static const char sz_ver_all_str[] = "all";
static const char mcu_ver_str[] = "mcu";
+static const char mcu_uid_str[] = "uid";
static void usage(const char *reason)
{
@@ -61,7 +62,7 @@ static void usage(const char *reason)
printf("%s\n", reason);
}
- printf("usage: ver {hw|hwcmp|git|bdate|gcc|all|mcu}\n\n");
+ printf("usage: ver {hw|hwcmp|git|bdate|gcc|all|mcu|uid}\n\n");
}
__EXPORT int ver_main(int argc, char *argv[]);
@@ -141,6 +142,17 @@ int ver_main(int argc, char *argv[])
ret = 0;
}
+ if (show_all || !strncmp(argv[1], mcu_uid_str, sizeof(mcu_uid_str))) {
+ uint32_t uid[3];
+
+ mcu_unique_id(uid);
+
+ printf("UID: %X:%X:%X \n",uid[0],uid[1],uid[2]);
+
+ ret = 0;
+ }
+
+
if (ret == 1) {
errx(1, "unknown command.\n");
}