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

📄 rma.c

📁 基于Atmel AT91RM9200芯片的bois。使用xmodeom协议与串口通讯。希望大家喜欢
💻 C
字号:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : main.c
//* Object              : main application written in C
//* Creation            : FB   24/10/2002
//*
//*----------------------------------------------------------------------------

#include "XYMODEM.H"
#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
#include "FlashDriver.h"

#ifdef ULINK

#define  SECTOR_BOOT		0
#define  SECTOR_BIOS		3
#define  SECTOR_BIOS_END	4
#define  SECTOR_APP			23
#define  SECTOR_APP_END		34
#define  SECTOR_FPGA		5
#define  SECTOR_FPGA_END	8

#else

#define  SECTOR_BOOT	0x00
#define  SECTOR_BIOS	0x01

#endif

///////////////////////////////////////////////////////////////////////////////
//	FPGA
#define FPGA_FLAG_ADDR		0x1005FFF0		//0x55AA meas FPGA download
#define FPGA_LENGTH_ADDR	0x1005FFF4		//MAX 256K bytes


extern LOAD gLoad;
extern void AT91F_DBGU_Printk(char *);

void AppUpload(void);
void BiosUpload(void);
void FpgaUpload(void);
void BootUpload(void); 
void AT91F_Program(BYTE uSector);
//added by bella yu 2005/09/01
//uRunLedType:1=Red Led,2=Green Led,3=Yellow Led
//bOnOff:TRUE=On,FALSE=Off
void RunLedControl(BYTE uRunLedType,BOOL bOnOff);


int main()
{
	char c;
	///////////////////////////////////////////////////////
	//	Dubug Uart Rx Enable
	AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_DBGU);
repeat:
	AT91F_DBGU_Printk("\x1B[1;1H\x1B[2J");
	AT91F_DBGU_Printk("Ulink BIOS for ARM9 Program version V1.0\r\n");
	AT91F_DBGU_Printk("Copyright Ulink Telecom Equipment Co., Ltd 2005\r\n\r\n");
	AT91F_DBGU_Printk("Only for Production\r\n\r\n");
	

	AT91F_DBGU_Printk(" 1.Bios Upload -------------------------[B]\r\n");	
	AT91F_DBGU_Printk(" 2.Loader Upload------------------------[L]\r\n");
	AT91F_DBGU_Printk(" 3.CPLD & FPGA Upload ------------------[C]\r\n");
	AT91F_DBGU_Printk(" 4.Application Upload ------------------[A]\r\n");
	AT91F_DBGU_Printk(" 0.Quit -----------------------------   [Q]\r\n");
	while(1)
	{
		if(AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU))
		{
			c = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);

			if(c == 'b' || c == 'B' || c == '1')	{	BiosUpload();	goto repeat;	}
			if(c == 'l' || c == 'L' || c == '2')	{	BootUpload();	goto repeat;	}
			if(c == 'c' || c == 'C' || c == '3')	{	FpgaUpload();	goto repeat;	}
			if(c == 'a' || c == 'A' || c == '4')	{	AppUpload();	goto repeat;	}
			if(c == 'q' || c == 'Q' || c == '0')	{					break;			}
		}
	}
	AT91F_DBGU_Printk("\r\n\r\n     End, CPU halt ! ");
	while(1);
}

void BootUpload(void)
{
	AT91F_DBGU_Printk("\x1B[1;1H\x1B[2J");	
	AT91F_DBGU_Printk(">>>>>>>>>   BootLoader Upload   <<<<<<<<<\r\n");
	AT91F_DBGU_Printk("-------------------------------------------------\r\n");
	AT91F_DBGU_Printk("* Please Select Menu on your Hyper Terminal\r\n   => Transfer    => Send file\r\n   => Browse File => Choose protocol you selected\r\n\r\n");
	AT91F_DBGU_Printk("select  >> Ymodem <<  Transfer Protocol to Upload File:\r\n\r\n");
	AT91F_DBGU_Printk("( or press <ESC> to return )\r\n\r\n");
	//	Ymodem update
	InitModermStru();
	if(XmodemRx(0))
	{
		AT91F_Program(SECTOR_BOOT);
	}
}

void BiosUpload(void)
{
	AT91F_DBGU_Printk("\x1B[1;1H\x1B[2J");	
	AT91F_DBGU_Printk(">>>>>>>>>   Bios Upload   <<<<<<<<<\r\n");
	AT91F_DBGU_Printk("-------------------------------------------------\r\n");
	AT91F_DBGU_Printk("* Please Select Menu on your Hyper Terminal\r\n   => Transfer    => Send file\r\n   => Browse File => Choose protocol you selected\r\n\r\n");
	AT91F_DBGU_Printk("select  >> Ymodem <<  Transfer Protocol to Upload File:\r\n\r\n");
	AT91F_DBGU_Printk("( or press <ESC> to return )\r\n\r\n");
	//	Ymodem update
	InitModermStru();
	if(XmodemRx(0))
	{
		AT91F_Program(SECTOR_BIOS);
	}
}

void AppUpload(void)
{
	AT91F_DBGU_Printk("\x1B[1;1H\x1B[2J");	
	AT91F_DBGU_Printk(">>>>>>>>>   Application Upload   <<<<<<<<<\r\n");
	AT91F_DBGU_Printk("-------------------------------------------------\r\n");
	AT91F_DBGU_Printk("* Please Select Menu on your Hyper Terminal\r\n   => Transfer    => Send file\r\n   => Browse File => Choose protocol you selected\r\n\r\n");
	AT91F_DBGU_Printk("select  >> Ymodem <<  Transfer Protocol to Upload File:\r\n\r\n");
	AT91F_DBGU_Printk("( or press <ESC> to return )\r\n\r\n");
	//	Ymodem update
	InitModermStru();
	if(XmodemRx(0))
	{
		AT91F_Program(SECTOR_APP);
	}
}

void FpgaUpload(void)
{
	AT91F_DBGU_Printk("\x1B[1;1H\x1B[2J");	
	AT91F_DBGU_Printk(">>>>>>>>>   CPLD & FPGA Upload   <<<<<<<<<\r\n");
	AT91F_DBGU_Printk("-------------------------------------------------\r\n");
	AT91F_DBGU_Printk("* Please Select Menu on your Hyper Terminal\r\n   => Transfer    => Send file\r\n   => Browse File => Choose protocol you selected\r\n\r\n");
	AT91F_DBGU_Printk("select  >> Ymodem <<  Transfer Protocol to Upload File:\r\n\r\n");
	AT91F_DBGU_Printk("( or press <ESC> to return )\r\n\r\n");
	//	Ymodem update
	InitModermStru();
	if(XmodemRx(0))
	{
		AT91F_Program(SECTOR_FPGA);
	}
}

#ifdef ULINK

void AT91F_Program(BYTE uSector)
{
	DWORD i,dwCnt, dwPacket, dwPercent;
	DWORD dwAddr = 0x10000000;
	int	  nRtn = TRUE;
	//	erase
	AT91F_DBGU_Printk("\r\n\r\nErasing Flash......");
	switch (uSector) 
	{
	case SECTOR_BIOS:
		for(i=SECTOR_BIOS; i<=SECTOR_BIOS_END; i++)
		{
			FlashEraseBlock(dwAddr, i);
		}
		break;
	case SECTOR_FPGA:
		for(i=SECTOR_FPGA; i<=SECTOR_FPGA_END; i++)
		{
			FlashEraseBlock(dwAddr, i);
		}
		dwCnt = 0x55AA;
		FlashProgramBlock(FPGA_FLAG_ADDR & 0xFFFF0000, (FPGA_FLAG_ADDR & 0xFFFF)/2, 
									(unsigned short*)&dwCnt, 1);
		dwCnt = gLoad.dwSize & 0xFFFF;
		FlashProgramBlock(FPGA_FLAG_ADDR & 0xFFFF0000, (FPGA_LENGTH_ADDR & 0xFFFF)/2, 
									(unsigned short*)&dwCnt, 1);
		dwCnt = (gLoad.dwSize & 0xFFFF0000) >> 16;
		FlashProgramBlock(FPGA_FLAG_ADDR & 0xFFFF0000, ((FPGA_LENGTH_ADDR+2) & 0xFFFF)/2, 
									(unsigned short*)&dwCnt, 1);
		if( (VPword(FPGA_FLAG_ADDR) != 0x55AA) || (VPdword(FPGA_LENGTH_ADDR) != gLoad.dwSize) )
		{	//	No FPGA
			AT91F_DBGU_Printk("\r\n\r\nProgramming Flash Error!");
			AT91F_DBGU_Printk("\r\n\r\n     End, CPU halt ! ");
			while(1);
		}
		break;
	case SECTOR_APP:
		for(i=SECTOR_APP; i<=SECTOR_APP_END; i++)
		{
			FlashEraseBlock(dwAddr, i);
		}
		break;
	default:
		FlashEraseBlock(dwAddr, uSector);
		break;
	}
	//	program
	AT91F_DBGU_Printk("\r\n\r\nProgramming Flash......00%");
	AT91F_DBGU_Printk("\x1B[1D");
	dwPacket  = gLoad.dwSize/200 +1;
	dwPercent = 0;
	for(i=0; i<gLoad.dwSize/2; i++)
	{
		switch (uSector) 
		{
		case SECTOR_BOOT:	//	BOOT
			nRtn = FlashProgramBlock(dwAddr, i, (unsigned short*)&(gLoad.puByte[2*i]), 1);
			break;
		case SECTOR_BIOS:	//	BIOS
			if(i < 0x4000)
			{	//	16K word
				nRtn = FlashProgramBlock(dwAddr+0x8000, i, (unsigned short*)&(gLoad.puByte[2*i]), 1);
			}
			else
			{	//	32k word
				nRtn = FlashProgramBlock(dwAddr+0x10000, i-0x4000, (unsigned short*)&(gLoad.puByte[2*i]), 1);
			}
			break;
		default:
			dwCnt = i/0x8000;	//	Sector Count			
			nRtn = FlashProgramBlock(dwAddr+0x10000*(uSector-3+dwCnt), i%0x8000, (unsigned short*)&(gLoad.puByte[2*i]), 1);
			break;
		}
		if(i%dwPacket == 0)
		{
			AT91F_DBGU_Printk("\x1B[1D");
			AT91F_DBGU_Printk("\x1B[1D");
			uart9200_PutByte(0, dwPercent/10+'0', 500000);
			uart9200_PutByte(0, dwPercent%10+'0', 500000);
			dwPercent++;
		}
		if(!nRtn)
		{
			AT91F_DBGU_Printk("\r\n\r\nProgramming Flash Error!");
			AT91F_DBGU_Printk("\r\n\r\n     End, CPU halt ! ");
			while(1);
		}
	}
	AT91F_DBGU_Printk("\x1B[1D");
	AT91F_DBGU_Printk("\x1B[1D");
	AT91F_DBGU_Printk("100%");
	//	check
	switch (uSector) 
	{
	case SECTOR_BOOT:
		break;
	case SECTOR_BIOS:
		dwAddr += 0x8000;
		break;
	default:
		dwAddr += ( 0x10000 * (uSector-3) );
		break;
	}
	for(i=0; i<gLoad.dwSize/2; i+=1)
	{
		if( VPword(dwAddr+i*2) != *(WORD*)(&gLoad.puByte[2*i]) )
		{
			AT91F_DBGU_Printk("\r\n\r\nProgramming Flash Error!");
			while(1);
		}
	}
	AT91F_DBGU_Printk("\r\n\r\nProgramming Flash Ok!");
	//	return
	AT91F_DBGU_Printk("\r\n\r\nAuto Return\r\n\r\n");
	for(i=80; i>0; i--)
	{
		AT91F_DBGU_Printk("=");
		DelayMs(50);
	}
}

#else

void AT91F_Program(BYTE uSector)
{
	WORD i;
	DWORD dwAddr = 0x10000000;
	//	erase
	AT91F_DBGU_Printk("\r\n\r\nErasing Flash......");
	FlashClearLockBits(dwAddr, uSector);
	FlashEraseBlock(dwAddr, uSector);
	//	program
	AT91F_DBGU_Printk("\r\n\r\nProgramming Flash......");
	for(i=0; i<gLoad.dwSize/2; i+=1)
	{
		FlashProgramBlock(dwAddr+128*1024*uSector, i, (unsigned char*)&(gLoad.puByte[2*i]), 2);
		if( !(i%1024) )
			AT91F_DBGU_Printk(".");
	}
	//	check
	dwAddr += 128*1024*uSector;
	for(i=0; i<gLoad.dwSize/2; i+=1)
	{
		if( VPword(dwAddr+i*2) != *(WORD*)(&gLoad.puByte[2*i]) )
		{
			AT91F_DBGU_Printk("\r\n\r\nProgramming Flash Error!");
			while(1);
		}
	}
	AT91F_DBGU_Printk("\r\n\r\nProgramming Flash Ok!");
	//	return
	AT91F_DBGU_Printk("\r\n\r\nAuto Return\r\n\r\n");
	for(i=80; i>0; i--)
	{
		AT91F_DBGU_Printk("=");
		DelayMs(50);
	}
}

#endif

void RunLedControl(BYTE uRunLedType,BOOL bOnOff)
{
	uRunLedType = bOnOff;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -