lotus: Read serial number from flash

Signed-off-by: Daniel Schaefer <dhs@frame.work>
This commit is contained in:
Daniel Schaefer 2023-01-16 17:56:52 +08:00
parent 3f5388f97f
commit 84e018fecf
5 changed files with 63 additions and 19 deletions

View File

@ -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);

View File

@ -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();

View File

@ -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

View File

@ -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

View File

@ -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