lotus: Read serial number from flash
Signed-off-by: Daniel Schaefer <dhs@frame.work>
This commit is contained in:
parent
3f5388f97f
commit
84e018fecf
@ -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);
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user