📄 main.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 + -