From 3f5388f97f5dd03ea5b42e97129d49359c950e69 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Mon, 16 Jan 2023 17:01:55 +0800 Subject: [PATCH] Read serial number from flash Write there with OpenOCD and GDB: ``` (gdb) monitor flash write_bank 0 serial.bin 0x00ff000 Writing 18 bytes starting at 0xff000 wrote 18 bytes from file serial.bin to flash bank 0 at offset 0x000ff000 in 0.206887s (0.085 KiB/s) ``` Signed-off-by: Daniel Schaefer --- keyboards/lotus/factory.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/keyboards/lotus/factory.c b/keyboards/lotus/factory.c index 792021886a..45ab0c924c 100644 --- a/keyboards/lotus/factory.c +++ b/keyboards/lotus/factory.c @@ -10,6 +10,7 @@ enum factory_commands { f_emu_keypress = 0x01, // Next byte is keycode f_adc = 0x03, // ADC trigger + f_serialnum = 0x04, // Read device serial number f_bootloader = 0xFE, }; @@ -26,11 +27,19 @@ void emulate_rgb_keycode_press(uint16_t target_keycode) { } #endif +#define FLASH_OFFSET 0x10000000 +#define LAST_4K_BLOCK 0xff000 +#define SERIALNUM_LEN 18 + void handle_factory_command(uint8_t *data) { uint8_t factory_command_id = data[0]; uint8_t *command_data = &(data[1]); uprintf("handle_factory_command(command: %u)\n", factory_command_id); + char serialnum[SERIALNUM_LEN+1]; + serialnum[SERIALNUM_LEN] = '\0'; + char *serialnum_ptr = (char*) (FLASH_OFFSET + LAST_4K_BLOCK); + switch (factory_command_id) { case f_bootloader: print("bootloader_jump\n"); @@ -47,6 +56,13 @@ void handle_factory_command(uint8_t *data) { case f_adc: factory_trigger_adc(); break; + case f_serialnum: + print("Reading Device serial number\n"); + + memcpy(serialnum, serialnum_ptr, SERIALNUM_LEN); + + uprintf("Serial number: %s\n", serialnum); + break; default: uprintf("Unknown factory command: %u\n", factory_command_id); break;