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

📄 main.c

📁 基于Atmel AT91RM9200芯片的bois。使用xmodeom协议与串口通讯。希望大家喜欢
💻 C
📖 第 1 页 / 共 2 页
字号:
//*----------------------------------------------------------------------------
//*         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 + -