📄 main.c
字号:
#include "ioat91sam7s64.h"
#include <inarm.h>
#ifdef VER6
#define FIRMWARE_SIZE 0x6E00
#define FROM (0x100000+0x2000+FIRMWARE_SIZE)
#define TO (0x100000+0x2000)
#define BLOCK_SIZE 128
#include "396-v6.h"
#endif
#ifdef VER7
#define FIRMWARE_SIZE 0x6E00
#define FROM (0x100000+0x2000+FIRMWARE_SIZE)
#define TO (0x100000+0x2000)
#define BLOCK_SIZE 128
#include "396-v7.h"
#endif
//SN
__root const unsigned int sn @ 0xff00 = 10000001;
unsigned short CalcCrc (unsigned char *R4, int count)
{
unsigned R0 = 0, R3, R5;
R3 = 0x8408;
for (;count != 0; count--)
{
R5 = R0;
R0 = *R4;
R4++;
R0 ^= R5;
for (int i = 8; i !=0; i--)
{
int last = R0;
R0 >>= 1;
if (last & 1)
R0 ^= R3;
}
}
return R0;
}
__ramfunc void WriteBlock (unsigned *src, unsigned *dst)
{
unsigned int i;
unsigned *locdst;
locdst = (unsigned *)(((unsigned)dst) &0x000fffff);
for (i = 32; i!=0; i--)
*locdst++ = *src++;
*AT91C_MC_FCR = 0x5A000001 | ((unsigned)dst << 1) & 0x3FF00;
while (!(*AT91C_MC_FSR & 1));
}
__ramfunc void CopyFirmware (void)
{
int i;
for (i = 0; i < FIRMWARE_SIZE; i+= BLOCK_SIZE)
WriteBlock((unsigned *)(FROM + i), (unsigned *)(TO + i));
}
__ramfunc void MarkFirmfareInvalide ()
{
int buf [32];
int i;
for (i = 0; i < 32; i++)
buf[i] = 0;
WriteBlock((unsigned*)buf, (unsigned*)FROM);
}
__ramfunc void ClearLockIfSet(int region)
{
region &= 0xF;
if (*AT91C_MC_FSR & ((1 << region) << 16))
{
*AT91C_MC_FCR = 0x5A000004 | (region << 8);
}
while (!(*AT91C_MC_FSR & 1));
}
unsigned char IsValideFirmware ()
{
unsigned int *i = (unsigned int *)FROM;
int cnt = 0;
unsigned int result = 0;
for (cnt = 0; cnt < 32; cnt++)
result |= (*i++);
if (result == 0)
return 0;
unsigned short crc = CalcCrc((unsigned char *) FROM, FIRMWARE_SIZE - 2);
if (*(unsigned short*)(FROM + FIRMWARE_SIZE- 2) != crc)
return 0;
return 1;
}
int main()
{
int i;
typedef void (*pfoo)();
pfoo p = (pfoo) TO;
for (i = 0; i < 16; i++)
ClearLockIfSet(i);
if (IsValideFirmware())
{
CopyFirmware();
MarkFirmfareInvalide();
}
p();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -