From 2c4ae512ac01127657c81c37f969d09a86f9a293 Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Thu, 11 Jun 2026 11:28:02 +0800 Subject: [PATCH] udpate program_key.c --- .../src/extensions/program_key.c | 58 ++++++++++++++----- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/program_key.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/program_key.c index 065e6b2..78bf91d 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/program_key.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/program_key.c @@ -180,6 +180,7 @@ void flash_opt_unlock(void) { debug_printf("Not Winbond flash (DID: %02x), skip unlock\n", did[0]); flash_opt_disable_ports(); + swlock_release(&flash_lock); return; } @@ -190,11 +191,11 @@ void flash_opt_unlock(void) Mask: 0x7C (0111 1100) */ flash_cmd_opt(READ_STATUS_REG_COMMAND, cmd, 0, data, 1); sr1 = data[0]; - if (sr1 & 0x7C) + if (sr1 != 0) { - debug_printf("Unlock SR1: %02x -> %02x\n", sr1, sr1 & ~0x7C); - flash_cmd_opt(WRITE_ENABLE_STATUS_COMMAND, cmd, 0, data, 0); - data[0] = sr1 & ~0x7C; + debug_printf("Unlock SR1: %02x -> %02x\n", sr1, 0); + flash_cmd_opt(WRITE_ENABLE_COMMAND, cmd, 0, data, 0); + data[0] = 0; flash_cmd_opt(WRITE_STATUS_REG1_COMMAND, data, 1, cmd, 0); delay_milliseconds(10); /* 等待写入完成 */ } @@ -204,25 +205,54 @@ void flash_opt_unlock(void) Mask: 0x40 (0100 0000) */ flash_cmd_opt(READ_STATUS_REG2_COMMAND, cmd, 0, data, 1); sr2 = data[0]; - if ((sr2 & 0x40) || ((sr2 & 0x2) == 0)) + if (sr2 != 0x2) { - debug_printf("Unlock SR2: %02x -> %02x\n", sr2, (sr2 & ~0x40) | 0x2); + debug_printf("Unlock SR2: %02x -> %02x\n", sr2, 0x2); flash_cmd_opt(WRITE_ENABLE_STATUS_COMMAND, cmd, 0, data, 0); - data[0] = (sr2 & ~0x40) | 0x2; + data[0] = 0x2; flash_cmd_opt(WRITE_STATUS_REG2_COMMAND, data, 1, cmd, 0); delay_milliseconds(10); } - /* Reason: 解锁 Status Register 3。 - 参考 flash_api_ext.c 逻辑,清除 Bit 2 (WPS) - Mask: 0x04 (0000 0100) */ + /* Reason: 解锁 Status Register 3。*/ + unsigned write_sr3 = 0; flash_cmd_opt(READ_STATUS_REG3_COMMAND, cmd, 0, data, 1); sr3 = data[0]; - if (sr3 & 0x04) + + if ((did[0] == 0xEF) && (sr3 != 0x60)) { - debug_printf("Unlock SR3: %02x -> %02x\n", sr3, sr3 & ~0x04); - flash_cmd_opt(WRITE_ENABLE_STATUS_COMMAND, cmd, 0, data, 0); - data[0] = sr3 & ~0x04; + data[0] = 0x60; + write_sr3 = 1; + } + else if (((did[0] == 0xC8) || ((did[0] == 0x85) && (did[1] == 0x60))) && (sr3 != 0x20)) + { + data[0] = 0x20; + } + else if ((did[0] == 0x0b) && (did[1] == 0x40) && (sr3 != 0x40)) + { + data[0] = 0x40; + write_sr3 = 1; + } + else if ((did[0] == 0x5e) && (sr3 != 0x10)) + { + data[0] = 0x10; + write_sr3 = 1; + } + else if ((did[0] == 0x85) && (did[1] == 0x20) && (sr3 != 0x0)) + { + data[0] = 0x00; + write_sr3 = 1; + } + else if (sr3 != 0) + { + data[0] = 0; + write_sr3 = 1; + } + + if (write_sr3 == 1) + { + debug_printf("Unlock SR3: %02x -> %02x\n", sr3, data[0]); + flash_cmd_opt(WRITE_ENABLE_COMMAND, cmd, 0, data, 0); flash_cmd_opt(WRITE_STATUS_REG3_COMMAND, data, 1, cmd, 0); delay_milliseconds(10); }