From 84e018fecf264d442ab1c64cd248eb856937ac0f Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Mon, 16 Jan 2023 17:56:52 +0800 Subject: [PATCH] lotus: Read serial number from flash Signed-off-by: Daniel Schaefer --- keyboards/lotus/factory.c | 13 ++++------ keyboards/lotus/lotus.c | 38 ++++++++++++++++++++++++++++++ keyboards/lotus/lotus.h | 5 ++++ tmk_core/protocol/usb_descriptor.c | 23 +++++++++++------- tmk_core/protocol/vusb/vusb.c | 3 ++- 5 files changed, 63 insertions(+), 19 deletions(-) diff --git a/keyboards/lotus/factory.c b/keyboards/lotus/factory.c index 45ab0c924c..4d21c75949 100644 --- a/keyboards/lotus/factory.c +++ b/keyboards/lotus/factory.c @@ -3,6 +3,7 @@ #include "quantum.h" #include "matrix.h" +#include "lotus.h" #if defined(RGB_MATRIX_ENABLE) #include "rgb_matrix.h" #endif @@ -27,19 +28,14 @@ void emulate_rgb_keycode_press(uint16_t target_keycode) { } #endif -#define FLASH_OFFSET 0x10000000 -#define LAST_4K_BLOCK 0xff000 -#define SERIALNUM_LEN 18 +extern char ascii_serialnum[SERIALNUM_LEN+1]; +extern char utf16_serialnum[(SERIALNUM_LEN+1) * 2]; 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"); @@ -59,9 +55,8 @@ void handle_factory_command(uint8_t *data) { case f_serialnum: print("Reading Device serial number\n"); - memcpy(serialnum, serialnum_ptr, SERIALNUM_LEN); - uprintf("Serial number: %s\n", serialnum); + uprintf("Serial number: %s\n", ascii_serialnum); break; default: uprintf("Unknown factory command: %u\n", factory_command_id); diff --git a/keyboards/lotus/lotus.c b/keyboards/lotus/lotus.c index 1cbce88f95..861eb70281 100644 --- a/keyboards/lotus/lotus.c +++ b/keyboards/lotus/lotus.c @@ -4,6 +4,44 @@ #include "quantum.h" #include "lotus.h" +// Prefix string literal with L for descriptors +#define USBCONCAT(a, b) a##b +#define USBSTR(s) USBCONCAT(L, s) +USB_Descriptor_String_t PROGMEM SerialNumberString = { + .Header = { + .Size = sizeof(USBSTR(SERIAL_NUMBER)), + .Type = DTYPE_String + }, + .UnicodeString = USBSTR(SERIAL_NUMBER) +}; + +char ascii_serialnum[SERIALNUM_LEN+1]; +char utf16_serialnum[(SERIALNUM_LEN+1) * 2]; + +void *lotus_serial_number_string(void) { + if (utf16_serialnum[0] != '\0') { + return utf16_serialnum; + } + ascii_serialnum[SERIALNUM_LEN] = '\0'; + utf16_serialnum[SERIALNUM_LEN*2] = '\0'; + utf16_serialnum[SERIALNUM_LEN*2 + 1] = '\0'; + char *serialnum_ptr = (char*) (FLASH_OFFSET + LAST_4K_BLOCK); + + memcpy(ascii_serialnum, serialnum_ptr, SERIALNUM_LEN); + for (int c = 0; c < SERIALNUM_LEN; c++) { + utf16_serialnum[c*2] = ascii_serialnum[c]; + } + + //SerialNumberString.UnicodeString = &utf16_serialnum[0]; + memcpy(SerialNumberString.UnicodeString, utf16_serialnum, SERIALNUM_LEN*2); + SerialNumberString.Header.Size = SERIALNUM_LEN * 2; + + return &SerialNumberString; +} +uint16_t lotus_serial_number_string_len(void) { + return SERIALNUM_LEN*2; +} + void keyboard_post_init_kb(void) { keyboard_post_init_user(); diff --git a/keyboards/lotus/lotus.h b/keyboards/lotus/lotus.h index cfdbd2e019..b3c19dd4ae 100644 --- a/keyboards/lotus/lotus.h +++ b/keyboards/lotus/lotus.h @@ -33,3 +33,8 @@ enum lotus_keycodes { #define IS31FL3743A_ENABLE_GPIO GP29 #endif +void *lotus_serial_number_string(void); +uint16_t lotus_serial_number_string_len(void); +#define FLASH_OFFSET 0x10000000 +#define LAST_4K_BLOCK 0xff000 +#define SERIALNUM_LEN 18 diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index 99c52952a0..799288855a 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -41,6 +41,8 @@ #include "usb_descriptor.h" #include "usb_descriptor_common.h" +#include "lotus.h" + #ifdef JOYSTICK_ENABLE # include "joystick.h" #endif @@ -1077,13 +1079,14 @@ const USB_Descriptor_String_t PROGMEM ProductString = { }; #if defined(SERIAL_NUMBER) -const USB_Descriptor_String_t PROGMEM SerialNumberString = { - .Header = { - .Size = sizeof(USBSTR(SERIAL_NUMBER)), - .Type = DTYPE_String - }, - .UnicodeString = USBSTR(SERIAL_NUMBER) -}; +extern const USB_Descriptor_String_t PROGMEM SerialNumberString; +//const USB_Descriptor_String_t PROGMEM SerialNumberString = { +// .Header = { +// .Size = sizeof(USBSTR(SERIAL_NUMBER)), +// .Type = DTYPE_String +// }, +// .UnicodeString = USBSTR(SERIAL_NUMBER) +//}; #endif // clang-format on @@ -1131,8 +1134,10 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const break; #if defined(SERIAL_NUMBER) case 0x03: - Address = &SerialNumberString; - Size = pgm_read_byte(&SerialNumberString.Header.Size); + //Address = &SerialNumberString; + //Size = pgm_read_byte(&SerialNumberString.Header.Size); + Address = lotus_serial_number_string();//&SerialNumberString; + Size = lotus_serial_number_string_len();//pgm_read_byte(&SerialNumberString.Header.Size); break; #endif diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index 2d17761978..585e182187 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -735,8 +735,9 @@ const PROGMEM usbStringDescriptor_t usbStringDescriptorProduct = { .bString = USBSTR(PRODUCT) }; +// THIS IS NOT USED by Lotus #if defined(SERIAL_NUMBER) -const PROGMEM usbStringDescriptor_t usbStringDescriptorSerial = { +const PROGMEM usbStringDescriptor_t usbStringDescriptorSerial = .header = { .bLength = sizeof(USBSTR(SERIAL_NUMBER)), .bDescriptorType = USBDESCR_STRING