show prog menu

This commit is contained in:
King Kévin 2024-04-18 03:23:30 +02:00
parent 35aef360cf
commit ca87f6cd63
1 changed files with 44 additions and 41 deletions

View File

@ -77,6 +77,12 @@ static const char* help_str[] = {
"l set keyboard layout\r\n", "l set keyboard layout\r\n",
}; };
static const char* prog_str[] = {
"K set manufacturer key\r\n",
"L lock device\r\n",
"E erase firmware\r\n",
};
enum { enum {
MENU_HOME, MENU_HOME,
MENU_USER, MENU_USER,
@ -116,6 +122,13 @@ uint32_t board_button2_read(void)
return BUTTON2_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON2_PORT, BUTTON2_PIN); return BUTTON2_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON2_PORT, BUTTON2_PIN);
} }
static bool locked(void)
{
FLASH_OBProgramInitTypeDef ob;
HAL_FLASHEx_OBGetConfig(&ob);
return (OB_RDP_LEVEL_2 == ob.RDPLevel);
}
static void clear_credentials(void) static void clear_credentials(void)
{ {
// clear credentials // clear credentials
@ -419,57 +432,42 @@ void cdc_task(void)
break; break;
// hidden menu // hidden menu
case 'K': // set manufacturer key case 'K': // set manufacturer key
{ if (!locked()) {
FLASH_OBProgramInitTypeDef ob; i = 0; // reset index
HAL_FLASHEx_OBGetConfig(&ob); menu = MENU_MANUF;
if (OB_RDP_LEVEL_2 == ob.RDPLevel) { str = "\r\nenter manufacturer key (up to 32 char): ";
str = "\r\ndevice locked\r\n";
} else {
i = 0; // reset index
menu = MENU_MANUF;
str = "\r\nenter manufacturer key (up to 32 char): ";
}
} }
break; break;
case 'L': // lock device case 'L': // lock device
{ if (!locked()) {
tud_cdc_write_str_flush("\r\nlocking device\r\n");
FLASH_OBProgramInitTypeDef ob; FLASH_OBProgramInitTypeDef ob;
HAL_FLASHEx_OBGetConfig(&ob); HAL_FLASHEx_OBGetConfig(&ob);
if (OB_RDP_LEVEL_2 == ob.RDPLevel) { ob.RDPLevel = OB_RDP_LEVEL_2; // level 2, disabling debug, and write protecting option byte
str = "\r\ndevice locked\r\n"; ob.WRPState = OB_WRPSTATE_ENABLE; // write protect pages
} else { ob.WRPPage = 0x7; // all but last sector holding the config
str = "\r\nlocking device\r\n"; HAL_FLASH_Unlock();
ob.RDPLevel = OB_RDP_LEVEL_2; // level 2, disabling debug, and write protecting option byte HAL_FLASH_OB_Unlock();
ob.WRPState = OB_WRPSTATE_ENABLE; // write protect pages //HAL_FLASHEx_OBProgram(&ob);
ob.WRPPage = 0x7; // all but last sector holding the config HAL_FLASH_OB_Lock();
HAL_FLASH_Unlock(); HAL_FLASH_Lock();
HAL_FLASH_OB_Unlock(); HAL_FLASH_OB_Launch();
//HAL_FLASHEx_OBProgram(&ob);
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
HAL_FLASH_OB_Launch();
}
} }
break; break;
case 'E': // mass erase to restart STM32 bootloader case 'E': // mass erase to restart STM32 bootloader
{ if (!locked()) {
tud_cdc_write_str_flush("\r\nerasing firmware\r\n");
FLASH_OBProgramInitTypeDef ob; HAL_FLASH_Unlock();
HAL_FLASHEx_OBGetConfig(&ob); FLASH_EraseInitTypeDef EraseInitStruct;
if (OB_RDP_LEVEL_2 == ob.RDPLevel) { EraseInitStruct.TypeErase = FLASH_TYPEERASE_MASSERASE;
str = "\r\ncan't mass erase: device locked\r\n"; uint32_t error;
} else { if (HAL_FLASHEx_Erase(&EraseInitStruct, &error) != HAL_OK) {
HAL_FLASH_Unlock(); printf("mass earse failed\r\n");
FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_MASSERASE;
uint32_t error;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &error) != HAL_OK) {
printf("mass earse failed\r\n");
}
HAL_FLASH_Lock();
HAL_FLASH_OB_Launch(); // just to restart
} }
HAL_FLASH_Lock();
HAL_FLASH_OB_Launch(); // just to restart
} }
break;
case '\r': case '\r':
case '\n': case '\n':
break; // nothing to do break; // nothing to do
@ -481,6 +479,11 @@ void cdc_task(void)
for (uint8_t j = 0; j < LENGTH(help_str); j++) { for (uint8_t j = 0; j < LENGTH(help_str); j++) {
tud_cdc_write_str_flush(help_str[j]); tud_cdc_write_str_flush(help_str[j]);
} }
if (!locked()) {
for (uint8_t j = 0; j < LENGTH(prog_str); j++) {
tud_cdc_write_str_flush(prog_str[j]);
}
}
} }
break; break;
case MENU_USER: case MENU_USER: