uboot 命令行联想

来源:互联网 发布:日本买房知乎 编辑:程序博客网 时间:2024/04/29 08:07
/*
* (C) Copyright 2013
* author linqing
*/


#include <common.h>
#include <command.h>
#include <asm/byteorder.h>


#define HI_GROUPNAME(name)  hi_groupname_##name




int do_hi_test (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
if( strcmp("read",argv[1]) ==0 )
{
printf("read\n");
}


if( strcmp("write",argv[1]) ==0)
{
printf("wirte\n");
}
return 0;
}


int hi_test_complete(hi_group_cmd_s *pst_groupname,int argc, char *argv[], char last_char, int maxv, char *cmdv[])
{


int n_found = 0; 
int n_argc = argc;
int start_arg = 1;
int group_num=0;
int hit_flag=0;
hi_group_cmd_s *pst_next;
pst_next=pst_groupname;
int len, clen;
const char *cmd;
       
if(NULL == pst_next)
{


cmdv[0] = NULL;
return 0;
}




while((n_argc > 2) && (NULL != pst_next))
{
while(( NULL != pst_next[group_num].name) && (group_num < MAX_GROUP_NUM))
{
if(strcmp(argv[start_arg],pst_next[group_num].name)== 0)
{
hit_flag=1;
break;
}
group_num++;
}


if(hit_flag==0)
{
cmdv[0] = NULL;
return 0;
}
pst_next = pst_next[group_num].pst_group;
n_argc-=2;
start_arg+=2;
group_num=0;
}








cmd=argv[argc-1];
len = strlen(cmd);


group_num=0;


while(( NULL != pst_next[group_num].name) && (group_num < MAX_GROUP_NUM))
{


    if((argc % 2) == 0)
    {
clen = strlen(pst_next[group_num].name);
if (clen < len)
{group_num++;
continue;
}


if (memcmp(cmd, pst_next[group_num].name, len) != 0)
{
group_num++;
continue;
}
    }
/* too many! */
if (n_found >= maxv - 2) {
cmdv[n_found++] = "...";
break;
}

cmdv[n_found++] = pst_next[group_num].name;
group_num++;
}


cmdv[n_found] = NULL;
return n_found;


}






hi_group_cmd_s HI_GROUPNAME(hi_test_write)[]={
{"data",NULL},
{NULL,NULL},
};




hi_group_cmd_s HI_GROUPNAME(hi_test)[]={
{"read",NULL},
{"write",HI_GROUPNAME(hi_test_write)},
{NULL,NULL},
};


U_BOOT_CMD(
  hi_test, HI_GROUPNAME(hi_test) ,do_hi_test,
  "test\n",
  "test read\n"
  "test write data\n",
  hi_test_complete

);





#define MAX_GROUP_NUM 8


typedef struct __hi_group_cmd_s {
char *name;/* Command Name */
struct __hi_group_cmd_s *pst_group;
}hi_group_cmd_s;


/*
 * (C) Copyright 2000
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */


/*
 *  Definitions for Command Processor
 */
#ifndef __COMMAND_H
#define __COMMAND_H


#ifndef NULL
#define NULL 0
#endif


#ifndef __ASSEMBLY__
/*
 * Monitor Command Table
 */










struct cmd_tbl_s {
char *name;/* Command Name */

hi_group_cmd_s *pst_groupname;

/* Implementation function*/
int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
char *usage;/* Usage message (short)*/
#ifdef CFG_LONGHELP
char *help;/* Help  message (long)*/
#endif




#ifdef CONFIG_AUTO_COMPLETE
/* do auto completion on the arguments */
int (*complete)(hi_group_cmd_s *pst_groupname,int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
#endif
};


typedef struct cmd_tbl_s cmd_tbl_t;


extern cmd_tbl_t  __u_boot_cmd_start;
extern cmd_tbl_t  __u_boot_cmd_end;




/* common/command.c */
cmd_tbl_t *find_cmd(const char *cmd);


#ifdef CONFIG_AUTO_COMPLETE
extern void install_auto_complete(void);
extern int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp);
#endif


/*
 * Monitor Command
 *
 * All commands use a common argument format:
 *
 * void function (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 */


typedef void command_t (cmd_tbl_t *, int, int, char *[]);


#endif /* __ASSEMBLY__ */


/*
 * Command Flags:
 */
#define CMD_FLAG_REPEAT 0x0001/* repeat last command */
#define CMD_FLAG_BOOTD 0x0002/* command is from bootd */


/*
 * Configurable monitor commands definitions have been moved
 * to include/cmd_confdefs.h
 */




#define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))




#ifdef  CFG_LONGHELP
#define U_BOOT_CMD(name,groupname,cmd,usage,help,complete) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, groupname, cmd, usage, help ,complete}


#else /* no long help info */


#define U_BOOT_CMD(name,groupname,cmd,usage,complete) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, groupname, cmd, usage,complete}


#endif /* CFG_LONGHELP */


#endif /* __COMMAND_H */







原创粉丝点击