diff --git a/examples/device/hid_cdc_passkey/src/main.c b/examples/device/hid_cdc_passkey/src/main.c index 2b6612db2..f0b7fa3d9 100644 --- a/examples/device/hid_cdc_passkey/src/main.c +++ b/examples/device/hid_cdc_passkey/src/main.c @@ -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: