📄 cmd.c
字号:
#include <string.h>
#include "mylib.h"
#include "cmd.h"
#include "ymodem.h"
typedef void (* CMDFUNC)(char [][50], int pcount);
typedef struct _cmdnum {
char *cmd;
int paramcount;
CMDFUNC callback;
char *helptxt;
} CMDNUM, *PCMDNUM;
/*NORFLASH 操作函数*/
void NOR_Write(char cmd[][50], int cmdnum);
void NOR_Read(char cmd[][50], int cmdnum);
void NOR_delete(char cmd[][50], int cmdnum);
void GoToAddr_run(char cmd[][50], int cmdnum);
CMDNUM cmdlist[] = {
{"help", 0, showhelp, "help -> show help text\r\n"},
{"setm", 1, set_downaddr, "setm addr -> set download and wirte address(hex) in SDARM\r\n"},
{"show", 2, SDRAM_Show, "show addr len -> show download data\r\n"},
{"ym", 0, Ymodem_download, "ym -> download by ymodem\r\n"},
{"norw", 1, NOR_Write, "norw addr -> write to norflash form sdram\r\n"},
{"norr", 2, NOR_Read, "norr addr len -> read from norflash to sdram\r\n"},
{"nord", 2, NOR_delete, "nord addr len -> delet norflash from addr \r\n"},
{"go", 1, GoToAddr_run, "go R1 -> go to run,R0=0, R1=R1\r\n"},
};
void showhelp(char cmd[][50], int cmdnum)
{
int i;
for(i = 0; i < sizeof(cmdlist)/sizeof(CMDNUM); i++)
printf("%s", cmdlist[i].helptxt);
}
static int stripcmd(char *s,char cmd[][50])
{
int i = 0;
char *token = NULL;
char seps[] = " ,\t\n"; //分隔字符
token = strtok( s, seps );
while(token != NULL) {
if (i > 2) break;
strncpy(cmd[i], token, 49);
token = strtok( NULL, seps );
i++;
}
return i;
}
void parsecmd(char *s)
{
int i;
char cmd[3][50];
int cmdnum = 0;
cmdnum = stripcmd(s, cmd);
printf("\r\n");
for(i = 0; i < sizeof(cmdlist)/sizeof(CMDNUM); i++) {
if(strcmp(cmd[0], cmdlist[i].cmd) == 0){
if( cmdlist[i].paramcount != cmdnum - 1){
printf("input cmdparse is wrong\r\n");
printf("%s", cmdlist[i].helptxt);
}else{
cmdlist[i].callback(&cmd[1], cmdnum - 1);
}
return ;
}
}
printf("cmd is invalid\r\n\r\n");
showhelp(&cmd[1], cmdnum);
}
/****************************************************************/
/*命令函数*/
/*****************************************************************/
static unsigned long download_address = 0x20200000;
static unsigned long download_leng = 0;
int ch_to_hex(char ch)
{
if (ch >= '0' && ch <= '9')
return ch - '0' ;
else if (ch >= 'a' && ch <= 'f')
return ch - 'a' + 10;
else if (ch >= 'A' && ch <= 'F')
return ch - 'A' + 10;
else
return -1;
}
unsigned long hexstr_to_long(char * str)
{
unsigned long ret = 0xffffffff;
int i, len , ihex ;
char *p ;
p = strchr(str, 'x');
if( p != NULL){
p++;
len = strlen(p);
if (len == 0 || len > 8)
return ret;
ret = 0;
for (i = 0; i < len; i++){
ret <<= 4;
ihex = ch_to_hex(p[i]);
if (ihex == -1)
return 0xffffffff ;
ret += ihex;
}
}
return ret;
}
//设置下载地址
void set_downaddr(char cmd[][50], int cmdnum)
{
unsigned long tmp;
tmp = hexstr_to_long(cmd[0]);
if(tmp == 0xffffffff){
printf("you input %s is not hex\r\n", cmd[0]);
}else if (tmp >= 0xa0801000 && tmp <= 0xa0800000){
download_address = tmp & (~0x3);
printf("set downloadaddress=0x%x\r\n", download_address);
}else{
printf("set is not in SDRAM address range\r\n");
}
}
void SDRAM_Show(char cmd[][50], int cmdnum)
{
unsigned long tmp, len;
tmp = hexstr_to_long(cmd[0]);
len = hexstr_to_long(cmd[1]);
if(tmp == 0xffffffff || len == 0xffffffff || len == 0){
printf("you input para is not hex\r\n");
return ;
}
if (tmp + len <= download_leng){
myprint((char*)(tmp + download_address), len);
}else{
printf("over the sdram contents\r\n");
}
}
void GoToAddr_run(char cmd[][50], int cmdnum)
{
unsigned long para;
para = hexstr_to_long(cmd[0]);
if(para == 0xffffffff ){
printf("you input para is not hex\r\n");
return ;
}
printf("go to addr=0x%x to run\r\n", download_address);
printf("are you sure ? y/n \r\n");
if ('y' != get_key())
return;
printf("call r0=0, r1= x%x \r\n", para);
(*( (void (*)(int,int)) download_address))(0, para );
}
//启动YMODEN下载文件
void Ymodem_download(char cmd[][50], int cmdnum)
{
int len;
printf("start YMODEM ,please input file by YMODEM\r\n");
printf("input ESC KEY abort Download\r\n");
printf("down in sdramaddress = 0x%x \r\n", download_address);
len = ymodem_download((char *)download_address);
if (len == -1){
printf("\r\nYMODEM Download is abort \r\n");
download_leng = 0;
}else{
download_leng = len;
printf("\r\ndownload finished len=0x%x \r\n", download_leng);
}
}
/*NORFLASH 操作函数*/
void NOR_Write(char cmd[][50], int cmdnum)
{
unsigned long addr ,len ;
addr = hexstr_to_long(cmd[0]);
if(addr == 0xffffffff){
printf("you input para is not hex\r\n");
return ;
}
if(download_leng == 0){
printf("sdram don't have data\r\n");
return ;
}
else
len = download_leng;
printf("copy 0x%x(SDRAM) to 0x%x(NORFLASH) LEN=0x%x y/n ?\r\n",download_address, addr, len);
if ('y' != get_key())
return;
printf("start wirte NOR flash...\r\n");
if (0 == Write_Flash64K(addr, (U8 *)download_address, len ))
printf("write finished !\r\n addr = 0x%x , len = 0x%x\r\n",addr, len);
else
printf("write fail\r\n");
}
void NOR_Read(char cmd[][50], int cmdnum)
{
unsigned long tmp, len;
tmp = hexstr_to_long(cmd[0]);
len = hexstr_to_long(cmd[1]);
if(tmp == 0xffffffff || len == 0xffffffff || len == 0){
printf("you input para is not hex\r\n");
return ;
}
if (tmp + len <= 0x200000){
printf("load 0x%x(NORFLASH) to 0x%x(SDRAM) LEN=0x%x y/n ?\r\n",tmp , download_address, len);
if ('y' != get_key())
return;
printf("start loading...\r\n");
memcpy((U16 *)download_address, (U16 *)tmp,len);
download_leng = len;
printf("load to SDRAM addr = 0x%x len = 0x%x\r\n", download_address, len);
}else{
printf("input addr is wrong\r\n");
}
}
void NOR_delete(char cmd[][50], int cmdnum)
{
unsigned long tmp, len ;
tmp = hexstr_to_long(cmd[0]);
len = hexstr_to_long(cmd[1]);
if(tmp == 0xffffffff || len == 0xffffffff || len == 0){
printf("you input para is not hex\r\n");
return ;
}
tmp &= 0xffff0000;
if (tmp + len <= 0x400000){
printf("delet nand from 0x%x to 0x%x\n\r",tmp , tmp + len);
if ('y' != get_key())
return;
printf("start deleting...\n\r");
if (0 ==Erase_Flash(tmp, len))
printf("delet success\r\n");
else
printf("delet fail\r\n");
}else{
printf("input addr is wrong\r\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -