Procházet zdrojové kódy

Expose API for hardware unique ID (#16869)

Joel Challis před 3 roky
rodič
revize
b8245a5507

+ 28 - 0
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;
+};

+ 9 - 0
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;
+}

+ 13 - 0
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;
+}

+ 15 - 0
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;
+}

+ 1 - 0
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 \

+ 18 - 0
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);

+ 9 - 0
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;
+}