📄 main.c
字号:
#include "mx1_def.h"
#define reg(x) (*(volatile unsigned int *)(x))
#define mem(x) (*(volatile unsigned int *)(x))
#define buflng 64
#define SOH 1
#define EOT 4
#define ACK 6
#define NAK 21
#define CAN 24
#define SDRAM_BASE 0x08000000
#define FLASH_BASE 0x10000000
U32 UART_ADD = 0x1000;
S8 rxbuf[buflng];
U32 invalue;
U32 target_address=0X10000000;
U32 file_long=0xd000;
extern _jump(U32);
U8 putchar(S8);
U8 puthex(U32);
U8 putstring(S8*);
U32 str2dec(void);
U8 getstr(U8);
void sdraminit(void);
U8 xxmodemrx(void);
U8 getchar(U8*);
void delay(U32);
U32 eraseblk(U32 stadd, U32 edadd);
int prgflash(U32 trgaddr, U32 size);
int verflash(U32 sraddr, U32 size);
int main(void)
{
U32 res;
// U8 *ptr;
sdraminit();
if(reg(UART1_SR2) & 0x8000)
UART_ADD = 0;
putstring("\n\rMX1 flash loader ver 1.0");
goto st;
redo:
do{
putstring("\n\rPlease enter targer address:");
getstr(10);
if((res=str2dec()) == 1)
putstring("\n\rinval value!");
}while(res);
target_address = invalue;
do{
putstring("\n\rPlease enter file longth:");
getstr(10);
if((res=str2dec()) == 1)
putstring("\n\rinval value!");
}while(res);
file_long = invalue;
st: putstring("\n\rTARGET ADDRESS:");
puthex(target_address);
putstring("\n\rFILE LONGTH:");
puthex(file_long);
putstring("\n\rpress 'Y' to contiue or 'N' to modify");
do{
getstr(1);
}while(rxbuf[0] != 'N' && rxbuf[0] != 'n' && rxbuf[0] != 'Y' && rxbuf[0] != 'y');
if(rxbuf[0] == 'N' || rxbuf[0] == 'n')
goto redo;
if(xxmodemrx())
{
putstring("\r\nError : Can't connect to pc");
return 0;
}
putstring("\r\nNow begine erase FLASH");
if(eraseblk(target_address, target_address+file_long))
{
putstring("\r\nError : Can't erase flash");
return 0;
}
putstring("\r\nNow begine program FLASH");
if(prgflash(target_address, file_long))
{
putstring("\r\nError : Can't program flash");
return 0;
}
putstring("\r\nNow begine verify FLASH");
if(verflash(target_address,file_long))
{
putstring("\r\nError : verify bad ");
return 0;
}
putstring("\r\nAll OK, Good luck!, press 'A' or 'a' to contiune");
/*
ptr=(U8*)(target_address);
for(res =0; res< file_long; res++)
{
putchar(*ptr++);
}
*/
return 0;
}
U8 putchar(S8 character)
{
while(reg(UART1_TS+UART_ADD) & 0x10);
reg(UART1_TXDATA+UART_ADD) = (U16)character;
return 0;
}
U8 getstr(U8 count)
{
U8 cnt=0;
U8 *bp =(U8*)rxbuf;
for(cnt=0; cnt<buflng ; cnt++)
rxbuf[cnt]=0x00;
while(reg(UART1_SR2+UART_ADD) & 0x01){*bp = (U8)reg(UART1_RXDATA+UART_ADD);};
for(cnt=0; cnt<count && cnt < (buflng-2); cnt++)
{
while(!(reg(UART1_SR2+UART_ADD) & 0x01));
*bp++=reg(UART1_RXDATA+UART_ADD);
reg(UART1_TXDATA+UART_ADD) = *(bp-1);
if(*(bp-1) == 13)
{
*(bp-1)=0;
return cnt;
}
}
*bp=0;
return cnt;
}
U32 str2dec(void)
{
U8 * bp = (U8*)rxbuf;
U8 md;
U32 res=0;
if(*bp++ != '0')
return -1;
if(*bp != 'x' && *bp !='X')
return 1;
bp++;
while(*bp)
{
if((*bp < '0') || ((*bp >'9') && (*bp < 'A')) ||
((*bp > 'F') &&( *bp <'a')) || (*bp>'f'))
return 1;
bp++;
}
bp = (U8*)(rxbuf)+2;
while(*bp)
{
md = *bp;
if(md>96)
md-=87;
else if(md >64)
md-=55;
else md-=48;
res = res *16 +md;
bp++;
}
invalue = res;
return 0;
}
U8 puthex(U32 dec)
{
U8 tmp, i;
U8 buffer[11];
U8 *bp = buffer;
*bp++ = '0';
*bp++ = 'x';
for(i=1; i<=8; i++)
{
tmp=(dec>>(32-i*4)) & 0x0f;
if(tmp >9) tmp+=55;
else tmp+='0';
*bp++=tmp;
}
*bp='\0';
return putstring((S8*)buffer);
}
U8 putstring(S8 * stream)
{
U8 count=0;
while(*stream)
{
if(!putchar((U8)*(stream++)))
count++;
}
return count;
}
U8 getchar(U8* add)
{
*add=0;
if(reg(UART1_SR2+UART_ADD) & 0x01)
{
*add=(U8)reg(UART1_RXDATA+UART_ADD);
return 0;
}
else return 1;
}
void sdraminit(void)
{
reg(SDRAMC_SDCTL0) = 0x92120200;
reg(0x08200000) = 0x0;
reg(SDRAMC_SDCTL0) = 0xa2120200;
reg(0x08000000) = 0x0;
reg(SDRAMC_SDCTL0) = 0xb2120200;
reg(0x08111800) = 0x0;
reg(SDRAMC_SDCTL0) = 0x82124200;
}
void delay(U32 times)
{
while(times--);
}
U8 xxmodemrx(void)
{
U32 i=0, j=0;
U8 val=0, pkn=0, check=0, err=0,fram;
U8 * ptr;
U8 * ptrb;
ptr =(U8*)SDRAM_BASE;
while(!getchar(&val));
do
{
delay(0x6000);
putchar(NAK);
while(getchar(&val) && i++<0x6000);
}while(val != SOH && val != 'c' && val !='C'&& j++<500);
if(val == 'c' || val == 'C') return 1;
if( j>=500) return 2;
delay(0x6000);
while(!getchar(&val));
putchar(NAK);
while(1)
{
ptrb=ptr;
check=0;
while(getchar(&val));
if(val == EOT )
{
putchar(ACK);
return 0;
}
if(val != SOH) goto err;
while(getchar(&fram));
while(getchar(&val));
if( fram != (U8)(pkn+1) || fram != (U8)(~val) ) goto err;
for(i=0; i<128; i++)
{
while(getchar(ptr));
check+=*(ptr);
ptr++;
}
while(getchar(&val));
if(val == check)
{
err=0;
pkn++;
putchar(ACK);
continue;
}
err: delay(0x6000);
while(!(getchar(&val)));
if(++err >10 )
{
putchar(CAN);
return 3;
}
ptr=ptrb;
putchar(NAK);
}
return 4;
}
U32 eraseblk(U32 stadd, U32 edadd)
{
U32 i=0,j=0, statues=0;
stadd = (((stadd - FLASH_BASE)>>18)<<18)+FLASH_BASE;
for(i=0; i<128; i++)
{
if((stadd+(i-1)*0x40000) > edadd)
break;
mem(stadd + i*0x40000) = 0x00200020;
// delay(0x100);
mem(stadd + i*0x40000) = 0x00d000d0;
// delay(0x100);
do
{
mem(FLASH_BASE) = 0x00700070;
// delay(0x100);
statues = mem(FLASH_BASE) & 0x00800080;
}while(statues !=0x00800080 && j++<3000000);
putchar('.');
if(j>=3000000) return 1;
}
return 0;
}
int prgflash(U32 trgaddr, U32 size)
{
U32 i=0,j=0;
U32 str, dtr;
str = SDRAM_BASE;
dtr = trgaddr;
for(i=0; i<(size); i++)
{
mem(FLASH_BASE) = 0x00400040;
mem(trgaddr+i*4) = mem(str+i*4);
while( (mem(FLASH_BASE) & 0x00800080)!=0x00800080 && j++ < 3000000 );
if(!(i%1024)) putchar('.');
if(j>=3000000) return 1;
j=0;
}
return 0;
}
int verflash(U32 sraddr, U32 size)
{
U32 i=0;
U32 str, dtr;
str = SDRAM_BASE;
dtr = sraddr;
mem(FLASH_BASE) = 0x00FF00FF;
for( i=0; i<(size); i++)
{
if( mem(str+i*4) != mem(dtr+i*4)) //compare the data
return 1;
if(!(i%1024)) putchar('.');
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -