📄 main.c
字号:
}
RunLedControl(0x03,FALSE); //added by bella yu 2005/09/01
RunLedControl(0x02,TRUE);
}
void FpgaUpload(void)
{
PrintString(Cls);
PrintString(fpga_upload_frame);
PrintString(note_frame_1);
PrintString(note_frame_2);
PrintString(note_frame_3);
PrintString(note_frame_4);
// Ymodem update
InitModermStru();
if(XmodemRx(0))
{
AT91F_Program(SECTOR_FPGA);
}
RunLedControl(0x03,FALSE); //added by bella yu 2005/09/01
RunLedControl(0x02,TRUE);
}
void WatchdogTest(void)
{
int i;
char c;
PrintString(Cls);
PrintString(watchdog_frame_1);
PrintString(note_frame_1);
PrintString(watchdog_frame_2);
PrintString(note_frame_4);
PrintString(watchdog_frame_3);
while(1)
{
if(AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU))
{
c = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
if(c == ESC || c == 'n' || c == 'N') break;
if(c == 'y' || c == 'Y' )
{
PrintString("\r\n");
//Enable Watchdog
VPdword(0xFFFFF800) = 0x00008300;
VPdword(0xFFFFF810) = 0x00008300;
DelayMs(WATCHDOG_TEST_MS);
PrintString(watchdog_frame_4);
// return
AT91F_DBGU_Printk(szreturn);
for(i=80; i>0; i--)
{
PrintString("=");
DelayMs(30);
}
break;
}
}
}
}
void FlashOperation(void)
{
char ch[PASSWORD_LEN];
BYTE uCnt = 0;
BYTE uStartH, uStartL, uEndH, uEndL;
BOOL bFlag = FALSE;
repeat:
PrintString(Cls);
PrintString(flash_frame);
PrintString(note_frame_1);
#ifdef ULINK
PrintString("FLASH TYPE is : MX 29LV160\r\n");
PrintString("FLASH Size is : 2M bytes\r\n\r\n");
#else
PrintString("FLASH TYPE is : Intel TE28F640\r\n");
PrintString("FLASH Size is : 4M bytes\r\n\r\n");
#endif
PrintString(erase_flash_frame);
PrintString(note_frame_1);
PrintString("\r\nExample Erase cmd: 0,10 (erase from sector 0 to sector 10)\r\n");
PrintString(note_frame_4);
erase_error:
PrintString("Input Erase cmd: ");
while( uCnt = GetInputChar(ch, TRUE) )
{
if(uCnt != INPUT_ERROR)
{
if(ch[1] == ',')
{
if(uCnt == 3)
{
uStartH = ch[0] - '0';
uEndH = ch[2] - '0';
bFlag = TRUE;
}
else if(uCnt == 4)
{
uStartH = ch[0] - '0';
uEndH = ch[2] - '0';
uEndL = ch[3] - '0';
uEndH = 10 * uEndH + uEndL;
bFlag = TRUE;
}
}
else if(ch[2] == ',')
{
if(uCnt == 4)
{
uStartH = ch[0] - '0';
uStartL = ch[1] - '0';
uStartH = 10 * uStartH +uStartL;
uEndH = ch[3] - '0';
bFlag = TRUE;
}
else if(uCnt == 5)
{
uStartH = ch[0] - '0';
uStartL = ch[1] - '0';
uStartH = 10 * uStartH +uStartL;
uEndH = ch[3] - '0';
uEndL = ch[4] - '0';
uEndH = 10 * uEndH + uEndL;
bFlag = TRUE;
}
}
if(bFlag)
{ // Get correct cmd
#ifdef ULINK
if(uStartH <= uEndH && uEndH < 35)
#else
if(uStartH <= uEndH && uEndH < 32)
#endif
{
PrintString(szerase);
for( ; uStartH<=uEndH; uStartH++)
{
#ifdef ULINK
if(!FlashEraseBlock(FLASH_BASE_ADDR, uStartH))
{
AT91F_DBGU_Printk("Fail!\r\n\r\n");
goto erase_error;
}
#else
FlashClearLockBits(FLASH_BASE_ADDR, uStartH);
FlashEraseBlock(FLASH_BASE_ADDR, uStartH);
#endif
PrintString(".");
}
PrintString(szerase_ok);
// return
AT91F_DBGU_Printk(szreturn);
for(uCnt=80; uCnt>0; uCnt--)
{
PrintString("=");
DelayMs(30);
}
return;
}
}
}
goto repeat;
}
}
#ifdef ULINK
void AT91F_Program(BYTE uSector)
{
DWORD i, dwCnt, dwPacket, dwPercent;
DWORD dwAddr = FLASH_BASE_ADDR;
int nRtn = TRUE;
// erase
//added by bella yu 2005/09/01
DWORD dwTimer = 0;
RunLedControl(0x03,TRUE);
//////////////////////////////
PrintString(szerase);
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
PrintString(szflash_error);
CpuHalt();
}
break;
case SECTOR_APP:
for(i=SECTOR_APP; i<=SECTOR_APP_END; i++)
{
//added by bella yu for control run led 2005/09/01
dwTimer ++;
if (dwTimer < 3)
{
RunLedControl(0x03,FALSE);
}
else if ((dwTimer >=3)&&(dwTimer < 6))
{
RunLedControl(0x03,TRUE);
}
else
{
dwTimer = 0;
}
///////////////////////////////////////////////////
FlashEraseBlock(dwAddr, i);
}
break;
default:
FlashEraseBlock(dwAddr, uSector);
break;
}
// program
PrintString(szflash);
PrintString(CUR_left);
dwPacket = gLoad.dwSize/200 +1;
dwPercent = 0;
//added by bella yu 2005/09/01
dwTimer = 0;
//////////////////////////////
for(i=0; i<gLoad.dwSize/2; i+=1)
{
switch (uSector)
{
case SECTOR_BOOT: // BOOT
nRtn = FlashProgramBlock(dwAddr, i, (unsigned short*)&(gLoad.puByte[2*i]), 1);
break;
case 1:
nRtn = FlashProgramBlock(dwAddr+0x4000, i, (unsigned short*)&(gLoad.puByte[2*i]), 1);
break;
case 2:
nRtn = FlashProgramBlock(dwAddr+0x6000, 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;
}
//added by bella yu for control run led 2005/09/01
dwTimer ++;
if (dwTimer < 15000)
{
RunLedControl(0x03,FALSE);
}
else if ((dwTimer >=15000)&&(dwTimer < 30000))
{
RunLedControl(0x03,TRUE);
}
else
{
dwTimer = 0;
}
///////////////////////////////////////////////////
if(i%dwPacket == 0)
{
PrintString(CUR_left);
PrintString(CUR_left);
uart9200_PutByte(0, dwPercent/10+'0', 500000);
uart9200_PutByte(0, dwPercent%10+'0', 500000);
dwPercent++;
}
if(!nRtn)
{
PrintString(szflash_error);
CpuHalt();
}
}
PrintString(CUR_left);
PrintString(CUR_left);
PrintString("100%");
// check
switch (uSector)
{
case SECTOR_BOOT:
break;
case 1:
dwAddr += 0x4000;
break;
case 2:
dwAddr += 0x6000;
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]) )
{
PrintString(szflash_error);
CpuHalt();
}
}
PrintString(szflash_ok);
// return
AT91F_DBGU_Printk(szreturn);
for(i=80; i>0; i--)
{
PrintString("=");
DelayMs(30);
}
}
#else
void AT91F_Program(BYTE uSector)
{
WORD i;
DWORD dwAddr = 0;
// erase
PrintString(szerase);
FlashClearLockBits(dwAddr, uSector);
FlashEraseBlock(dwAddr, uSector);
// program
PrintString(szflash);
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]) )
{
PrintString(szflash_error);
CpuHalt();
}
}
PrintString(szflash_ok);
// return
AT91F_DBGU_Printk(szreturn);
for(i=80; i>0; i--)
{
PrintString("=");
DelayMs(50);
}
}
#endif
void CpuHalt(void)
{
PrintString("\r\n Cpu Halt ! \r\n");
while(1);
}
void WatchDog_Reset(void)
{
SetBitVal(VPdword(O_ADDR), WATCHDOG, !GetBitVal(VPdword(O_ADDR), WATCHDOG) );
}
BOOL FpgaDownload(void)
{
BYTE uData,uBit;
DWORD dwCnt;
DWORD dwLength;
dwLength = VPword(FPGA_FLAG_ADDR);
dwLength = VPdword(FPGA_LENGTH_ADDR);
if( VPword(FPGA_FLAG_ADDR) != 0x55AA )
{ // No FPGA
return TRUE;
}
SetBitVal(VPdword(I_ADDR), FPGA_INIT, 0); //chip select
SetBitVal(VPdword(O_ADDR), FPGA_PROG, 0); //chip erase
DelayMs(10); //at lease 300ns;
SetBitVal(VPdword(O_ADDR), FPGA_PROG, 1); //chip erase OK
DelayMs(10); //wait chip INIT High
for(dwCnt=0; dwCnt<dwLength; dwCnt++)
{
uData = XBYTE[FPGA_START_ADDR+dwCnt];
for(uBit=0;uBit<8;uBit++)
{
SetBitVal( VPdword(O_ADDR), FPGA_DIN, (uData>>uBit) & 0x01 );
SetBitVal( VPdword(O_ADDR), FPGA_CCLK, 0 );
SetBitVal( VPdword(O_ADDR), FPGA_CCLK, 1 );
}
if(dwCnt == (dwLength - 1))
{
SetBitVal(VPdword(I_ADDR), FPGA_INIT, 1);
}
}
DelayMs(500);
dwCnt = 0;
while( (dwCnt++) != 0xFFFF)
{
if( GetBitVal(VPdword(I_ADDR), FPGA_DONE) )
return TRUE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -