udpate program_key.c
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user