⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 command.c

📁 LPC2220的Bootloader自己写的,和 周立功的模版实现完全不一样
💻 C
📖 第 1 页 / 共 2 页
字号:
//***************************************************************
//  ARM BOOT ROUTE VER1.0@0x0C000000 for 44B0X release
//  bjwork@po-star.com
//  chenjun @ 2005-6-10
//***************************************************************

#include "..\inc\command.h"
#include "..\inc\common.h"
#include "..\inc\utilities.h"
#include "..\inc\sysinit.h"
#include "..\inc\usart.h"
#include "..\inc\NorFlash.h"
#include "..\inc\watchdog.h"

// command default
int List(int argc, char *argv[]);
int ShowMemory(int argc, char *argv[]);
int LoadFromUart(int argc, char *argv[]);
int UploadFromUart(int argc, char *argv[]);
int ComRun(int argc, char *argv[]);
int RunProgram(int argc, char *argv[]);
int Check(int argc, char *argv[]);
int FillMemory(int argc, char *argv[]);
int Mcopy(int argc, char *argv[]);
int Mcut(int argc, char *argv[]);
int Changemclk(int argc, char *argv[]);
int ModifyReg(int argc, char *argv[]);
int Batch(int argc, char *argv[]);
int DelayTime(int argc, char *argv[]);
int RDFlash(int argc, char *argv[]);
int EraseFlashChip(int argc, char *argv[]);
int ProgFlash(int argc, char *argv[]);
int AutoProgFlash(int argc, char *argv[]);
int ResetBoard(int argc, char *argv[]);
int ProgAPPBoot(int argc, char *argv[]);
int ProgAPP(int argc, char *argv[]);

typedef int (*cmdproc)(int argc, char *argv[]);

typedef struct {
	char *command;
	char *cmdclass;
	cmdproc proc;
}CMD_STRUC;

CMD_STRUC CMD_INNER[] ={
	 	{"ls",			"sys",		List},
		{"disp",		"sys",		ShowMemory},
		{"run",			"sys",		RunProgram},
		{"reset",		"sys",		ResetBoard},
		{"comload",		"com",		LoadFromUart},
		{"comupld",		"com",		UploadFromUart},
		{"comrun",		"com",		ComRun},
		{"bcheck",      "ram",      Check},
		{"fill",        "ram",      FillMemory},
		{"memcopy",     "ram",      Mcopy},
		{"memcut",      "ram",      Mcut},
		{"mclk",        "sys",      Changemclk},
		{"modadd",      "sys",      ModifyReg},
		{"batch",		"sys",      Batch},
		{"delay",		"sys",      DelayTime},
		{"rdpf",		"flash",	RDFlash},
		{"erspf",		"flash",	EraseFlashChip},
		{"progpf",		"flash",	ProgFlash},
		{"fdpf",		"flash",	AutoProgFlash},	
		{"fdpab",		"flash",	ProgAPPBoot},
		{"fdpap",		"flash",	ProgAPP},
		{NULL, NULL, NULL}
		};


/////////////////////////////////// ctrl route ////////////////////////////////
void ParseArgs(char *cmdline, int *argc, char **argv)
{
#define STATE_WHITESPACE	0
#define STATE_WORD			1

	char *c;
	int state = STATE_WHITESPACE;
	int i;

	*argc = 0;

	if(strlen(cmdline) == 0)
		return;

	/* convert all tabs into single spaces */
	c = cmdline;
	while(*c != '\0')
	{
		if(*c == '\t')
			*c = ' ';
		c++;
	}
	
	c = cmdline;
	i = 0;

	/* now find all words on the command line */ 
	while(*c != '\0')
	{
		if(state == STATE_WHITESPACE)
		{
			if(*c != ' ')
			{
				argv[i] = c;		//将argv[i]指向c
				i++;
				state = STATE_WORD;
			}
		}
		else
		{ /* state == STATE_WORD */
			if(*c == ' ')
			{
				*c = '\0';
				state = STATE_WHITESPACE;
			}
		}
		c++;
	}
	
	*argc = i;
	
#undef STATE_WHITESPACE
#undef STATE_WORD
}

int GetCmdMatche(char *cmdline)
{
	int i;	
	
	for(i=0; CMD_INNER[i].command!=NULL; i++)
	{
		if(strncmp(CMD_INNER[i].command, cmdline)==0)
			return i;
	}
	
	return -1;
}

int ParseCmd(char *cmdline, int cmd_len)
{
	int argc,num_commands;
	char *argv[MAX_ARGS];

	ParseArgs(cmdline, &argc, argv);

	/* only whitespace */
	if(argc == 0) 
		return 0;
	
	num_commands = GetCmdMatche(argv[0]);
	if(num_commands<0)
	{	return -1;	}
		
	if(CMD_INNER[num_commands].proc!=NULL)	
	{	CMD_INNER[num_commands].proc(argc, argv);	}
	
	return 0;			
}

void console(void)
{
	unsigned char i;
	char key;
	int tmp;
	char command[MAX_CMD_LEN];
	
	i = 0;
	for(;;)
	{
		if(kbhit())
		{
			key = getkey();
			if(key == '\b')
			{	
				if(i>0)
					i--;
			}
			else
			if(key == '\r')
			{
				command[i] = 0;
				putch('\n');
				tmp = ParseCmd(command, i);
				if(tmp<0)
					puts("Bad command\n");
				prompt();
				i = 0;
			}
			else
			{
				if(i<MAX_CMD_LEN-1)
				{
					command[i++] = key;
					putch(key);
				}
			}				
		}
	}
}

///////////////////////////////// command route //////////////////////////////
int List(int argc, char *argv[])
{
	int i,j;	
	
	j = 0;
	
	for(i=0; CMD_INNER[i].command!=NULL; i++)
	{
	   j++;
	}
	
	putch('\n');
	for(i=0; i<j; i++)
	{
		puts(CMD_INNER[i].command);
			puts("		");
			if ((i & 0x3) == 0x3)
			  { putch('\n');}
	}
	if ((j % 4) == 0)
	    putch('\n');
	else 
	    puts("\n\n");    

	return 0;
}

int LoadFromUart(int argc, char *argv[])
{
	unsigned int start;
	unsigned int time_out;
	int load_addr;		
	
	if(argc < 2)
    {
 		puts("Usage: comload <RamStartAdd>\n");
		puts("       RamStartAdd = download begin address from RAM\n");
		puts("       RamBase = 0x0c00_0000\n");
		puts("Version:  V1.0    by chenjun 2005.4.5\n\n");
		return 1;
    }
    
	start = (unsigned int)strtoul(argv[1]);	
	load_addr = start;
    printf("download data @0x%x\n", load_addr);	
	time_out = 0xffffffff;	
	do{
		if(kbhit())
		{
			*((unsigned char *)load_addr++) = getkey();
			time_out = 0x10000;
		}
	  }while(--time_out);
	
	printf("Received 0x%x(%d) bytes from usart!\n", load_addr-start, load_addr-start);
	
	return 0;

}

int UploadFromUart(int argc, char *argv[])
{
	unsigned int start;
	unsigned int size;	
	unsigned int i;
	
	if(argc < 3)
    {
 		puts("Usage: comupld <RamStartAdd> <Size>\n");
		puts("       RamStartAdd = download begin address from RAM\n");
		puts("       RamBase = 0x0c00_0000\n");
		puts("Version:  V1.0    by chenjun 2005.6.11\n\n");
		return 1;
    }	
    start = (unsigned int)strtoul(argv[1]);
    size = (unsigned int)strtoul(argv[2]);
    
    puts("Press any key to start unload!\n");
    	
    while(1)
	{
		if(kbhit())
		{break;}
	}
    
    Delay(1000000);  //delay for pc size program prepare to autocapture  
    
    for(i=0;i<size;i++)
    {
		sendbyte(Uart0,*((unsigned char *)(start+i)));
    }
    
    Delay(39000000); //delay for pc size program timeout to terminate autocapture
    
	return 0;
}

int ComRun(int argc, char *argv[])
{
	unsigned int load_addr;
	unsigned int time_out;
	void (*fp)(void);
	
	load_addr = 0x82000000;
    puts("Pls send your newcode for test!@ sdram addr:0x8200_0000\n");	
	time_out = 0xffffffff;	
	do{
		if(kbhit())
		{
			*((unsigned char *)load_addr++) = getkey();
			time_out = 0x10000;
		}
	  }while(--time_out);
	  
	fp = (void (*)(void))(0x0);
	(*fp)();
		
	return 0;
}

int ShowMemory(int argc, char *argv[])
{	
	unsigned int startadd;
	unsigned int tempadd,tempadd2;
	unsigned int tempvalue;
	unsigned char tempchar;
	unsigned char dispmode;
	unsigned char i,k;
    
    dispmode = (unsigned char)((strtoul(argv[2])) & 0xff);
	startadd = (unsigned int)((strtoul(argv[1])) & 0xfffffff0);
	
	if(argc < 3)
    { 
		puts("Usage: disp <RamStartAdd> <Org>\n");
		puts("       Org = 0:Byte mode,other value:Word mode\n");
		puts("Version:  V2.2    by chenjun 2005.4.7\n\n");
		return 1;
    }
	
	if (startadd > startadd + 0x80) 
	    {tempadd = (0xffffffff - (startadd - 1));}
	else
	    {tempadd = 0x80;}
	    
    if (dispmode == 0)//8bit display
        {
			puts("--------------------------------------------------------------------------------\n");
			for (tempadd2 = 0;tempadd2 < tempadd;tempadd2 += 4)
			{
				tempvalue = *((unsigned int *)(startadd + tempadd2));
				if ((tempadd2 & 0x0f) == 0)
				{    printf("0x%.8x   %.2x %.2x %.2x %.2x",startadd + tempadd2,tempvalue & 0xff,
				    (tempvalue >> 8) & 0xff,(tempvalue >> 16) & 0xff,(tempvalue >> 24) & 0xff);	}
				else if ((tempadd2 & 0x0f) == 4)
				{    printf(" %.2x %.2x %.2x %.2x",tempvalue & 0xff,(tempvalue >> 8) & 0xff,
				    (tempvalue >> 16) & 0xff,(tempvalue >> 24) & 0xff);	}
				else if ((tempadd2 & 0x0f) == 8)
				{    printf("-%.2x %.2x %.2x %.2x",tempvalue & 0xff,(tempvalue >> 8) & 0xff,
				    (tempvalue >> 16) & 0xff,(tempvalue >> 24) & 0xff);	}
				else if ((tempadd2 & 0x0f) == 0x0c)
				{   printf(" %.2x %.2x %.2x %.2x   ",tempvalue & 0xff,(tempvalue >> 8) & 0xff,
				    (tempvalue >> 16) & 0xff,(tempvalue >> 24) & 0xff);	
					for(k=4;k>0;k--) 
					{
						tempvalue = *((unsigned int *)((startadd + tempadd2)-(k-1)*4));
						for(i=0;i<4;i++)
						{	
							tempchar =(unsigned char)(tempvalue & 0xff);
							if ((tempchar<32)|(tempchar>126))
								{putch(46);}
							else
								{putch(tempchar);} 
							tempvalue >>= 8;
						}
					}
					puts("\r\n");
				}
			}
			putch('\n');	
    	}
    else  //32bit display
        {	
    		puts("------------------------------------------------------\n");
    		for (tempadd2 = 0;tempadd2 < tempadd;tempadd2 += 4)
    		{
    			tempvalue = *((unsigned int *)(startadd + tempadd2));
    			if ((tempadd2 & 0x0f) == 0)
    			{printf("0x%.8x   %.8x   ",startadd + tempadd2,tempvalue);}
    			else if ((tempadd2 & 0x0f) == 0x0c)
    			{printf("%.8x\n",tempvalue);}
    			else
    			{printf("%.8x   ",tempvalue);}
    		}
    		putch('\n');	
        } 
    return 0;    
}


int RunProgram(int argc, char *argv[])
{
	unsigned int p;
	void (*fp)(void);
	char key;
	
	if(argc>1)
	{
		p = (unsigned int)strtoul(argv[1]);
		fp = (void (*)(void))p;			
	}
	else
	{
 		puts("Usage: run <RamAdd>\n");
		puts("Version:  V2.0    by chenjun 2005.4.5\n\n");
		return 1;
    }
	printf("Run program from 0x%x, are you sure? [y/n]", fp);
    	
    while(1)
    	{
    		if(kbhit())
    		{
    			key = getkey();
    			if(key=='y'||key=='Y')
    			{
    				putch(key);
    				putch('\n');
    				break;
    			}
    			if(key=='n'||key=='N')
    			{
    				putch(key);
    				putch('\n');
    				return 0;
    			}				
    		}
    	}
	(*fp)();
	
	return 0;		
}

int Check(int argc, char *argv[])
{
    if(argc < 4)
    {
 		puts("Usage: bcheck <block1Add> <block2Add> <Size>\n");
		puts("Version:  V1.0    by chenjun 2005.4.6\n\n");
		return 1;
    }
    MemoryBlockCheck((unsigned int)strtoul(argv[1]),(unsigned int)strtoul(argv[2]),(unsigned int)strtoul(argv[3]));
    return 0;
}

int FillMemory(int argc, char *argv[])
{
    if(argc < 5)
    {
 		puts("Usage: fill <RamStartAdd> <Size> <Value> <Org>\n");
		puts("       Org = 1:Byte,2:Halfword,4:Word,other value will be reset to 1\n");
		puts("Version:  V1.0    by chenjun 2005.4.5\n\n");
		return 1;
    }
    Memoryfill((unsigned int)strtoul(argv[1]),(unsigned int)strtoul(argv[2]),(unsigned int)strtoul(argv[3]),(unsigned char)(strtoul(argv[4]) & 0xff));    
	return 0;
}

int Mcopy(int argc, char *argv[])
{
    if(argc < 4)
    { 
		puts("Usage: memcopy <block1Add> <block2Add> <Size>\n");
		puts("Version:  V1.1    by chenjun 2005.4.7\n\n");
		return 1;
    }
    MemoryCopy((unsigned int)strtoul(argv[1]),(unsigned int)strtoul(argv[2]),(unsigned int)strtoul(argv[3]));
    return 0;
}

int Mcut(int argc, char *argv[])
{
    if(argc < 4)
    { 
		puts("Usage: memcut <block1Add> <block2Add> <Size>\n");
		puts("Version:  V1.1    by chenjun 2005.4.7\n\n");
		return 1;
    }   
    MemoryCopy((unsigned int)strtoul(argv[1]),(unsigned int)strtoul(argv[2]),(unsigned int)strtoul(argv[3]));
    Memoryfill((unsigned int)strtoul(argv[1]),(unsigned int)strtoul(argv[3]),0,0);
    puts("block cut successfilly!\n");
    return 0;
}

int Changemclk(int argc, char *argv[])
{
	unsigned char mdiv,pdiv,sdiv;

	if(argc < 4)
    {
		puts("Usage: mclk <mdiv> <pdiv>\n");
		puts("       MCLK = (EXT_OSC_CLK * (mdiv+8)) / ((pdiv+2) * (2 ^ sdiv))\n");
		printf("       Current MCLK = %dHz\n", MCLK);
		puts("Version:  V1.0    by chenjun 2005.4.5\n\n");
		
		return 1;
    }

	mdiv = (unsigned char)(strtoul(argv[1]) & 0xff);
	pdiv = (unsigned char)(strtoul(argv[2]) & 0xff);
	sdiv = (unsigned char)(strtoul(argv[3]) & 0xff);
    Delay(10000);
    SetPll(mdiv,pdiv);
    Delay(10000);
    ConsoleInit();
    Delay(10000);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -