cmd.c

来自「ADS下的bios工程」· C语言 代码 · 共 863 行 · 第 1/2 页

C
863
字号
#include <bios/s3c2410x.h>#include <bios/stdio.h>#include <bios/boot.h>#include <bios/netdev.h>#include <bios/time.h>#include <bios/types.h>#include <bios/string.h>#include <bios/cmd.h>#include <bios/error.h>#include <bios/config.h>#include <bios/ctype.h>#include <bios/system.h>//#include <bios/lcd.h>#include <bios/flash_nand.h>#include <bios/config_param.h>#undef BDEBUG#ifdef BDEBUG#define BPRINTF(fmt, args...) printf("%s-%s()[%d]: " fmt, __FILE__, \      __FUNCTION__, __LINE__, args)#else#define BPRINTF(fmt, args...)#endif/* external defined functions */extern int bootFlag;extern REG32 bios_recv_bytes;  extern int boot_loader_size;extern struct BOOT_LOADER boot_loader[];extern struct netdev probed_net_devs;struct config_params    sysconf;extern void boot_image(int);extern void Usb_Main(void);/* function proto types */static u32 SysParams(u8 argc, char (*argv)[MAX_LENGTHOF_ARGS],CMDPOOL *pCmd);u32 sysconf_view(void); u32 sysconf_set(void);void NandFlash(void);int get_params(void);void printfHelpMessage(char *cmd);/* command structures */BIOSCMD gBIOSCmdTable[MAX_NUMOF_COMMAND] = {    {"help",        HelpCmdLi,      4, "Help for bios command.\0"},    {"ls",          ListOfCmd,      2, "View bios command list.\0"},    {"sysconf",     SysParams,      7, "System parameter configure.\0"},    {"flash",       FlashUtils,     5, "Flash Device Utility.\0"},    {"erase",       FlashUtils2,    5, "Flash Device Utility for JFFS.\0"},    {"loadr",	DownLoadCmdLi,  5, "Image download & run.\0"},    {"load",	DownLoadCmdLi,  4, "Image download.\0"},    {"boot",        BootCmdLi,      4, "Booting the utlinux Image.\0"},    {"dump",        MemDump,        4, "Memory Dump Command.\0"},    { NULL, NULL, 0, NULL}};u32 MemDump(u8 argc, char (*argv)[MAX_LENGTHOF_ARGS], CMDPOOL *pCmd){    unsigned char    *SrcAddr;    int    block, page = 0;    printf("\nargc(%d)\n", argc);    if (argc < 2) {        printfHelpMessage(argv[0]);        printf("Usage: %s [address(Hex value)]\n", argv[0]);        printf("          [-n(nand) block(0~1023) page(0~15)]\n");        return ERROR_MISS_ARGUMENTS;    }    if (!str_ncmp("-n", argv[1], strlen(argv[1]))) {        block = (unsigned int)strtoint(argv[2], strlen(argv[2]));         if (argc < 4)             page = -1;        else             page = (unsigned int)strtoint(argv[3], strlen(argv[3]));         debug_nand(block, page);    }     else {        SrcAddr = (unsigned char *)hexstrtohex(argv[1], strlen(argv[1]));         debug(SrcAddr);    }    return BIOS_SUCCESS;}void InitCommandPool(CMDPOOL *commandpool) {    CMDPOOL    *pCmd, *pStart, *pEnd, *prevCmd = 0;    int    i, j;    pCmd = commandpool;    pStart = commandpool;    pEnd = commandpool + (MAX_COMMAND_LIST - 1);    pEnd -> comlen = 0;    for (i = 0; i < MAX_COMMAND_LIST; i ++) {        for (j = 0; j < MAX_LENGTHOF_COMMANDLINE; j ++) {            pCmd->commandline[j] = '\0';        }        pCmd -> comlen = 0;        pCmd -> prevcmd = ((i == 0) ? pEnd : prevCmd);        prevCmd = pCmd;        pCmd -> nextcmd = ((i == MAX_COMMAND_LIST - 1) ? pStart : pCmd + 1);        pCmd ++;    }}u32 ReadCommand(CMDPOOL *pCmd, u32 *CmdOffset){    int    ch,i;    static u32    cur_pos;    static u32    flag;    static CMDPOOL    *pCurCmd;    cur_pos = 0;    flag = 0;	    pCurCmd = pCmd;    /* Initialize the command line */    for (i = 0; i < MAX_LENGTHOF_COMMANDLINE; i ++)        pCurCmd -> commandline[i] = '\0';            /* Initialize the command length */    pCurCmd -> comlen = 0;    if (bootFlag) {        ch = getc_timed(BOOT_WAIT_TIME);        if (ch < 0 || ch == CR)             return  (int)NULL;        bootFlag = 0;     }     else          ch = getc();    while(1) {        switch (ch) {            case CR:                 if (!flag)                     PutPrompt(pCmd, CmdOffset, 3);                else {                    flag = cur_pos = 0;                    return  BIOS_SUCCESS;                }                break;            case BS:                if (cur_pos > 0) {                    putc(BS);                    putc(SPACE);                    pCurCmd -> commandline[-- cur_pos] = '\0';                    if (cur_pos == 0){                        putc(ch);                    }                }                break;            case ' ':                 if (!flag) {                    putc(ch);                    break;                }            default:                 pCurCmd -> commandline[cur_pos ++] = ch;                pCurCmd -> comlen ++;	                flag = 1;        }        if (cur_pos > 0) {            putc(ch);        }        ch = getc();        if (!flag)             pCurCmd = pCmd;    }}CMDPOOL *PutPrompt(CMDPOOL *pCmd, u32 *CmdOffset, u32 mode){    switch (mode) {        case 0:            printf("%s ", pCmd -> commandline);             putc('\b');            break ;        case 1:            printf("No more command!!!\n");            break ;        case 2:            printf("\rNo next command!!!\n");            break ;        case 3:            (*CmdOffset) ++;            printf("\nBIOS(%ld)> ", *CmdOffset);     }    return  pCmd;}u32 RunCommand(CMDPOOL *pCmd){    int    index;		    u32    argc;    char    argv[MAX_NUMOF_ARGS][MAX_LENGTHOF_ARGS] = {{0,},};    memset(argv, 0, sizeof(argv[MAX_NUMOF_ARGS][MAX_LENGTHOF_ARGS]));    argc = ParseCommandLine(argv,pCmd -> commandline);     index = LookUpCommand(argv[0]); /* argv[0] is command */    if (gBIOSCmdTable[index].cmd_action == NULL || index < 0)        return ERROR_BAD_COMMAND;     return  gBIOSCmdTable[index].cmd_action(argc,argv,pCmd); }u32 ParseCommandLine(char (*argv)[MAX_LENGTHOF_ARGS], char *commandline){    u32    count = 1;    u32    offset = 0;    u32    i, j;    char    cmd;    for (j = 0; j < MAX_NUMOF_ARGS; j ++) {        for (i = 0 ; i < MAX_LENGTHOF_ARGS; i ++) {            if ((cmd = commandline[offset]) == SPACE) {                offset ++;                count ++;                argv[j][i] = '\0';                break ;            }            switch (cmd) {                case NL:                 case CR:                     argv[j][i] = '\0';                    return  count;                default:                     argv[j][i] = cmd;                    offset ++;                    break ;            }        }    }    return  count ;}u32 LookUpCommand(char* cmd){    u32    tableindex = 0;    while (tableindex < MAX_NUMOF_COMMAND) {        if (gBIOSCmdTable[tableindex].cmd_action == NULL)             return  -1;        if (!str_ncmp(cmd, gBIOSCmdTable[tableindex].cmd_name,strlen(cmd)))            if (strlen(cmd) == gBIOSCmdTable[tableindex].cmd_length)                break;        tableindex++;    }    return  tableindex;}void printfHelpMessage(char *cmd){    u32    index;    index = LookUpCommand(cmd);    printf("\n%s\n", gBIOSCmdTable[index].cmd_help);}u32 ListOfCmd(u8 argc, char (*argv)[MAX_LENGTHOF_ARGS], CMDPOOL *pCmd){    int    index ;    if (argc == 2)        HelpCmdLi(1, NULL, NULL);     else {        printf("\n");        for (index = 0; index < MAX_NUMOF_COMMAND; index ++) {            if (gBIOSCmdTable[index].cmd_name == NULL)                 break ;            printf("%-10s", gBIOSCmdTable[index].cmd_name);        }    }    return  BIOS_SUCCESS;}u32 HelpCmdLi(u8 argc, char (*argv)[MAX_LENGTHOF_ARGS], CMDPOOL *pCmd){	int index ;	printf("\n=======================================") ;	printf("\n    BIOS Command line interface HELP   ") ;	printf("\n=======================================") ;	for (index = 0 ; index < MAX_NUMOF_COMMAND ; index++) 	{                if(gBIOSCmdTable[index].cmd_name == NULL) break;		printf("\n %-8s: ",gBIOSCmdTable[index].cmd_name);		printf("%s ",gBIOSCmdTable[index].cmd_help);	}	printf("\n=======================================\n") ;	return BIOS_SUCCESS;}u32 FlashUtils2(u8 argc, char (*argv)[MAX_LENGTHOF_ARGS], CMDPOOL *pCmd){    struct BOOT_LOADER    *loader;    int    block=0, i;    int    branch;    loader = &boot_loader[0];    bios_recv_bytes = 0;    load_addr = DOWNLOAD_BASE;      /* 0x30300000 */    if (argc < 2) {        printfHelpMessage(argv[0]);        printf("Usage: %s <target>\n", argv[0]) ;        printf("   <target> = [ kernel | disk | user_1 | user_2 ]\n") ;        return  ERROR_MISS_ARGUMENTS;    }    if (!str_ncmp("kernel", argv[1], strlen(argv[1]))) {        branch = 1;        block = NAND_KERNEL_BLOCK;        bios_recv_bytes = NAND_KERNEL_SIZE * 0x4000;    }     else if (!str_ncmp("disk", argv[1], strlen(argv[1]))) {        branch = 2;        block = NAND_APPS_BLOCK;        bios_recv_bytes = NAND_APPS_SIZE * 0x4000;    }     else if (!str_ncmp("user_1", argv[1], strlen(argv[1]))) {        branch = 2;        block = NAND_USER_BLOCK;        bios_recv_bytes = NAND_USER_SIZE * 0x4000;    }     else if (!str_ncmp("user_2", argv[1], strlen(argv[1]))) {        branch = 4;        block = NAND_FREE_BLOCK;        bios_recv_bytes = NAND_FREE_SIZE * 0x4000;    }    switch (branch) {        case  1:            printf("\nNow erasing the kernel area of NAND Flash!\n");            break ;        case  2:            printf("\nNow erasing the disk area of NAND Flash!\n");            break ;        case  3:            printf("\nNow erasing the user #1 partition area of NAND Flash!\n");            break ;        case  4:            printf("\nNow erasing the user #2 partition area of NAND Flash!\n");            break ;        default:            break ;    }    nand_flash_control(nand_erase, block, 0, (u8 *)load_addr, bios_recv_bytes);    printf("Completed erasing the partition!!\n");    return BIOS_SUCCESS;}	u32 FlashUtils(u8 argc, char (*argv)[MAX_LENGTHOF_ARGS], CMDPOOL *pCmd){    struct BOOT_LOADER    *loader;    int    block=0, i;    int    branch;    loader = &boot_loader[0];    bios_recv_bytes = 0;    load_addr = DOWNLOAD_BASE;      /* 0x30300000 */    if (argc < 4) {        printfHelpMessage(argv[0]);        printf("Usage: %s <loader> <target> <file name>\n", argv[0]) ;        printf("   <loader> = [ net | serial | usb ]\n") ;        printf("   <target> = [ NAND Flash block Number(0-1024)]\n") ;        printf("   <file name> = [ boot.bin | bios.bin | zImage | "              "romdisk.img | ramdisk.gz | jffs.img | jffs2.img ]\n");        return ERROR_MISS_ARGUMENTS;    }    for (i = 0; i < boot_loader_size; i ++) {        if (!str_ncmp(loader -> fn -> name, argv[1], strlen(argv[1]))) {            printf("\n%s trying to load image....\n",loader -> fn -> name);            break ;        }        loader ++;    }    if (i == boot_loader_size)         return  ERROR_NOT_SUPPORT;    sprintf(BOOT_FILE, "%s", "/home/tftp/");    strcat(BOOT_FILE, argv[3]);

⌨️ 快捷键说明

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