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

📄 load.c

📁 自动联想命令行处理代码
💻 C
字号:
#if !BASIC_BIOS

#include <stdio.h>
#include "bios.h"
#include "cli.h"
#include "rtc.h"
#include "uart.h"
#include "xmodem.h"

static CommandNode CLI_NAME_LOAD =
{
    "load",                 // node command hint pointer
    "加载类",               // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    NULL                    // node command value
};

static CommandNode CLI_NAME_PROG =
{
    "program",              // node command hint pointer
    "加载程序",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    NULL                    // node command value
};

static CommandNode CLI_NAME_PROGTFTP =
{
    "tftp",                 // node command hint pointer
    "网口加载",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_IP,        // node type
    CLI_LOADTFTP            // node command value
};

static CommandNode CLI_NAME_PROGNAME =
{
    "filename",             // node command hint pointer
    "文件名称",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_STRING,    // node type
    NULL                    // node command value
};

static CommandNode CLI_NAME_PROGXMODEM =
{
    "xmodem",               // node command hint pointer
    "串口加载",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    CLI_LOADXMODEM          // node command value
};


static CommandNode CLI_NAME_PATCH =
{
    "patch",                // node command hint pointer
    "加载补丁",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    NULL                    // node command value
};

static CommandNode CLI_NAME_PATTFTP =
{
    "tftp",                 // node command hint pointer
    "网口加载",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_IP,        // node type
    CLI_LOADPATTFTP         // node command value
};
/*
static CommandNode CLI_NAME_PATNAME =
{
    "filename",             // node command hint pointer
    "文件名称",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_STRING,    // node type
    NULL                    // node command value
};
*/
static CommandNode CLI_NAME_PATXMODEM =
{
    "xmodem",               // node command hint pointer
    "串口加载",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    CLI_LOADPATXMODEM       // node command value
};

/*
static CommandNode CLI_NAME_TO =
{
    "to",                   // node command hint pointer
    "加载地址",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_HEX,       // node type
    NULL                    // node command value
};
*/

static CommandNode CLI_NAME_BASIC =
{
    "basic-bios",           // node command hint pointer
    "基本BIOS",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    NULL                    // node command value
};

static CommandNode CLI_NAME_EXTEND =
{
    "extend-bios",          // node command hint pointer
    "扩展BIOS",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    NULL                    // node command value
};

static CommandNode CLI_NAME_BASICXMODEM =
{
    "xmodem",               // node command hint pointer
    "串口加载",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    CLI_LOADBASICXMODEM     // node command value
};

static CommandNode CLI_NAME_BASICTFTP =
{
    "tftp",                 // node command hint pointer
    "网口加载",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    CLI_LOADBASICTFTP       // node command value
};

static CommandNode CLI_NAME_EXTENDXMODEM =
{
    "xmodem",               // node command hint pointer
    "串口加载",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    CLI_LOADECTENDXMODEM    // node command value
};

static CommandNode CLI_NAME_EXTENDTFTP =
{
    "tftp",                 // node command hint pointer
    "网口加载",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_KEY,       // node type
    CLI_LOADEXTENDTFTP      // node command value
};
/*
static CommandNode CLI_NAME_EXTENDNAME =
{
    "filename",             // node command hint pointer
    "文件名称",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_STRING,    // node type
    NULL                    // node command value
};

static CommandNode CLI_NAME_BASICNAME =
{
    "filename",             // node command hint pointer
    "文件名称",             // node command help pointer
    NULL,                   // node current input buffer pointer
    NULL,                   // down leaf pointer
    NULL,                   // right leaf pointer
    COMMAND_TYPE_STRING,    // node type
    NULL                    // node command value
};
*/
CommandNode *CLI_LoadTftp[] =
{
    &CLI_NAME_LOAD,       // load
    &CLI_NAME_PROG,       // program
    &CLI_NAME_PROGTFTP,   // tftp
    &CLI_NAME_PROGNAME,   // filename
    NULL
};

CommandNode *CLI_LoadXmodem[] =
{
    &CLI_NAME_LOAD,       // load
    &CLI_NAME_PROG,       // program
    &CLI_NAME_PROGXMODEM, // xmodem
    NULL
};

CommandNode *CLI_LoadPatTftp[] =
{
    &CLI_NAME_LOAD,       // load
    &CLI_NAME_PATCH,      // patch
    &CLI_NAME_PATTFTP,    // tftp
    &CLI_NAME_PROGNAME,   // filename
    NULL
};

CommandNode *CLI_LoadPatXmodem[] =
{
    &CLI_NAME_LOAD,       // load
    &CLI_NAME_PATCH,      // patch
    &CLI_NAME_PATXMODEM,  // xmodem
    NULL
};

CommandNode *CLI_LoadBasicBiosXmodem[] =
{
	&CLI_NAME_LOAD,
	&CLI_NAME_BASIC,
	&CLI_NAME_BASICXMODEM,
	NULL
};

CommandNode *CLI_LoadBasicBiosTftp[] =
{
	&CLI_NAME_LOAD,
	&CLI_NAME_BASIC,
	&CLI_NAME_BASICTFTP,
	&CLI_NAME_PROGNAME,
	NULL
};

CommandNode *CLI_LoadExtendBiosXmodem[] =
{
	&CLI_NAME_LOAD,
	&CLI_NAME_EXTEND,
	&CLI_NAME_EXTENDXMODEM,
	NULL	
};

CommandNode *CLI_LoadExtendBiosTftp[] =
{
	&CLI_NAME_LOAD,
	&CLI_NAME_EXTEND,
	&CLI_NAME_EXTENDTFTP,
	&CLI_NAME_PROGNAME,
	NULL
};

void CLI_LoadProc( unsigned char key )
{
    switch( key )
    {
        case CLI_LOADTFTP:
            CLI_LoadProgTftpProc();
            break;

        case CLI_LOADXMODEM:
            CLI_LoadProgXmodemProc();
            break;

        case CLI_LOADPATTFTP:
            CLI_LoadPatchTftpProc();
            break;

        case CLI_LOADPATXMODEM:
            CLI_LoadPatchXmodemProc();
            break;

        case CLI_LOADBASICXMODEM:
        	CLI_LoadBasicXmodemProc();
        	break;

        case CLI_LOADBASICTFTP:
        	CLI_LoadBasicTftpProc();
        	break;
        	
        case CLI_LOADECTENDXMODEM:
        	CLI_LoadExtendXmodemProc();
        	break;

        case CLI_LOADEXTENDTFTP:
	        CLI_LoadExtendTftpProc();
	        break;

        default:
            break;
    }
}

void CLI_LoadProgXmodemProc( void )
{
    unsigned long size = 0;

	UART_Printf("\r\n");

    size = XMODEM_Load( (unsigned char*)SDRAM_BUFFER_ADDR, FLASH_PROGRAM_SIZE );

	UART_Printf( "\r\nDownload 0X%X (%d) bytes to address 0X%X",
                              (int)size, (int)size, SDRAM_BUFFER_ADDR );
                              
    BurnFlash( (unsigned short*)FLASH_PROGRAM_START_ADDR, (unsigned short*)SDRAM_BUFFER_ADDR, size );
}

void CLI_LoadPatchXmodemProc( void )
{
}

void CLI_LoadBasicXmodemProc( void )
{
    unsigned long size = 0;

	UART_Printf("\r\n");

    size = XMODEM_Load( (unsigned char*)SDRAM_BUFFER_ADDR, FLASH_BASIC_BIOS_SIZE );

	UART_Printf( "\r\nDownload 0X%X (%d) bytes to address 0X%X",
                              (int)size, (int)size, SDRAM_BUFFER_ADDR );
                              
    BurnFlash( (unsigned short*)FLASH_BASIC_BIOS_ADDR, (unsigned short*)SDRAM_BUFFER_ADDR, size );
}

void CLI_LoadExtendXmodemProc( void )
{
    unsigned long size = 0;

	UART_Printf("\r\n");

    size = XMODEM_Load( (unsigned char*)SDRAM_BUFFER_ADDR, FLASH_EXTEND_BIOS_SIZE );

	UART_Printf( "\r\nDownload 0X%X (%d) bytes to address 0X%X",
                              (int)size, (int)size, SDRAM_BUFFER_ADDR );
                              
    BurnFlash( (unsigned short*)FLASH_EXTEND_BIOS_ADDR, (unsigned short*)SDRAM_BUFFER_ADDR, size );
}

void CLI_LoadProgTftpProc( void )
{
}

void CLI_LoadPatchTftpProc( void )
{
}

void CLI_LoadBasicTftpProc( void )
{
}

void CLI_LoadExtendTftpProc( void )
{
}

unsigned long CLI_LoadToRam( unsigned char *p )
{
    unsigned long i,size = 0;
    unsigned char sec, data, start = 0;
    struct reltime time;

    RTC_GetTime( &time );
    sec = time.second;

	UART_Printf( "\r\n1. BIN Download" );
	UART_Printf( "\r\n2. XModem Download" );
	UART_Printf( "\r\nSelect one to proceed......." );
    UART_Printf( "\b%d", BIOS_CLI_SECECT_TIME );

	for( i = 0; i < BIOS_CLI_SECECT_TIME; )
	{
	    RTC_GetTime( &time );
	    if( sec != time.second )
	    {
            sec = time.second;
	        i++;

            if( start == 0 )
            {
                UART_Printf( "\b%d", BIOS_CLI_SECECT_TIME-i );
            }
	    }

	    if( UART_kbhit( COM0 ) )
	    {
            data = (unsigned char)UART_getchar( COM0 );
	    }
	    else
	    {
	        continue;
	    }

	    if( start == 0 )
	    {
	        switch( data )
	        {
	            case '1':
                    UART_Printf( "\r\nYou have selected BIN download, please send file now.\r\n" );
	                size = CLI_LoadBin( p, 1048*1048 );
	                i = BIOS_CLI_SECECT_TIME;
	                break;

	            case '2':
                    UART_Printf( "\r\nYou have selected XModem download, please send file now.\r\n" );
                    size = XMODEM_Load( p, 1048*1048 );
                    i = BIOS_CLI_SECECT_TIME;
	                break;
	        }
	    }
	}

	if( size != 0 )
	{
        if( size == 0xffffffff )
        {
            UART_Printf( "\r\nDownload TOO large" );
        }
        else
        {
            UART_Printf( "\r\nDownload 0X%X (%d) bytes , address 0X%X to 0X%X",
                              size, size, p, p + size );
        }
    }

    return size;
}

unsigned long CLI_LoadBin( unsigned char *start_addr, unsigned long dwAllowedMem )
{
	unsigned long start = 0, size = 0;
	unsigned char data, i, sec;
	unsigned char *p = start_addr;
    struct reltime time;

    RTC_GetTime( &time );
    sec = time.second;

    UART_Printf( "%-2d", BIOS_CLI_CONFIRM_TIME );
	for( i = 0; i < BIOS_CLI_CONFIRM_TIME; )
	{
	    RTC_GetTime( &time );
	    if( sec != time.second )
	    {
            sec = time.second;
	        i++;

            if( start == 0 )
            {
                UART_Printf( "\b\b%-2d", BIOS_CLI_CONFIRM_TIME-i );
            }
	    }

	    if( UART_kbhit( COM0 ) )
	    {
            data = (unsigned char)UART_getchar( COM0 );
	    }
	    else
	    {
	        continue;
	    }

	    start = 1;

        i = BIOS_CLI_CONFIRM_TIME - BIOS_CLI_TERM_TIME;
        *p++ = data;
        size++;

        if( size >= dwAllowedMem )
        {
            return 0xffffffff;
        }

        if( size % 1024 == 0 )
        {
            UART_Printf(".");
        }
	}

	return size;
}

#endif

⌨️ 快捷键说明

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