📄 cmd.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 + -