📄 main.c
字号:
#include "ctrl_set.h"
#include "console.h"
#include "utils.h"
#include "39vf160.h"
#include "DataType.h"
#define DFT_DOWNLOAD_ADDR 0xc008000
#define MAX_CMD_LEN 128
#define MAX_ARGS MAX_CMD_LEN/4
extern U32 MCLK;
int IP_ADDRESS = 0xc0a80064;
U32 SERIAL_BAUD = 57600;
U32 download_addr;
U32 program_begin;
char table_begin[] = "/***************************************************************/\n";
#define prompt() puts("\\>")
TIME_STRUC SysTime;
char *WeekDay[7] = {"SUN","MON", "TUES", "WED", "THURS","FRI", "SAT"};
/*********************************************************/
int GetParameter(char *str, int cnt)
{
int i, key;
i = 0;
while(1)
{
if(kbhit())
{
key = getkey();
if(key==BACK_KEY)
i -= i?1:0;
else
if(key==ENTER_KEY)
{
str[i] = 0;
return i;
}
else
if(i<cnt)
{
putch(key);
str[i++] = key;
}
}
}
}
/*********************************************************/
int SysClock(int argc, char *argv[])
{
printf("System is running @%dHz\n", MCLK);
return 0;
}
int GetDate(int argc, char *argv[])
{
int i, error = 0;
char tmp[8];
char *str;
U32 year, month, day;
RtcGetTime(&SysTime);
printf("Current date is %d-%x-%x %s\n", SysTime.year, SysTime.month, SysTime.day, WeekDay[SysTime.weekday]);
if(argc<2)
return 0;
str = argv[1];
for(i=0; i<5; i++)
tmp[i] = str[i];
if(tmp[4]!='-')
error = 1;
year = strtodec(str, 4);
if(year<2000||error)
{
puts("year error!\n");
return 0;
}
str += 5;
i = 0;
if(str[++i]!='-')
if(str[++i]!='-')
error = 1;
str[i] = 0;
month = strtobcd(str);
if((month-1)>0x11||error)
{
puts("month error!\n");
return 0;
}
str += i+1;
i = 0;
if(str[++i]!=0)
if(str[++i]!=0)
error = 1;
str[i] = 0;
day = strtobcd(str);
if((day-1)>0x30||error)
{
puts("day error!\n");
return 0;
}
SysTime.year = year-2000;
SysTime.month = month;
SysTime.day = day;
RtcSetDay(&SysTime);
printf("Set date %d-%x-%x %s\n", year, month, day, WeekDay[SysTime.weekday]);
return 1;
}
int SetWeek(int argc, char *argv[])
{
U32 i;
int error = 0;
if(argc<2)
error = 1;
i = strtodec(argv[1], 1);
if((i-1)>5)
error = 1;
if(!error)
{
SysTime.weekday = i;
RtcSetWeek(&SysTime);
printf("Set to %s\n", WeekDay[i]);
}
else
{
puts("Please enter weekday\n");
puts("0 : Sunday\n");
puts("1 : Monday\n");
puts("2 : Tuesday\n");
puts("3 : Wednesday\n");
puts("4 : Thursday\n");
puts("5 : Friday\n");
puts("6 : Satday\n");
}
return 0;
}
int GetTime(int argc, char *argv[])
{
int i, error = 0;
char *str;
U32 hour, min, sec;
RtcGetTime(&SysTime);
printf("Current time is %x:%x:%x\n", SysTime.hour, SysTime.min, SysTime.sec);
if(argc>1)
{
str = argv[1];
i = 0;
if(str[++i]!=':')
if(str[++i]!=':')
error = 1;
str[i] = 0;
hour = strtobcd(str);
if(hour>0x23||error)
{
puts("hour error!\n");
return error;
}
str += i+1;
i = 0;
if(str[++i]!=':')
if(str[++i]!=':')
error = 1;
str[i] = 0;
min = strtobcd(str);
if(min>0x59||error)
{
puts("minute error!\n");
return error;
}
str += i+1;
i = 0;
if(str[++i]!=0)
if(str[++i]!=0)
error = 1;
str[i] = 0;
sec = strtobcd(str);
if(sec>0x59||error)
{
puts("second error!\n");
return error;
}
SysTime.hour = hour;
SysTime.min = min;
SysTime.sec = sec;
RtcSetTime(&SysTime);
printf("Set time %x:%x:%x\n", hour, min, sec);
}
return error;
}
/*********************************************************/
int ChgSysMclk(int argc, char *argv[])
{
int i, mdiv, pdiv, sdiv;
char tmp[4];
puts("This function is for adjust system running clock!!!\n");
printf("Current clock is %dHz\n", MCLK);
puts("Please enter the PLL parameter to use, mdiv[0-255], pdiv[0-63], sdiv[0-3]\n");
puts("mdiv: ");
if((mdiv=strtodec(tmp, GetParameter(tmp, 3)))<0)
{
puts("\nget mdiv Error!\n");
return 0;
}
puts("\npdiv: ");
if((pdiv=strtodec(tmp, GetParameter(tmp, 3)))<0)
{
puts("\nget pdiv Error!\n");
return 0;
}
puts("\nsdiv: ");
if((sdiv=strtodec(tmp, GetParameter(tmp, 3)))<0)
{
puts("\nget sdiv Error!\n");
return 0;
}
printf("\nYou set System clock mdiv = %d, pdiv = %d, sdiv = %d\n", mdiv, pdiv, sdiv);
i = 8000;
while(i--);
ChangePllValue(mdiv, pdiv, sdiv);
i = 8000;
while(i--);
console_init(SERIAL_BAUD);
printf("Current clock is %dHz\n", MCLK);
return 0;
}
int ChgBaudRate(int argc, char *argv[])
{
int i;
U32 BaudSet [6] = {4800, 9600, 19200, 38400, 57600, 115200};
for(i=0; i<6; i++)
printf("%d : %d\n", i, BaudSet[i]);
puts("Please enter choice : ");
while(1)
{
int ch = getch();
if(ch<='6'||ch>='0')
{
SERIAL_BAUD = BaudSet[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 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 = getkey();
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), (U16 *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE);
*(U32 *)(DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4) = bios_load_addr;
SectorProg(FlashSector(BIOS_LOAD), (U16 *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE);
}
return 0;
}
int BootLoader(int argc, char *argv[])
{
int key;
puts("boot from flash, are you sure? [y/n]");
while(1)
{
if(kbhit())
{
key = getkey();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -