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 + -
显示快捷键?