Я был так "близок. Я пытался сделать резервную копию одного, а затем двух блоков, но не трех, и это было хитростью. Задним взглядом заметьте, сколько функций записывают в 0x08000000, 0x08020000 и 0x08040000:
void OpenNorWrite()
{
*(vuint16 *)0x9fe0000 = 0xd200;
*(vuint16 *)0x8000000 = 0x1500;
*(vuint16 *)0x8020000 = 0xd200;
*(vuint16 *)0x8040000 = 0x1500;
*(vuint16 *)0x9C40000 = 0x1500;
*(vuint16 *)0x9fc0000 = 0x1500;
}
Поврежденные данные всегда были 0x1500, что тоже имеет смысл.
Решение заключается в резервном копировании трех (или более) блоков и адресации вперед трех (или более) блоков:
CloseNorWrite();
SetRompage(0x180-3);
OpenNorWrite();
rb=FLASHBASE+(0x20000*3);
for(ra=0;ra<(sizeof(prog)>>2);ra++)
{
rc=prog[ra];
PUT16(rb,(rc>> 0)&0xFFFF); rb+=2;
PUT16(rb,(rc>>16)&0xFFFF); rb+=2;
}
CloseNorWrite();
SetRomPage(0x180);
reboot();