⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 MOTOROLA Dragon-MX1(ARM920T)启动程序源码flashloader,用于把bootloader烧写进flash中。
💻 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 + -