📄 rma.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 + -