summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2024-04-20 22:08:08 +0200
committerxengineering <me@xengineering.eu>2024-04-21 12:26:00 +0200
commit96f2358caadfd55d6fd3b888ef5d21f22fc2439c (patch)
tree4d2145c0df358fa917bdec729e905130230bf7f6 /firmware
parent9a713b06c3f776684dd026646c916b6daea7b25b (diff)
downloadiot-core-96f2358caadfd55d6fd3b888ef5d21f22fc2439c.tar
iot-core-96f2358caadfd55d6fd3b888ef5d21f22fc2439c.tar.zst
iot-core-96f2358caadfd55d6fd3b888ef5d21f22fc2439c.zip
firmware: Add 64 bit MAC to shell prompt
This demonstrates that the readout of the 64 bit MAC address from the STM32WL55 microcontroller works and is useful to recognize used devices.
Diffstat (limited to 'firmware')
-rw-r--r--firmware/CMakeLists.txt4
-rw-r--r--firmware/boards/nucleo_wl55jc.overlay7
-rw-r--r--firmware/src/main.c32
-rw-r--r--firmware/src/uid64.c41
-rw-r--r--firmware/src/uid64.h8
5 files changed, 91 insertions, 1 deletions
diff --git a/firmware/CMakeLists.txt b/firmware/CMakeLists.txt
index 70b99c7..ad51a9d 100644
--- a/firmware/CMakeLists.txt
+++ b/firmware/CMakeLists.txt
@@ -2,4 +2,6 @@ cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(iot-core)
-target_sources(app PRIVATE src/main.c)
+target_sources(app PRIVATE
+ src/main.c
+ src/uid64.c)
diff --git a/firmware/boards/nucleo_wl55jc.overlay b/firmware/boards/nucleo_wl55jc.overlay
new file mode 100644
index 0000000..b04f810
--- /dev/null
+++ b/firmware/boards/nucleo_wl55jc.overlay
@@ -0,0 +1,7 @@
+/ {
+ soc {
+ uid64: uid64@1fff7580 {
+ reg = <0x1fff7580 0x8>;
+ };
+ };
+};
diff --git a/firmware/src/main.c b/firmware/src/main.c
index 7a1076c..e1c85c6 100644
--- a/firmware/src/main.c
+++ b/firmware/src/main.c
@@ -1,6 +1,38 @@
+#include <stdio.h>
+
#include <zephyr/kernel.h>
+#include <zephyr/shell/shell.h>
+#include <zephyr/shell/shell_backend.h>
+
+#include "uid64.h"
+
+static uint64_t uid = 0;
+static char uid_str[UID64_STR_LEN];
+
+#define MAX_PROMPT_SIZE 80
+char prompt[MAX_PROMPT_SIZE];
+
+void init_uid64(void) {
+ uid = uid64_get();
+ uid64_to_string(uid, uid_str);
+}
+
+void init_shell_prompt(void) {
+ if (uid64_available()) {
+ snprintf(prompt, MAX_PROMPT_SIZE, "[iot-core %s] ", uid_str);
+ } else {
+ strncpy(prompt, "[iot-core without MAC] ", MAX_PROMPT_SIZE);
+ }
+ for (int i = 0; i < shell_backend_count_get(); i++) {
+ const struct shell *sh = shell_backend_get(i);
+ (void) shell_prompt_change(sh, (const char *)prompt);
+ }
+}
int main(void)
{
+ init_uid64();
+ init_shell_prompt();
+
return 0;
}
diff --git a/firmware/src/uid64.c b/firmware/src/uid64.c
new file mode 100644
index 0000000..984b7fe
--- /dev/null
+++ b/firmware/src/uid64.c
@@ -0,0 +1,41 @@
+#include <stdio.h>
+
+#include <zephyr/devicetree.h>
+
+#include "uid64.h"
+
+#define UID64_NODE DT_NODELABEL(uid64)
+
+uint64_t uid64_get(void) {
+#if DT_NODE_EXISTS(UID64_NODE)
+ return *(volatile uint64_t *) DT_REG_ADDR(UID64_NODE);
+#else
+ return 0;
+#endif
+}
+
+void uid64_to_string(uint64_t uid, char *str) {
+ uint8_t *source = (uint8_t *)&uid + 7;
+ char *sink = str;
+
+ for (unsigned int i = 0; i < 8; i++) {
+ /* delimiter */
+ if (i > 0) {
+ *sink = ':';
+ sink++;
+ }
+
+ /* byte values */
+ snprintf(sink, 3, "%02x", *source);
+ source--;
+ sink += 2;
+ }
+}
+
+bool uid64_available(void) {
+#if DT_NODE_EXISTS(UID64_NODE)
+ return true;
+#else
+ return false;
+#endif
+}
diff --git a/firmware/src/uid64.h b/firmware/src/uid64.h
new file mode 100644
index 0000000..cd3fb13
--- /dev/null
+++ b/firmware/src/uid64.h
@@ -0,0 +1,8 @@
+#include <zephyr/devicetree.h>
+
+/* 2 chars per byte (hex), 1 char per ':' delimiter and one char for \0 */
+#define UID64_STR_LEN (8*2 + 7*1 + 1)
+
+uint64_t uid64_get(void);
+void uid64_to_string(uint64_t, char *str);
+bool uid64_available(void);