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

📄 main.c

📁 EX44B0开发板BootLoader
💻 C
字号:
#include <string.h>
#include "44b.h"

#include "UART.h"
#include "Ymodem.h"
#include "Flash.h"

#define DOWNLOAD_ADDR	0x0c010000
#define PROGRAM_ADDR	0x00010000

static void Delay(unsigned ms)
{
	ms *= 7326;
	while(--ms);
}

static void InitNIC(void)
{
	rPCONC = rPCONC & ~0x30000 | 0x10000;
	rPDATC |= 0x100;
	Delay(200);
	rPDATC &= ~0x100;
	Delay(200);

	rPCONG |= 3;
	rEXTINT = rEXTINT & ~7 | 4;
}

void Main(void)
{
	unsigned addr = 0x0c100000;
	int size = 0;

	InitUART(MCLK, 115200);
	InitNIC();

	UART_Puts(
		"\r\nEX44B0 Bootloader for uClinux"
		"\r\nBuild 2005-07-15\r\n");

	while(1)
	{
		int i;
		unsigned *src_addr, *dst_addr;
		char buf[256];

		UART_Puts(
			"\r\n************ Main Menu ************"
			"\r\n*                                 *"
			"\r\n*       1 -- Download Image       *"
			"\r\n*       2 -- Program Flash        *"
			"\r\n*       0 -- Run Image            *"
			"\r\n*                                 *"
			"\r\n*** Please Select(0 -- 2):[0]   ***"
			"\b\b\b\b\b");
		while(1)
		{
			i = UART_Getch();
			if(i >= '0' && i <= '2' || i == '\r')
				break;
			UART_Putch('\a');
		}
		UART_Putch(i);

		switch(i)
		{
		case '1':
			UART_Puts("\r\n\nWaiting for image...\r\n");
			size = Ymodem_Receive((void *)DOWNLOAD_ADDR, buf);
			if(size > 0)
			{
				UART_Printf("\r\nReceiving Succeed.\r\n"
					"File name: %s\r\nFile size: %d bytes\r\n",
					buf, size);
			}
			else if(size < 0)
				UART_Puts("\r\nAbort by user.\r\n");
			else
				UART_Puts("\r\nTransmition error.\r\n");
			break;
		case '2':
			if(size > 0)
			{
				int abort = 0, s = size + 8;
				do {
					unsigned val = 0;
					int c, n = 0;
					char *p = buf;
					UART_Printf("\r\n\nInput image load address(hex):[%08X] ", addr);
					UART_Gets(buf, 11);
					if(!buf[0])
						break;

					if(buf[0] == '0' && (buf[1] == 'x' || buf[1] == 'X'))
						p += 2;
					val = 0;
					while(*p)
					{
						c = *p;
						if(c >= '0' && c <= '9')
							c -= '0';
						else if(c >= 'A' && c <= 'F')
							c -= 'A' - 10;
						else if(c >= 'a' && c <= 'f')
							c -= 'a' - 10;
						else
						{
							n = 9;
							break;
						}
						val = val << 4 | c;
						p++, n++;
					}
					if(n > 0 && n < 9 && !(val & 7))
					{
						addr = val;
						break;
					}
					UART_Puts("Invalid input.\r\nAbort program?[N/y] ");
					while(1)
					{
						c = UART_Getch();
						if(c > 'Z') c -= 'a' - 'A';
						if(c == '\r' || c == 'N' || c == 'Y')
							break;
						UART_Putch('\a');
					}
					UART_Putch(c);
					if(c == 'Y')
						abort = 1;
				} while(!abort);
				if(abort)
					break;

				UART_Puts("\r\nErasing flash...");
				for(i = 0; i < s; i += BLOCK_SIZE)
				{
					Erase_One_Block((WORD *)(PROGRAM_ADDR + i));
					UART_Putch('.');
				}
				UART_Puts("\r\nProgramming flash....");
				Program_One_Word((WORD *)(PROGRAM_ADDR + 0), addr);
				Program_One_Word((WORD *)(PROGRAM_ADDR + 2), addr >> 16);
				Program_One_Word((WORD *)(PROGRAM_ADDR + 4), size);
				Program_One_Word((WORD *)(PROGRAM_ADDR + 6), size >> 16);
				for(i = 8; i < s; i += 2)
				{
					Program_One_Word((WORD *)(PROGRAM_ADDR + i),
						*(WORD *)(DOWNLOAD_ADDR - 8 + i));
					if(!(i & 0x7fff))
						UART_Putch('.');
				}
				UART_Puts("\r\nVerifying image....");
				if(*(unsigned *)(PROGRAM_ADDR + 0) == addr
					&& *(int *)(PROGRAM_ADDR + 4) == size)
				{
					for(i = 8; i < s; i += 2)
					{
						if(*(WORD *)(PROGRAM_ADDR + i) !=
							*(WORD *)(DOWNLOAD_ADDR - 8 + i))
							break;
						if(!(i & 0x7fff))
							UART_Putch('.');
					}
					if(i >= s)
					{
						UART_Puts("OK\r\n");
						break;
					}
				}
				UART_Puts("Error\r\n");
			}
			else
				UART_Puts("\r\n\nNo image to program."
					"\r\nPlease download first.\r\n");
			break;
		default:
			addr = *(unsigned *)(PROGRAM_ADDR + 0);
			size = *(unsigned *)(PROGRAM_ADDR + 4);

			src_addr = (unsigned *)(PROGRAM_ADDR + 8);
			dst_addr = (unsigned *)addr;
			UART_Printf("\r\n\nLoad Address: 0x%08X\r\n"
				"Image Size: %d bytes\r\nLoading image...",
				addr, size);
			for(i = 0; i < size; i += 4)
			{
				*dst_addr++ = *src_addr++;
				if(!(i & 0x7fff))
					UART_Putch('.');
			}

			UART_Puts("\r\nJump to image...\r\n\n");
			((void (*)(void))addr)();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -