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

📄 cmd.c

📁 自己写的一个基于kb9202开发板的bootloader
💻 C
字号:
#include "pstring.h"#include "cmd.h"#include "uart.h"#include "xmodem.h"#include "at91rm9200.h"void list_cmd(void);void led_blink(void);void get_file(void);void exec_file(void);func_p cmd_proc[] = { list_cmd, led_blink, get_file, exec_file };cmd_map cmd_array[]={	{ LIST_CMD,  "list"  },	{ LED_BLINK, "led"   },	{ GET_FILE,  "get"   },	{ EXEC_FILE, "exec"  }};char *error_msg[]={	"Command Out Of Length\r\n",	"No Available Command Matching\r\n",	"Parameter not suitable\r\n"};char cmd_line[CMDLN_SZ];char* argv[PARAM_SZ];int argc;int div_cmd(){	int i=0, state=0;	/* the state denote whether the param begins */	p_memset( (char *)argv, 0, sizeof(argv) );	argc = 0;	while( cmd_line[i]!='\0' ){		if( state ){			if( p_IsWhiteSpace( cmd_line[i] ) ){				cmd_line[i]='\0';				state = 0;			}		} else {			if( !p_IsWhiteSpace( cmd_line[i] ) ){				if( argc>=PARAM_SZ )					return 0;				argv[argc++] = &cmd_line[i];				state = 1;			}		}		i++;	}	return 1;}int get_cmd(){	int i=0;	char c;	while(1){		c=get_char();		if( c<8 || (c>13 && c<32) )			continue;		if( c==0x8 ){					//backspace			if(i>0){				put_char(c);				put_char((char)0x20);	//space				put_char(c);				i--;			}			continue;		}		if( c==0xd ){					//next line			put_char((char)0xd);			put_char((char)0xa);			break;		}		put_char(c);		if( i<CMDLN_SZ-1 )			cmd_line[i]=c;		i++;	}	if( i<CMDLN_SZ ){		cmd_line[i]='\0';					//add an end-char		return 1;	} else		return 0;}int parse_cmd( ){	int i, cmd;	cmd = sizeof(cmd_array)/sizeof(cmd_map);	if( !div_cmd() )		return -2;	for(i=0; i<cmd; i++)		if( p_strcmp( argv[0], cmd_array[i].cmdline ) )			return cmd_array[i].command;	return -1;}void list_cmd(){	int i, cmd;	if( argc>1 ){		put_s( error_msg[2] );		return;	}	cmd = sizeof(cmd_array)/sizeof(cmd_map);	for(i=0;i<cmd;i++){		put_char('\t');		put_s(cmd_array[i].cmdline);		put_s("\r\n");	}}void led_blink(){	int value;	pio_reg_p pioc = (pio_reg_s *)PIOC_BASE;	char *state[2]={"on","off",};	if( argc!=2 ){		put_s( error_msg[2] );		return;	}	value = LED1 | LED2 | LED3;	if( p_strcmp(state[0],argv[1]) )		pioc->pio_codr = value;	else if( p_strcmp(state[1],argv[1]) )		pioc->pio_sodr = value;	else		put_s(error_msg[2]);}void get_file(){	int i;	unsigned *mem_start = (unsigned *)0x2000a000;	tc_reg_p tc0 = (tc_reg_s *)TC0_BASE;	tc0->tcc[0].tc_ccr = 1<<TC_CLKEN;	tc0->tcc[0].tc_ccr = 1<<TC_SWTRG;	i = x_receive(mem_start);	tc0->tcc[0].tc_ccr = 1<<TC_CLKDIS;	if(i)		put_s("\r\ntransfer successful\r\n");	else		put_s("\r\ntransfer failed\r\n");	}void exec_file(){	__asm__(		"ldr pc,[pc,#-0x4]\n\t"		".long 0x2000a000\n\t"	);}void cmd_loop(){	int cmd;	put_s("\ ****************************************************************************\r\n\ *                              hello, welcome!                             *\r\n\ *                         this is bootloader v1.00                         *\r\n\ *                        for kb9202 over at91rm9200                        *\r\n\ ****************************************************************************\r\n"	);	while( 1 ){		put_char('#');		if( !get_cmd() ){			put_s( error_msg[0] );			continue;		}		cmd = parse_cmd();		if( cmd==-1 )			put_s( error_msg[1] );		else if( cmd==-2 )			put_s( error_msg[2] );		else			cmd_proc[cmd]();	}}		

⌨️ 快捷键说明

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