📄 shell.c
字号:
{
Uart_Printf("System is running @ %dHz\n", MCLK);
return 0;
}
int GetDate(int argc, char *argv[])
{
int i, error = 0;
char tmp[8];
char *str;
unsigned int year, month, day;
RtcGetTime(&SysTime);
Uart_Printf("Current date is %d-%x-%x %s\n", SysTime.year, SysTime.month, SysTime.day, WeekDay[SysTime.weekday-1]);
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)
{
Uart_Printf("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)
{
Uart_Printf("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)
{
Uart_Printf("day error!\n");
return 0;
}
SysTime.year = year-2000;
SysTime.month = month;
SysTime.day = day;
RtcSetDay(&SysTime);
Uart_Printf("Set date %d-%2x-%2x %s\n", year, month, day, WeekDay[SysTime.weekday-1]);
return 1;
}
/*******************************************************************************************************/
int SetWeek(int argc, char *argv[])
{
unsigned int i;
int error = 0;
if(argc<2)
error = 1;
i = strtodec(argv[1], 1);
if((i-1)>5) //0-1 = 0xffffffff
error = 1;
if(!error)
{
SysTime.weekday = i+1; //1~7
RtcSetWeek(&SysTime);
Uart_Printf("Set to %s\n", WeekDay[i]);
}
else
{
Uart_Printf("Please enter a number to set weekday\n");
for(i=0; i<7; i++) {
Uart_Printf("%d : %s\n", i, WeekDay[i]);
}
}
return 0;
}
/*******************************************************************************************************/
int GetTime(int argc, char *argv[])
{
int i, error = 0;
char *str;
unsigned int hour, min, sec;
RtcGetTime(&SysTime);
Uart_Printf("Current time is %2x:%2x:%2x\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)
{
Uart_Printf("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)
{
Uart_Printf("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)
{
Uart_Printf("second error!\n");
return error;
}
SysTime.hour = hour;
SysTime.min = min;
SysTime.sec = sec;
RtcSetTime(&SysTime);
Uart_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];
Uart_Printf("This function is for adjust system running clock!!!\n");
Uart_Printf("Current clock is %dHz\n", MCLK);
Uart_Printf("Please enter the PLL parameter to use, mdiv[0-255], pdiv[0-63], sdiv[0-3]\n");
Uart_Printf("mdiv: ");
if((mdiv=strtodec(tmp, GetParameter(tmp, 3)))<0)
{
Uart_Printf("\nget mdiv Error!\n");
return 0;
}
Uart_Printf("\npdiv: ");
if((pdiv=strtodec(tmp, GetParameter(tmp, 3)))<0)
{
Uart_Printf("\nget pdiv Error!\n");
return 0;
}
Uart_Printf("\nsdiv: ");
if((sdiv=strtodec(tmp, GetParameter(tmp, 3)))<0)
{
Uart_Printf("\nget sdiv Error!\n");
return 0;
}
Uart_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--);
Uart_Init(0,SERIAL_BAUD);
Uart_Printf("Current clock is %dHz\n", MCLK);
MCLK_M = mdiv; MCLK_P = pdiv; MCLK_S = sdiv;
return 0;
}
/*******************************************************************************************************/
int ChgBaudRate(int argc, char *argv[])
{
int i;
for(i=0; BaudSet[i]; i++)
Uart_Printf("%d : %d\n", i, BaudSet[i]);
Uart_Printf("Please enter choice : ");
while(1)
{
int ch = Uart_Getch();
if(ch<='6'||ch>='0')
{
SERIAL_BAUD = BaudSet[ch-'0'];
Uart_Printf("Baud rate set to : %d\nPress any key to continue\n", SERIAL_BAUD);
i = 0x4000;
while(i--); //wait transmit end
Uart_Init(0,SERIAL_BAUD);
Uart_Getch();
break;
}
}
return 0;
}
/*******************************************************************************************************/
int SetIpAddr(int argc, char *argv[])
{
int i, j, err = 0;
char *str;
char ch = '.';
if(argc<2)
{
Uart_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] = strtodec(str, i);
if(ip[j]<0||ip[j]>254||err)
{
Uart_Printf("IP address error\n");
return -1;
}
str += i+1;
}
Uart_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];
locnode.ip = IP_ADDRESS;
ArpInit();
return 0;
}
int LoadFromNet(int argc, char *argv[])
{
unsigned char key;
if(argc<2)
download_addr = DFT_DOWNLOAD_ADDR;
else {
unsigned long tmp;
tmp = strtoul((unsigned char*)argv[1]);
download_addr = (tmp==-1)?download_addr:tmp;
}
ResetNic();
Uart_Printf("Now begin address for download, use address 0x%x\n", download_addr);
Uart_Printf("Load image file from host\n");
Uart_Printf("Type tftp -i %d.%d.%d.%d put filename at the host PC\n", (IP_ADDRESS>>24)&0xff, (IP_ADDRESS>>16)&0xff, (IP_ADDRESS>>8)&0xff, IP_ADDRESS&0xff);
Uart_Printf("Press ESC key to exit\n");
download_begin = 1;
download_end = 0;
while (1)
{
NetSever();
if ((key=Uart_GetKey())==ESC_KEY)
{
Uart_SendByte('\n');
download_begin = 0;
return -1;
}
if(download_end)
{
download_begin = 0;
download_end = 0;
return 0;
}
}
}
//*****************************************************************************
/******************************************************************************
【功能说明】将目标代码通过网口下载到SDRAM的默认下载地址,然后运行下载的目标代码
******************************************************************************/
int Net_Load_Run(int argc, char *argv[])
{
if(!LoadFromNet(argc, argv)) {
void (*fp)(void) = (void (*)(void))download_addr;
(*fp)();
}
return 0;
}
#define DNW_DOWNLOAD
#ifdef DNW_DOWNLOAD
//中断入口内容不可确定,不要用中断
int LoadFromUart(int argc, char *argv[])
{
int i, size;
unsigned short dnCS, CheckSum;
unsigned char *buf = (unsigned char *)DFT_DOWNLOAD_ADDR;
unsigned char RxTmp[8];
if(argc<2)
download_addr = DFT_DOWNLOAD_ADDR;
else {
unsigned long tmp;
tmp = strtoul((unsigned char*)argv[1]);
download_addr = (tmp==-1)?download_addr:tmp;
}
buf = (unsigned char *)download_addr;
printf("Now downloadfile from uart0 to 0x%x...\n", download_addr);
i = 0;
while(i<4)
RxTmp[i++] = getch();
i = 0;
size = *(unsigned long *)RxTmp - 4;
while(i<size)
buf[i++] = getch();
download_len = size-2;
printf("Download File Size = %x\n", download_len);
dnCS = (buf[size-1]<<8)|buf[size-2];
CheckSum = 0;
for(size -= 3; size>=0; size--)
CheckSum += buf[size];
if(dnCS!=CheckSum) {
// printf("get CS=0x%08x, cal CS=0x%08x\n", dnCS, CheckSum);
puts("CheckSum error!\n");
return -1;
}
puts("Dwonload success\n");
return 0;
}
#else
int LoadFromUart(int argc, char *argv[])
{
int start, time_out;
int load_addr = DFT_DOWNLOAD_ADDR;
if(argc>1)
{
start = strtoul((unsigned char*)argv[1]);
if(start>0)
load_addr = start;
}
start = load_addr;
time_out = WAIT_TIME;
do{
if(rUTRSTAT0&0x1)
{
*((unsigned char *)load_addr++) = Uart_GetKey();
time_out = WAIT_TIME;
}
}while(--time_out);
Uart_Printf("Received 0x%x bytes from serial port.\n", load_addr-start);
return 0;
}
#endif
//*****************************************************************************
/******************************************************************************
【功能说明】将目标代码通过串口下载到SDRAM,然后运行下载的目标代码
******************************************************************************/
int Uart_Load_Run(int argc, char *argv[])
{
// Uart_Printf( "Please send program [*.bin] from Uart :\n" );
if(!LoadFromUart(argc, argv)) {
void (*fp)(void) = (void (*)(void))download_addr;
(*fp)();
}
return 0;
}
//*****************************************************************************
int RunProgram(int argc, char *argv[])
{
void (*fp)(void) = (void (*)(void))DFT_DOWNLOAD_ADDR;
if(argc>1)
{
unsigned int p = strtoul((unsigned char *)argv[1]);
if((p!=-1)&&!(p&3))
fp = (void (*)(void))p;
}
Uart_Printf("Run program from 0x%x, are you sure?", fp);
if(!getyorn())
return 0;
(*fp)();
return 0;
}
int ProgFlash(int argc, char *argv[])
{
unsigned int size = ~0;
unsigned int data_begin = ~0;
unsigned int prog_begin = ~0;
unsigned int cache_cfg;
int overwrite0 = 1;
int modify_a0 = 0;
unsigned int bios_load_addr;
prog_begin = prog_s_addr;
data_begin = download_addr;
size = download_len;
if(!strncmp(argv[argc-1], "-no0", 5)) {
overwrite0 = 0;
argc--;
}
if(argc>1)
prog_begin = strtoul((unsigned char *)argv[1]);
if(argc>2)
data_begin = strtoul((unsigned char *)argv[2]);
if(argc>3)
size = strtoul((unsigned char *)argv[3]);
if((prog_begin==-1)||(data_begin==-1)) {
Uart_Printf("Arguments error!\n");
goto err_exit;
}
if(!size)
Uart_Printf("Write 0 Bytes!\n");
else {
Uart_Printf("program flash begin @0x%x, from ram data @0x%x, size = %dBytes\nAre you sure?", prog_begin, data_begin, size);
if(!getyorn())
return 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;
}
cache_cfg = rNCACHBE0;
rNCACHBE0 = 0x20000000;
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);
}
rNCACHBE0 = cache_cfg;
}
return 0;
err_exit:
Uart_Printf("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;
}
//*****************************************************************************
/******************************************************************************
【功能说明】通过TFTP软件,将目标代码通过以太网下载的SDRAM,然后将下载的代码烧写
到Flash中去,不过在Flash最低地址放置了跳转到BIOS的跳转指令,适合于烧写应用程序
******************************************************************************/
int APP_Auto_Prog_Flash(int argc, char *argv[])
{
char ch_tmp[3][10];
char *para_ptr[5];
int (*DnProg)(int argc, char *argv[]) = LoadFromNet;
int prog_bios = 0;
if(argc>1) {
if(strncmp(argv[1], "-b", 3)==0)
prog_bios = 1;
else if(strncmp(argv[1], "-c", 3)==0)
DnProg = LoadFromUart;
else
goto err_exit;
if(argc>2) {
if(strncmp(argv[2], "-b", 3)==0)
prog_bios = 1;
else if(strncmp(argv[2], "-c", 3)==0)
DnProg = LoadFromUart;
else
goto err_exit;
}
}
if((DnProg)(0, NULL))
return 0;
ultostr((unsigned char *)ch_tmp[0], 0);
ultostr((unsigned char *)ch_tmp[1], download_addr);
ultostr((unsigned char *)ch_tmp[2], download_len);
para_ptr[1] = ch_tmp[0];
para_ptr[2] = ch_tmp[1];
para_ptr[3] = ch_tmp[2];
para_ptr[4] = prog_bios?"-no0":NULL;
ProgFlash(prog_bios?5:4, para_ptr);
return 0;
err_exit:
Uart_Printf("Usage ap [-b] [-c]\n-b for bios\n-c download by uart\n");
return -1;
}
//*****************************************************************************
int CopyFlash(int argc, char *argv[])
{
unsigned int src, dst, size;
unsigned int cache_cfg;
char tmp[10];
if(argc<4)
{
Uart_Printf("Usage : copy a1 a2 size\n");
Uart_Printf("a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n");
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -