summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Challis <git@zvecr.com>2022-04-18 11:51:40 +0100
committerGitHub <noreply@github.com>2022-04-18 20:51:40 +1000
commitb8245a550752ed3826902f63a75203c67282ace7 (patch)
tree967e46a6a071dffb14f3fe44a11771ad64cc5ba0
parent7aa9a353ac6e2ee095ad8c6695f62f0bafe7b6f3 (diff)
downloadqmk_firmware-b8245a550752ed3826902f63a75203c67282ace7.tar.gz
qmk_firmware-b8245a550752ed3826902f63a75203c67282ace7.zip
Expose API for hardware unique ID (#16869)
-rw-r--r--keyboards/handwired/onekey/keymaps/hardware_id/keymap.c28
-rw-r--r--platforms/arm_atsam/hardware_id.c9
-rw-r--r--platforms/avr/hardware_id.c13
-rw-r--r--platforms/chibios/hardware_id.c15
-rw-r--r--platforms/common.mk1
-rw-r--r--platforms/hardware_id.h18
-rw-r--r--platforms/test/hardware_id.c9
7 files changed, 93 insertions, 0 deletions
diff --git a/keyboards/handwired/onekey/keymaps/hardware_id/keymap.c b/keyboards/handwired/onekey/keymaps/hardware_id/keymap.c
new file mode 100644
index 0000000000..bcec8b3ca1
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/hardware_id/keymap.c
@@ -0,0 +1,28 @@
+#include QMK_KEYBOARD_H
+#include "hardware_id.h"
+#include <stdio.h>
+enum custom_keycodes {
+ DUMP_ID = SAFE_RANGE,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ LAYOUT_ortho_1x1(DUMP_ID)
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case DUMP_ID:
+ if (record->event.pressed) {
+ hardware_id_t id = get_hardware_id();
+ char buffer[100];
+ sprintf(buffer, "ID:%lu:%lu:%lu:%lu\n", id.data[0], id.data[1], id.data[2], id.data[3]);
+#ifdef CONSOLE_ENABLE
+ printf(buffer);
+#else
+ send_string(buffer);
+#endif
+ }
+ break;
+ }
+ return false;
+};
diff --git a/platforms/arm_atsam/hardware_id.c b/platforms/arm_atsam/hardware_id.c
new file mode 100644
index 0000000000..8b3b35a492
--- /dev/null
+++ b/platforms/arm_atsam/hardware_id.c
@@ -0,0 +1,9 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "hardware_id.h"
+
+hardware_id_t get_hardware_id(void) {
+ hardware_id_t id = {0};
+ return id;
+}
diff --git a/platforms/avr/hardware_id.c b/platforms/avr/hardware_id.c
new file mode 100644
index 0000000000..073834c19c
--- /dev/null
+++ b/platforms/avr/hardware_id.c
@@ -0,0 +1,13 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <avr/boot.h>
+#include "hardware_id.h"
+
+hardware_id_t get_hardware_id(void) {
+ hardware_id_t id = {0};
+ for (uint8_t i = 0; i < 10; i += 1) {
+ ((uint8_t*)&id)[i] = boot_signature_byte_get(i + 0x0E);
+ }
+ return id;
+}
diff --git a/platforms/chibios/hardware_id.c b/platforms/chibios/hardware_id.c
new file mode 100644
index 0000000000..888a275465
--- /dev/null
+++ b/platforms/chibios/hardware_id.c
@@ -0,0 +1,15 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <ch.h>
+#include "hardware_id.h"
+
+hardware_id_t get_hardware_id(void) {
+ hardware_id_t id = {0};
+#ifdef UID_BASE
+ id.data[0] = (uint32_t)(*((uint32_t *)UID_BASE));
+ id.data[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
+ id.data[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
+#endif
+ return id;
+}
diff --git a/platforms/common.mk b/platforms/common.mk
index 2a1fc8d377..693bdc8cf0 100644
--- a/platforms/common.mk
+++ b/platforms/common.mk
@@ -2,6 +2,7 @@ PLATFORM_COMMON_DIR = $(PLATFORM_PATH)/$(PLATFORM_KEY)
TMK_COMMON_SRC += \
$(PLATFORM_PATH)/suspend.c \
+ $(PLATFORM_COMMON_DIR)/hardware_id.c \
$(PLATFORM_COMMON_DIR)/platform.c \
$(PLATFORM_COMMON_DIR)/suspend.c \
$(PLATFORM_COMMON_DIR)/timer.c \
diff --git a/platforms/hardware_id.h b/platforms/hardware_id.h
new file mode 100644
index 0000000000..0c161863d6
--- /dev/null
+++ b/platforms/hardware_id.h
@@ -0,0 +1,18 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <stdint.h>
+
+/** \brief Storage for a hardware ID
+ *
+ * Ensure this is sized to cover all hardware scenarios
+ */
+typedef struct hardware_id_t {
+ uint32_t data[4];
+} hardware_id_t;
+
+/** \brief Query the devices "unique" ID
+ */
+hardware_id_t get_hardware_id(void);
diff --git a/platforms/test/hardware_id.c b/platforms/test/hardware_id.c
new file mode 100644
index 0000000000..8b3b35a492
--- /dev/null
+++ b/platforms/test/hardware_id.c
@@ -0,0 +1,9 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "hardware_id.h"
+
+hardware_id_t get_hardware_id(void) {
+ hardware_id_t id = {0};
+ return id;
+}