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

📄 cmd.c

📁 xscale pxa255 bootloader 程序
💻 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 + -