📄 burn.c
字号:
//***************************************************************************
#define U32 unsigned int
#define U16 unsigned short
#define S32 int
#define S16 short int
#define U8 unsigned char
#define S8 char
extern char Uart_GetKey(U8 ch);
extern void Uart_Printf(U8 ch,char *fmt,...);
typedef int uint;
static uint SecData[] = {
0x29160, 0x000,
0x04000, 0x001,
0x02000, 0x002,
0x08000, 0x001,
0x10000, 0x01F,
0x39160, 0x000,
0x01000, 0x200,
0x00000, 0x000
};
#define type 0x39160
uint GetSecAddr(uint index)
{
uint i;
uint sec;
uint addr;
addr = 0;
i = 0;
sec = 0;
while (SecData[i]) {
if (SecData[i]==type && SecData[i+1]==0) {
i += 2;
while (SecData[i+1]) {
sec += SecData[i+1];
addr+= (SecData[i] * SecData[i+1]);
if (sec > index) {
addr -= (SecData[i] * (sec - index));
return addr;
}
i += 2;
}
return 0;
} else {
i += 2;
continue;
}
}
return 0;
}
#define FLASHBASEADDR 0
uint WriteSector(int index,char *data_buffer)
{
volatile unsigned short *Dest;
volatile unsigned short *Org;
uint len=0,i;
Uart_Printf(0,"Burning Flash sector %02d... ", index);
len = GetSecAddr(index+1)-GetSecAddr(index);
Org = (volatile unsigned short *)data_buffer;
Dest = (volatile unsigned short *)(FLASHBASEADDR+GetSecAddr(index));
*(volatile unsigned short *)(0x0000AAAA)=0xAAAA;
*(volatile unsigned short *)(0x00005554)=0x5555;
*(volatile unsigned short *)(0x0000AAAA)=0x8080;
*(volatile unsigned short *)(0x0000AAAA)=0xAAAA;
*(volatile unsigned short *)(0x00005554)=0x5555;
*Dest =0x3030;
while ((*Dest)!=0xFFFF);
if (!data_buffer) return 0;
for (i=0;i<len/2;i++)
{
*(volatile unsigned short *)(0x0000AAAA)=0xAAAA;
*(volatile unsigned short *)(0x00005554)=0x5555;
*(volatile unsigned short *)(0x0000AAAA)=0xA0A0;
*(Dest+i)=*(Org+i);
while ((*(Dest+i))!=(*(Org+i)));
}
for (i=0;i<len/2;i++)
{
if ((*(Dest+i))!=(*(Org+i)))
{
Uart_Printf(0,"BAD!\n");
return 0;
}
}
Uart_Printf(0,"OK!\n");
return len;
}
uint GetIndex(uint offset)
{
if (type == 0x39160) {
return ((offset)/(0x1000));
} else {
if (offset < 0x4000)
return 0;
else if (offset < 0x6000)
return 1;
else if (offset < 0x8000)
return 2;
else if (offset < 0x10000)
return 3;
else {
return ((offset - 0x10000)/0x10000) + 4;
}
}
return 0;
}
uint Burn(void)
{
char c;
uint len,wlen,slen;
uint index, offset;
char *buf = (char *)(0x0C700000);
while (Uart_GetKey(0));
c = 0;
while (c<1 || c>3) {
Uart_Printf(0,"\n1. Burn boot loader!\n");
Uart_Printf(0,"2. Burn linux core!\n");
Uart_Printf(0,"3. Burn romfs!\n");
Uart_Printf(0,"Please choose:");
do {
c = Uart_GetKey(0);
if (!c) c = Uart_GetKey(1);
} while (!c) ;
Uart_Printf(0,"%c\n\n",c);
c -= '0';
}
Uart_Printf(0,"Ready for burning Flash...\n");
c--;
switch(c) {
case 0:
offset = 0x000000;
len = 0x010000;
break;
case 1:
offset = 0x040000;
len = 0x080000;
break;
case 2:
offset = 0x100000;
len = 0x0A0000;
break;
}
index = GetIndex(offset);
slen = 0;
wlen = 0;
while (1) {
slen = WriteSector(index,buf);
wlen += slen;
if (wlen >= len) break;
buf += slen;
index ++;
}
Uart_Printf(0,"Finished programming!\n\n");
Uart_Printf(0,"Please reset your system!\n\n");
while(1);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -