?? main.c
字號:
#include "DataType.h"
#include "board.h"
#include "console.h"
#include "utils.h"
#include "types.h"
#include "39vf160.h"
#define MAX_CMD_LEN 128
#define MAX_ARGS MAX_CMD_LEN/4
#define ENTER_KEY 0x0d
#define BACK_KEY 0x08
#define ESC_KEY 0x1b
int IP_ADDRESS = 0xc0a80064;
unsigned int SERIAL_BAUD;
#define DFT_SERIAL_BAUD 57600
#ifdef __NO_REMAP
#define DFT_DOWNLOAD_ADDR 0x1008000
#else
#define DFT_DOWNLOAD_ADDR 0x8000
#endif
#define DFT_PROGRAM_BEGIN 0
unsigned int download_addr;
unsigned int program_begin;
#define prompt() puts("\\>")
char star_line[] = "/*********************************************************/\n";
/*********************************************************/
int tftp_main(unsigned long ip, unsigned long addr, int method);
int LoadFile2Mem(int argc, char *argv[])
{
if(argc<2)
{
download_addr = DFT_DOWNLOAD_ADDR;
printf("No begin address for download, use default address 0x%x\n", download_addr);
}
else
download_addr = strtoul(argv[1]);
tftp_main(IP_ADDRESS, download_addr, 0);
return 0;
}
int ProgFlash(int argc, char *argv[])
{
unsigned int size = ~0;
unsigned int data_begin = ~0;
unsigned int prog_begin = ~0;
int overwrite0 = 1;
int modify_a0 = 0;
unsigned int bios_load_addr;
if(argc<4)
{
puts("Arguments error!\n");
puts("Usage: prog a1 a2 size [-no0]\na1 = program begin address\na2 = data pointer to ram\nsize = program size(Bytes)\n-no0 = don't overwrite address 0\n");
return -1;
}
prog_begin = strtoul(argv[1]);
data_begin = strtoul(argv[2]);
size = strtoul(argv[3]);
if(size==0)
{
puts("Write 0 Bytes!\n");
return -1;
}
if(prog_begin==-1||data_begin==-1) //
{
puts("Arguments error\n");
return -1;
}
printf("program flash begin @0x%x, from ram data @0x%x, size = %dBytes\nAre you sure? [y/n]", prog_begin, data_begin, size);
while(1)
{
if(kbhit())
{
int key = getch();
if(key=='y'||key=='Y')
{
putch(key);
next_line();
break;
}
if(key=='n'||key=='N')
{
putch(key);
next_line();
return 0;
}
}
}
#define __ROM_SIZE 0x200000
#define BIOS_BASE (__ROM_SIZE-0x10000)
#define BIOS_LOAD (__ROM_SIZE-4)
if(argc>4)
if(strncmp(argv[4], "-no0", 4)==0)
overwrite0 = 0;
if((prog_begin==0)&&overwrite0)
{
unsigned int ins;
ins = *(unsigned int *)data_begin;
if((ins>>24)==0xea) // instruction: b xxxx, now just support b instruction!!!
bios_load_addr = ((ins&0xffffff)<<2)+8;
else
bios_load_addr = 4; // other instruction, jump to 4
bios_load_addr = (bios_load_addr-BIOS_LOAD-8)/4;
bios_load_addr = (bios_load_addr&0xffffff)|0xea000000;
*(unsigned int *)data_begin = 0xea000000+(BIOS_BASE-8)/4;
modify_a0 = 1;
}
SectorProg(prog_begin, (unsigned short *)data_begin, size);
if(modify_a0)
{
size = FlashSector(size-1)+SECTOR_SIZE;
FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE);
*(unsigned int *)(DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4) = bios_load_addr;
SectorProg(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE);
}
return 0;
}
void trans_to_boot(int, int);
int BootLoader(int argc, char *argv[])
{
int key;
puts("boot from flash, are you sure? [y/n]");
while(1)
{
if(kbhit())
{
key = getch();
if(key=='y'||key=='Y')
{
putch(key);
next_line();
trans_to_boot(BIOS_BASE, BIOS_LOAD);
}
if(key=='n'||key=='N')
{
putch(key);
next_line();
break;
}
}
}
return 0;
}
int AutoProgFlash(int argc, char *argv[])
{
char ch_tmp[3][10];
char *para_ptr[4];
ultostr(ch_tmp[0], 0);
ultostr(ch_tmp[1], DFT_DOWNLOAD_ADDR);
ultostr(ch_tmp[2], tftp_main(IP_ADDRESS, DFT_DOWNLOAD_ADDR, 1));
para_ptr[1] = ch_tmp[0];
para_ptr[2] = ch_tmp[1];
para_ptr[3] = ch_tmp[2];
ProgFlash(4, para_ptr);
return 0;
}
int CopyFlash(int argc, char *argv[])
{
unsigned int src, dst, size;
char tmp[10];
if(argc<4)
{
puts("Usage : copy a1 a2 size\n");
puts("a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n");
return -1;
}
src = strtoul(argv[1]);
dst = strtoul(argv[2]);
size = strtoul(argv[3]);
if(src==-1||dst==-1||size==-1)
{
puts("give error address\n");
return -1;
}
FlashRead(src, (unsigned short *)DFT_DOWNLOAD_ADDR, size);
argv[1] = argv[2];
argv[2] = tmp;
ultostr(tmp, DFT_DOWNLOAD_ADDR);
ProgFlash(4, argv);
return 0;
}
int SetIPAddr(int argc, char *argv[])
{
int i, j, err = 0;
char *str;
int ip[4];
char ch = '.';
if(argc<2)
{
printf("IP address : %u.%u.%u.%u\n", (IP_ADDRESS>>24)&0xff, (IP_ADDRESS>>16)&0xff, (IP_ADDRESS>>8)&0xff, IP_ADDRESS&0xff);
return 0;
}
str = argv[1];
for(j=0; j<4; j++)
{
if(j==3)
ch = 0;
i = 0;
if(str[++i]!=ch)
if(str[++i]!=ch)
if(str[++i]!=ch)
err = 1;
str[i] = 0;
ip[j] = CharToDec(str, i);
if(ip[j]<0||ip[j]>254||err)
{
puts("IP address error\n");
return -1;
}
str += i+1;
}
printf("Set IP address : %u.%u.%u.%u\n", ip[0], ip[1], ip[2], ip[3]);
IP_ADDRESS = (ip[0]<<24)|(ip[1]<<16)|(ip[2]<<8)|ip[3];
return 0;
}
int LoadFromUart(int argc, char *argv[])
{
int start, time_out;
int load_addr = DFT_DOWNLOAD_ADDR;
if(argc>1)
{
start = strtoul(argv[1]);
if(load_addr>0)
load_addr = start;
}
start = load_addr;
#define WAIT_TIME 0x500000
time_out = WAIT_TIME;
do{
if(kbhit())
{
*((unsigned char *)load_addr++) = getkey();
time_out = WAIT_TIME;
}
}while(--time_out);
printf("Received 0x%x bytes from serial port.\n", load_addr-start);
return 0;
#undef WAIT_TIME
}
int RunProgram(int argc, char *argv[])
{
void (*fp)(void) = (void (*)(void))DFT_DOWNLOAD_ADDR;
if(argc>1)
{
int p = strtoul(argv[1]);
if(p>0)
fp = (void (*)(void))p;
}
printf("Run program from 0x%x, are you aure? [y/n]", fp);
while(1)
{
if(kbhit())
{
int key = getkey();
if(key=='y'||key=='Y')
{
putch(key);
next_line();
break;
}
if(key=='n'||key=='N')
{
putch(key);
next_line();
return 0;
}
}
}
(*fp)();
return 0;
}
extern unsigned int BaudParameters[6];
int SetBaudRate(int argc, char *argv[])
{
int i;
for(i=0; i<6; i++)
printf("%d : %d\n", i, BaudParameters[i]);
puts("Please enter choice : ");
while(1)
{
int ch = getch();
if(ch<='6'||ch>='0')
{
SERIAL_BAUD = BaudParameters[ch-'0'];
printf("Baud rate set to : %d\nPress any key to continue\n", SERIAL_BAUD);
i = 0x4000;
while(i--); //wait transmit end
console_init(SERIAL_BAUD);
getch();
break;
}
}
return 0;
}
/*********************************************************/
int WriteReg(int argc, char *argv[], int op)
{
int reg;
int val = 0;
if(argc<3)
{
return -1;
}
reg = strtoul(argv[1]);
val = strtoul(argv[2]);
switch(op)
{
case 0:
*(volatile unsigned char *)reg = val;
break;
case 1:
*(volatile unsigned short *)reg = val;
break;
case 2:
*(volatile unsigned int *)reg = val;
break;
}
printf("Write %x to %x\n", val, reg);
return 0;
}
int ReadReg(int argc, char *argv[], int op)
{
int reg, val;
if(argc<2)
return -1;
reg = strtoul(argv[1]);
switch(op)
{
case 0:
val = *(volatile unsigned char*)reg;
break;
case 1:
val = *(volatile unsigned short*)reg;
break;
case 2:
val = *(volatile unsigned int*)reg;
break;
}
printf("Read data at address:%x is %x\n", reg, val);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -