📄 main.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"
#include "Print.h"
#ifdef ULINK
///////////////////////////////////////////////////////////////////////////////
// Flash_Sector (AM29LV160D: 2M bytes: 16k,8k,8k,32k,64k,64k,...(bytes)
#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
#define SECTOR_APP 0x02
#define SECTOR_FPGA 0x07
#endif
///////////////////////////////////////////////////////////////////////////////
// FPGA
#define FPGA_START_ADDR 0x10020000 //Sector 5
#define FPGA_FLAG_ADDR 0x1005FFF0 //0x55AA meas FPGA download
#define FPGA_LENGTH_ADDR 0x1005FFF4 //MAX 256K bytes
BYTE g_uFpga;
#define CLK g_uFpga //sbit CLK = P3^2;
#define DIN g_uFpga //sbit DIN = P3^3;
#define PROG g_uFpga //sbit PROG = P1^4;
#define DOWN g_uFpga //sbit DOWN = P1^5;
#define CS g_uFpga //sbit CS = P1^6;
// End
#define PASSWORD_LEN 0x08
#define INPUT_ERROR 0xFF
#define SDRAM_ADDR 0x20000000
#define SDRAM_GROW 0x100000
#define WATCHDOG_TEST_MS 10000
///////////////////////////////////////////////////////////////////////////////
// IO Addr
#define O_ADDR 0xFFFFF838
#define I_ADDR 0xFFFFF83C
#define FPGA_DONE 0
#define FPGA_INIT 1
#define FPGA_PROG 2
#define FPGA_CCLK 3
#define FPGA_DIN 4
#define RED_LED 8
#define GREEN_LED 9
#define WATCHDOG 15
extern LOAD gLoad;
extern void AT91F_DBGU_Printk(char *);
BYTE g_uSdramSize = 0;
void WatchDog_Reset(void);
void CpuHalt(void);
BOOL FpgaDownload(void);
void CheckPassword(char c);
BYTE GetInputChar(char *pAddr, BOOL bShow);
void NormalScreen(void);
void SuperScreen(void);
void BootUpload(void);
void AppUpload(void);
void BiosUpload(void);
void FpgaUpload(void);
void WatchdogTest(void);
void FlashOperation(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()
{
BYTE uSize = 0;
WORD wBackup;
char c;
///////////////////////////////////////////////////////////////////////////////
// For Fpga Error
// char ch[PASSWORD_LEN];
// BYTE uCnt = 0;
// Init Watchdog
// SetBitVal(VPdword(0xFFFFF800), WATCHDOG, TRUE);
// SetBitVal(VPdword(0xFFFFF810), WATCHDOG, TRUE);
// SetBitVal(VPdword(0xFFFFF8A8), WATCHDOG, TRUE);
// while(1)
// {
// WatchDog_Reset();
// }
///////////////////////////////////////////////////////
// Dubug Uart Rx Enable
#ifdef DEBUG_UART
AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_DBGU);
#else
AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_US1);
#endif
PrintString(Cls);
PrintString(bios_menu_head);
PrintString(bios_copyright);
PrintString(mcu_selftest);
///////////////////////////////////////////////////////////////////////////////
// SDRAM TEST
PrintString(memory_selftest);
while(1)
{
wBackup = VPword(SDRAM_ADDR + g_uSdramSize*SDRAM_GROW);
VPword(SDRAM_ADDR + g_uSdramSize*SDRAM_GROW) = 0x5A5A;
if(!g_uSdramSize)
{ // first time
if( VPword(SDRAM_ADDR) == 0x5A5A )
{ // RW OK
VPword(SDRAM_ADDR) = wBackup;
g_uSdramSize = 2;
}
else break;
}
else
{
if( VPword(SDRAM_ADDR + g_uSdramSize*SDRAM_GROW) == 0x5A5A )
{
if(VPword(SDRAM_ADDR) != 0x5A5A)
{ // RW OK
VPword(SDRAM_ADDR + g_uSdramSize*SDRAM_GROW) = wBackup;
g_uSdramSize *= 2;
}
else
{ // End for Loop
VPword(SDRAM_ADDR + g_uSdramSize*SDRAM_GROW) = wBackup;
break;
}
}
else break;
}
}
if(g_uSdramSize)
{
PrintString("OK, Memory size is ");
if(g_uSdramSize/10)
{
uart9200_PutByte(0, g_uSdramSize/10+'0', 500000);
}
uart9200_PutByte(0, g_uSdramSize%10+'0', 500000);
PrintString(" M");
}
else
{
PrintString("error");
CpuHalt();
}
///////////////////////////////////////////////////////////////////////////////
// FPGA DownLoad
if(!FpgaDownload())
{ // FPGA Download Error
if(!FpgaDownload())
{
if(!FpgaDownload())
{
SetBitVal(VPdword(O_ADDR), GREEN_LED, FALSE);
PrintString("\r\n\r\n FPGA Download Error !\r\n");
}
else
SetBitVal(VPdword(O_ADDR), RED_LED, FALSE);
}
else
SetBitVal(VPdword(O_ADDR), RED_LED, FALSE);
// PrintString("\r\n Cpu Halt ! \r\n");
// while(1)
// {
// uCnt = GetInputChar(ch, TRUE);
// if(uCnt != INPUT_ERROR)
// {
// ch[uCnt] = 0;
// if( !strcmp("dvlp", ch) )
// {
// FlashEraseBlock(FLASH_BASE_ADDR, SECTOR_FPGA_END);
// }
// }
// }
}
else
{
SetBitVal(VPdword(O_ADDR), RED_LED, FALSE);
SetBitVal(VPdword(O_ADDR), GREEN_LED, TRUE);
}
///////////////////////////////////////////////////////////////////////////////
PrintString(screen_right);
PrintString(general_select_menu);
PrintString(screen_right1);
PrintString(supervisor_select_menu);
for(uSize=80; uSize>0; uSize--)
{
PrintString("=");
DelayMs(60);
if(AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU))
{
c = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
if(c == 'v' || c == 'V' || c == 'g' || c == 'G')
{
CheckPassword(c);
break;
}
}
}
PrintString(Cls);
PrintString(start_app);
SetBitVal(VPdword(0xFFFFF800), WATCHDOG, TRUE);
SetBitVal(VPdword(0xFFFFF810), WATCHDOG, TRUE);
SetBitVal(VPdword(0xFFFFF8A8), WATCHDOG, TRUE);
}
void RunLedControl(BYTE uRunLedType,BOOL bOnOff)
{
if (uRunLedType == 0x01)
{//Red Led
SetBitVal(VPdword(O_ADDR), RED_LED, bOnOff);
}
else if (uRunLedType == 0x02)
{//Green Led
SetBitVal(VPdword(O_ADDR), GREEN_LED, bOnOff);
}
else if (uRunLedType == 0x03)
{//Yellow Led
SetBitVal(VPdword(O_ADDR), GREEN_LED, bOnOff);
SetBitVal(VPdword(O_ADDR), RED_LED, bOnOff);
}
else
{//None
SetBitVal(VPdword(O_ADDR), GREEN_LED, bOnOff);
}
}
void CheckPassword(char c)
{
char *chNormal = "ulinkcom";
char *chSuper = "dvlp";
char ch[PASSWORD_LEN];
BYTE uCnt = 0;
PrintString(Cls);
PrintString(screen_mid1);
PrintString(password);
while( uCnt = GetInputChar(ch, FALSE) )
{
if(uCnt != INPUT_ERROR)
{
ch[uCnt] = 0;
if( c == 'v' || c == 'V' )
{ // super user
if( !strcmp(chSuper, ch) ) { SuperScreen(); return; }
}
if( c == 'g' || c == 'G' )
{ // normal user
if( !strcmp(chNormal, ch) ) { NormalScreen(); return; }
}
}
PrintString(Cls); // error, try again
PrintString(screen_mid);
PrintString(pw_error);
PrintString(screen_mid1);
PrintString(password);
}
}
BYTE GetInputChar(char *pAddr, BOOL bShow)
{ // bShow - 0 : * bShow - 1 : char
char chInput;
BYTE uCnt = 0;
while (1)
{
if(AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU))
{
chInput = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
if(chInput == ESC) return 0;
else if(chInput == BACK_SPACE)
{
if(uCnt)
{
uCnt--;
PrintString(CUR_left);
PrintString(" ");
PrintString(CUR_left);
}
}
else if(chInput == ENTER || uCnt == PASSWORD_LEN)
{ // stop
if(chInput == ENTER) break;
else return INPUT_ERROR;
}
else
{
*(pAddr + (uCnt++) ) = chInput;
if(bShow) uart9200_PutByte(0, chInput, 500000);
else PrintString("*");
}
}
}
return (!uCnt) ? INPUT_ERROR : uCnt;
}
void NormalScreen(void)
{
char c;
PrintString(Cls);
PrintString(general_design_1);
PrintString(general_design_2);
PrintString(general_design_3);
PrintString(general_design_4);
PrintString(general_design_5);
while(1)
{
if(AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU))
{
c = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
if(c == 'a' || c == 'A' || c == '1') { AppUpload(); break; }
if(c == 'q' || c == 'Q' || c == '0') { break; }
}
}
}
void SuperScreen(void)
{
char c;
repeat:
PrintString(Cls);
PrintString(supervisor_design_1);
PrintString(supervisor_design_2);
PrintString(supervisor_design_3);
PrintString(supervisor_design_4);
PrintString(supervisor_design_5);
PrintString(supervisor_design_6);
PrintString(supervisor_design_7);
PrintString(supervisor_design_8);
PrintString(supervisor_design_9);
PrintString(supervisor_design_0);
while(1)
{
if(AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU))
{
c = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
if(c == 'a' || c == 'A' || c == '1') { AppUpload(); goto repeat; }
if(c == 'b' || c == 'B' || c == '2') { BiosUpload(); goto repeat; }
if(c == 'c' || c == 'C' || c == '3') { FpgaUpload(); goto repeat; }
if(c == 'l' || c == 'L' || c == '4') { BootUpload(); goto repeat; }
if(c == 'w' || c == 'W' || c == '5') { WatchdogTest(); goto repeat; }
if(c == 'f' || c == 'F' || c == '6') { FlashOperation(); goto repeat; }
if(c == 'q' || c == 'Q' || c == '0') { break; }
}
}
}
void BootUpload(void)
{
PrintString(Cls);
PrintString(boot_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_BOOT);
}
RunLedControl(0x03,FALSE); //added by bella yu 2005/09/01
RunLedControl(0x02,TRUE);
}
void AppUpload(void)
{
PrintString(Cls);
PrintString(app_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_APP);
}
RunLedControl(0x03,FALSE); //added by bella yu 2005/09/01
RunLedControl(0x02,TRUE);
}
void BiosUpload(void)
{
PrintString(Cls);
PrintString(bios_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_BIOS);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -