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

📄 main.c

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