shell.c
来自「通过串口实现的CLI界面。在超级终端中实现界面的显示。支持命令记录和带多参数。功」· C语言 代码 · 共 1,427 行 · 第 1/3 页
C
1,427 行
INT32S BootLoader(INT32S argc, INT8S *argv[])
{
#if 0
INT8U key;
Uart_PrINT32Sf("boot from flash, are you sure? [y/n]");
while(1)
{
key = urtReadyGet();
if(key)
{
if(key=='y'||key=='Y')
{
void (*fp)(void) =(void (*)(void))BIOS_LOAD;
Uart_SendByte(key);
Uart_SendByte('\n');
(*fp)();
}
if(key=='n'||key=='N')
{
Uart_SendByte(key);
Uart_SendByte('\n');
break;
}
}
}
#endif
urtPrintf("->New bootLoader running ok!!\n");
return 0;
}
INT32S BackupBios(INT32S argc, INT8S *argv[])
{
#if 0
INT8U key;
INT32U cache_cfg;
Uart_PrINT32Sf("move bios to the top of rom,are you sure? [y/n]");
while(1)
{
key = urtReadyGet();
if(key)
{
if(key=='y'||key=='Y')
{
Uart_SendByte(key);
Uart_SendByte('\n');
break;
}
if(key=='n'||key=='N')
{
Uart_SendByte(key);
Uart_SendByte('\n');
return 0;
}
}
}
cache_cfg = rNCACHBE0;
rNCACHBE0 = 0x20000000;
FlashRead(0, (INT16U *)DFT_DOWNLOAD_ADDR, 0xf000);
SectorProg(BIOS_BASE, (INT16U *)DFT_DOWNLOAD_ADDR, 0xf000);
rNCACHBE0 = cache_cfg;
#endif
urtPrintf("->New BackUpBios running ok!!\n");
return 0;
}
INT32S MemoryDisplay(INT32S argc, INT8S*argv[])
{
#if 0
INT32U sys_cfg;
INT32U src;
INT32U i, j;
INT32U *data;
if(argc < 2)
src = 0;
else
{
src = strtoul((INT8U *)argv[1]);
if(src%4 != 0) src-=src%4;
}
data = (INT32U *)src;
urtPrintf("0x%8.8x: ",data);
sys_cfg = rSYSCFG;
rSYSCFG = 0x08;
for(i=0;i<22;i++)
{
for(j=0;j<4;j++)
urtPrintf("%8.8x ",*data++);
if(i<21)
urtPrintf("\n0x%8.8x: ",data);
}
urtPutChar('\n');
rSYSCFG = sys_cfg;
#endif
urtPrintf("->Memory Display running ok!!\n");
return 0;
}
INT32S Flash2Mem(INT32S argc, INT8S*argv[])
{
#if 0
INT32U src, dst, size, i;
INT32U cache_cfg;
INT32U *data_src, *data_dst;
if(argc<4)
{
urtPrintf("Usage : move a1 a2 size\n");
urtPrintf("a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n");
return -1;
}
src = strtoul((INT8U *)argv[1]);
dst = strtoul((INT8U *)argv[2]);
size = strtoul((INT8U *)argv[3]);
if(src==-1||dst==-1||size==-1||(dst-size)<src)
{
urtPrintf("give error address\n");
return -1;
}
data_src = (INT32U *)src;
data_dst = (INT32U *)dst;
cache_cfg = rNCACHBE0;
rNCACHBE0 = 0x20000000;
size = size%4 ? size/4+1 : size/4;
for(i=0;i<size;i++)
*data_dst++ = *data_src++;
rNCACHBE0 = cache_cfg;
urtPrintf("move finished!\n");
#endif
urtPrintf("->Flash2mem running ok!!\n");
return 0;
}
INT32S SaveEnv(INT32S argc, INT8S*argv[])
{
#if 0
INT32U * pdata;
INT32U cache_cfg;
cache_cfg = rNCACHBE0;
rNCACHBE0 = 0x20000000;
pdata = (INT32U*)(DFT_DOWNLOAD_ADDR+ENV_ADD);
FlashRead(FlashSector(BIOS_LOAD), (INT16U *)(DFT_DOWNLOAD_ADDR), SECTOR_SIZE);
*pdata++ = IP_ADDRESS;
*pdata++ = GATE_ADDRESS;
*pdata++ = MASK_ADDRESS;
*pdata++ = SERIAL_BAUD;
*pdata++ = MCLK_M;
*pdata++ = MCLK_P;
*pdata++ = MCLK_S;
SectorProg(FlashSector(BIOS_LOAD), (INT16U *)(DFT_DOWNLOAD_ADDR), SECTOR_SIZE);
rNCACHBE0 = cache_cfg;
#endif
urtPrintf("->New SaveEnv running ok!!\n");
return 0;
}
INT32S LoadEnv(INT32S argc, INT8S*argv[])
{
#if 0
INT32U * pdata;
INT32U cache_cfg;
INT32U t_ip, t_gate, t_mask, t_baud, t_mclk;
INT8U t_m, t_p, t_s, tt_s;
INT8U key;
INT32S i = 1;
cache_cfg = rNCACHBE0;
rNCACHBE0 = 0x20000000;
pdata = (INT32U*)(DFT_DOWNLOAD_ADDR+ENV_ADD);
FlashRead(FlashSector(BIOS_LOAD), (INT16U *)(DFT_DOWNLOAD_ADDR), SECTOR_SIZE);
rNCACHBE0 = cache_cfg;
t_ip = *pdata++;
t_gate = *pdata++;
t_mask = *pdata++;
t_baud = *pdata++;
t_m = *pdata++;
t_p = *pdata++;
t_s = *pdata++;
tt_s = t_s;
while(tt_s--)
i *= 2;
t_mclk= (EXT_OSC_CLK*(t_m+8))/((t_p+2)*i);
Uart_PrINT32Sf("IP address : %u.%u.%u.%u\n", (t_ip>>24)&0xff, (t_ip>>16)&0xff, (t_ip>>8)&0xff, t_ip&0xff);
Uart_PrINT32Sf("IP address : %u.%u.%u.%u\n", (t_gate>>24)&0xff, (t_gate>>16)&0xff, (t_gate>>8)&0xff, t_gate&0xff);
Uart_PrINT32Sf("IP address : %u.%u.%u.%u\n", (t_mask>>24)&0xff, (t_mask>>16)&0xff, (t_mask>>8)&0xff, t_mask&0xff);
Uart_PrINT32Sf("Serial baud : %d\n", t_baud);
Uart_PrINT32Sf("Clock : %dHz\n", t_mclk);
Uart_PrINT32Sf("Load enviroment value from flash [y/n]");
while(1)
{
key = urtReadyGet();
if(key)
{
if(key=='y'||key=='Y')
{
Uart_SendByte(key);
Uart_SendByte('\n');
break;
}
if(key=='n'||key=='N')
{
Uart_SendByte(key);
Uart_SendByte('\n');
return 0;
}
}
}
locnode.ip = IP_ADDRESS = t_ip;
locnode.gate = GATE_ADDRESS = t_gate;
locnode.mask = MASK_ADDRESS = t_mask;
MCLK_M = t_m; MCLK_P = t_p; MCLK_S = t_s;
SERIAL_BAUD = t_baud;
i = 8000;
while(i--);
ChangePllValue(MCLK_M, MCLK_P, MCLK_S);
i = 8000;
while(i--);
Uart_Init(0,SERIAL_BAUD);
Uart_Getch();
#endif
urtPrintf("->New LoadEnv running ok!!\n");
return 0;
}
INT32S progToFlash(INT32S argc, INT8S *argv[])
{
INT32S adrsTmp;
INT32S adrsTemp,lenghTemp;
/*INT32U prgflg = PROG_FLAG;*/
switch(argc){
case 1:
if (downloadLen <0x1000)
{
urtPrintf("\n->No application code in ram!!\n");
return FAIL;
}
urtPrintf("\nProgStart\n");
SectorProg(PROG_APP_ADRS,( INT16U *)downloadAdrs, downloadLen);
urtPrintf("\nStart Adrs->:0x%X,Src Adrs->:0x%X,App Size->:0x%X\n",PROG_APP_ADRS,downloadAdrs,downloadLen);
return PASS;
break;
case 2:
if (downloadLen <0x1000)
{
urtPrintf("\n->No application code in ram!!\n");
return FAIL;
}
adrsTmp = strtoul((INT8U*)argv[1]);
SectorProg(adrsTmp,( INT16U *)downloadAdrs, downloadLen);
urtPrintf("\nStart Adrs->:0x%X,Src Adrs->:0x%X,App Size->:0x%X\n",adrsTmp,downloadAdrs,downloadLen);
return PASS;
break;
case 3:
adrsTemp = strtoul((INT8U*)argv[1]);
lenghTemp = strtoul((INT8U*)argv[2]);
SectorProg(adrsTmp,( INT16U *)downloadAdrs, lenghTemp);
urtPrintf("\nStart Adrs->:0x%X,Src Adrs->:0x%X,App Size->:0x%X\n",adrsTemp,downloadAdrs,lenghTemp);
return PASS;
break;
default :
urtPrintf("\nBad command detect!!\n");
urtPrintf("->try burn [start address] [size]!!\n\n");
return FAIL;
break;
}
return PASS;
}
INT32S XmodemClient_t(INT32S argc, INT8S *argv[])
{
if (argc <2){
downloadAdrs = DFT_DOWNLOAD_ADDR;
downloadLen = xmodemReceive((unsigned char *)downloadAdrs, DOWNLOAD_BUF_SIZE);
urtPrintf("-->downlen is ->:0x%X\n",downloadLen);
urtPrintf("-->downlen is ->:%d\n",downloadLen);
return downloadLen;
}
else
{
urtPrintf("\n->No this command!!\n");
return -1;
}
return -2;
}
INT32S tProgBack(INT32S argc, INT8S *argv[])
{
INT32U tStart,tSize;
switch(argc){
case 1:
if(downloadLen < 0x100)
/* downloadLen = VXWORKS_SIZE - BOOT_SIZE;*/
{
urtPrintf("\n->No image !!\n");
urtPrintf("->try sback [start address] [size]!!\n\n");
}
else
{
xmodemTransmit((unsigned char *)(PROG_APP_ADRS), downloadLen);
urtPrintf("\n-->Transfer start adrs ->:0x%x\n-->Transfer size is ->:0x%X\n\n",PROG_APP_ADRS,downloadLen);
}
break;
case 2:
urtPrintf("\n-->No this Command\n");
urtPrintf("->try sback [start address] [size]!!\n\n");
break;
case 3:
tStart = strtoul((INT8U*)argv[1]);
tSize = strtoul((INT8U*)argv[2]);
xmodemTransmit((unsigned char *)(tStart),tSize);
urtPrintf("\n->Transfer start adrs ->:0x%x\n-->Transfer size is ->:0x%X\n\n",tStart,tSize);
break;
default :
urtPrintf("\nBad command detect!!\n");
urtPrintf("->try sback [start address] [size]!!\n\n");
break;
}
return PASS;
}
INT32S autoProg(INT32U adrs)
{
downloadLen = xmodemReceive((unsigned char *)downloadAdrs, DOWNLOAD_BUF_SIZE);
urtPrintf("-->DownLoad lenght is ->:0x%X\n",downloadLen);
urtPrintf("-->DownLoad Address is ->:0x%X\n", adrs);
urtPrintf("-->Flash Burn is starting now...!! \n");
SectorProg(adrs,( INT16U *)downloadAdrs, downloadLen);
urtPrintf("-->Auto burn finished.. !!\n");
return PASS;
}
INT32S autoProgShell(INT32S argc, INT8S *argv[])
{
autoProg(PROG_APP_ADRS);
return PASS;
}
INT32S earseAllExceptBios(INT32S argc, INT8S *argv[])
{
INT32U sectorMax,i;
sectorMax = (MAX_FLASH_SIZE - (PROG_APP_ADRS - 0x1000000)) / ALL_FLASH_SECTOR_SIZE;
urtPrintf("\n Erased!");
for(i = 0; i < sectorMax ; i++)
{
if( 0 ==flash_erase((volatile INT16U *)(PROG_APP_ADRS + ALL_FLASH_SECTOR_SIZE * i))){
urtPrintf("\n->erase error @adrs:0x%X\n",(PROG_APP_ADRS + ALL_FLASH_SECTOR_SIZE * i));
return FAIL;
}
urtPrintf("\r%3d%%",(i * 100) / (sectorMax - 1) );
}
urtPrintf("\nFlash erase finished!!\n");
return PASS;
}
INT32S runApp(INT32S argc, INT8S *argv[])
{
extern void (*callApp)();
switch (argc){
case 1:
if(*(INT32U*)PROG_APP_ADRS !=0xFFFFFFFF)
{
urtPrintf("->Application code is running now...\n");
callApp();
}
urtPrintf("\nNo App code but 0x%X found!!\n",*(INT32U*)PROG_APP_ADRS);
break;
case 2:
if(*(INT32U*)(strtoul((INT8U*)argv[1])) !=0xFFFFFFFF)
(*(void(*)())(strtoul((INT8U*)argv[1])))();
urtPrintf("\nNo App code but 0x%X found!!\n",*(INT32U*)PROG_APP_ADRS);
break;
default:
urtPrintf("\n->bad command detect!\n");
urtPrintf("->try runapp [app address]\n\n");
break;
}
return PASS;
}
#ifdef __dbgShell
INT32S resetRun(INT32S argc, INT8S *argv[])
{
setBuf(getBuf(TMOD) & 0xfe, TMOD );
urtPrintf("\n->system will reset in seconds..!!\n");
return PASS;
}
#endif
INT32S GetParameter(INT8U *str, INT32S cnt,INT8U k)
{
INT32S i, key;
i = 0;
while(1)
{
key = urtGetChar();
if(key)
{
if(key == ENTER_KEY)
{
str[i] = 0;
return i;
}
else if(key == BACK_KEY && i>0)
{
i--;
urtPrintf("\b \b");
}
else if(key == 0x1b)
{
urtGetChar();
urtGetChar();
}
else if(key>=0x20 && key<=0x7e && i<cnt)
{
str[i++] = key;
if(k == '*')
urtPutChar('*');
else
urtPutChar(key);
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?