udpate program_key.c

This commit is contained in:
Steven Dan
2026-06-11 11:28:02 +08:00
parent 1d4059e0d3
commit 2c4ae512ac

View File

@@ -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);
}