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