📄 main.c
字号:
#include "ctrl_set.h"
#include "console.h"
#include "utils.h"
#include "39vf160.h"
#include "DataType.h"
#include "44b0x.h"
#define DEF_START_ADDR 0x10000
#define DFT_DOWNLOAD_ADDR 0xc008000
#define MAX_CMD_LEN 128
#define MAX_ARGS MAX_CMD_LEN/4
extern void clearpicture(void);
extern void DelayNS(int dly);
extern void Blink(int row);
extern void TextDisplayInit(void);
extern void displaypicture(void);
extern void LCDIni(void);
extern void graphshow(void);
extern void clearsentence(void);
extern void printsentence(unsigned short int x,char *p);
void TimeDisplay (void);
void DisplayChineseword(unsigned short int x,unsigned short int y,unsigned int chineseword);
extern void LCD_BACK_LIGHT(int i);//i=0 on ,i=1 off
extern U32 MCLK;
int IP_ADDRESS= 0xc0a80064;//=0x0a010799;
U32 SERIAL_BAUD = 57600;
U32 download_addr;
U32 program_begin;
U8 which_key;
U8 flag_key;
char table_begin[] = "/***************************************************************/\n";
TIME_STRUC SysTime;
char *WeekDay[7] = {"SUN","MON", "TUES", "WED", "THURS","FRI", "SAT"};
/*********************************************************/
static void delay(U32 cnt)
{
while(cnt--);
}
void prompt()
{
puts("\\>");
}
/*static int getkey_con(void)
{
puts("Press any key to continue...\n");
return (getch()==0x1b);
}
*/
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 %x-%x-%d %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 %x-%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;
}
/*******************************************************/
//时间显示
//*********************************************************
void TimeDisplay (void)
{
int value;
RtcGetTime(&SysTime);
printsentence(0," 北京时间 ");
printsentence(1," 年 月 日 ");
value=(0x30+(SysTime.year>>12))<<8;
value=value+(((SysTime.year&0x0f00)>>8)+0x30);
DisplayChineseword(1,0,value);
value=(0x30+((SysTime.year&0x00f0)>>4))<<8;
value=value+((SysTime.year&0x000f)+0x30);
DisplayChineseword(1,1,value);
value=(0x30+(SysTime.month>>4))<<8;
value=value+((SysTime.month&0xf)+0x30);
DisplayChineseword(1,3,value);
value=(0x30+(SysTime.day>>4))<<8;
value=value+((SysTime.day&0xf)+0x30);
DisplayChineseword(1,5,value);
value=(0x30+(SysTime.hour>>4))<<8;
value=value+((SysTime.hour&0xf)+0x30);
DisplayChineseword(2,0,value);
value=(0x30+(SysTime.min>>4));
value=0x3a00+value;
DisplayChineseword(2,1,value);
value=((SysTime.min&0xf)+0x30)<<8;
value=0x3a+value;
DisplayChineseword(2,2,value);
value=(0x30+(SysTime.sec>>4))<<8;
value=value+((SysTime.sec&0xf)+0x30);
DisplayChineseword(2,3,value);
value=*WeekDay[SysTime.weekday];
value=(value<<8)|*(WeekDay[SysTime.weekday]+1);
DisplayChineseword(2,5,value);
value=*(WeekDay[SysTime.weekday]+2);
value=(value<<8)|*(WeekDay[SysTime.weekday]+3);
DisplayChineseword(2,6,value);
DelayNS(5);
}
/*********************************************************/
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",prog_begin);
printf(" from ram data @0x%x",data_begin);
printf( " size = %dBytes\nAre you sure? [y/n]", size);
while(1)
{
if(kbhit())
{
int key = getkey();
if(key=='y'||key=='Y')
{
putch(key);
next_line();
FlashProg(prog_begin, (U16 *)&data_begin, size);
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();
if(key=='y'||key=='Y')
{
void (*fp)(void) =(void (*)(void))BIOS_LOAD;
putch(key);
next_line();
(*fp)();
}
if(key=='n'||key=='N')
{
putch(key);
next_line();
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -