?? system.c
字號:
#if !BASIC_BIOS
#include <stdio.h>
#include <setjmp.h>
#include <string.h>
#include <ctype.h>
#include "interrupt.h"
#include "watchdog.h"
#include "cli.h"
#include "uart.h"
extern void jmp_to( unsigned long addr );
static CommandNode CLI_NAME_REBOOT =
{
"reboot", // node command hint pointer
"系統(tǒng)復(fù)位", // node command help pointer
NULL, // node current input buffer pointer
NULL, // down leaf pointer
NULL, // right leaf pointer
COMMAND_TYPE_KEY, // node type
CLI_REBOOT // node command value
};
static CommandNode CLI_NAME_RUN =
{
"run", // node command hint pointer
"運(yùn)行指定地址的程序", // node command help pointer
NULL, // node current input buffer pointer
NULL, // down leaf pointer
NULL, // right leaf pointer
COMMAND_TYPE_HEX, // node type
CLI_RUN // node command value
};
static CommandNode CLI_NAME_GO =
{
"go", // node command hint pointer
"運(yùn)行地址0x0c000000的程序", // node command help pointer
NULL, // node current input buffer pointer
NULL, // down leaf pointer
NULL, // right leaf pointer
COMMAND_TYPE_KEY, // node type
CLI_GO // node command value
};
CommandNode *CLI_Reboot[] =
{
&CLI_NAME_REBOOT, // boot
NULL
};
CommandNode *CLI_Run[] =
{
&CLI_NAME_RUN, // run
NULL
};
CommandNode *CLI_Go[] =
{
&CLI_NAME_GO, // go
NULL
};
static CommandNode CLI_NAME_READMEM =
{
"read-memory", // node command hint pointer
"顯示內(nèi)存", // node command help pointer
NULL, // node current input buffer pointer
NULL, // down leaf pointer
NULL, // right leaf pointer
COMMAND_TYPE_HEX, // node type
CLI_READMEMORY // node command value
};
static CommandNode CLI_NAME_WRITEMEM =
{
"write-memory", // node command hint pointer
"修改內(nèi)存", // 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_WRITEDATA =
{
"data", // node command hint pointer
"數(shù)據(jù)(HEX)", // node command help pointer
NULL, // node current input buffer pointer
NULL, // down leaf pointer
NULL, // right leaf pointer
COMMAND_TYPE_HEX, // node type
CLI_WRITEMEMORY // node command value
};
CommandNode *CLI_ReadMemory[] =
{
&CLI_NAME_READMEM, // read memory
NULL
};
CommandNode *CLI_WriteMemory[] =
{
&CLI_NAME_WRITEMEM, // write memopy
&CLI_NAME_WRITEDATA, // data
NULL
};
void CLI_SystemProc( unsigned char key )
{
switch( key )
{
case CLI_REBOOT:
CLI_RebootProc();
break;
case CLI_RUN:
CLI_RunProc();
break;
case CLI_GO:
CLI_GoProc();
break;
case CLI_READMEMORY:
CLI_ReadMemProc();
break;
case CLI_WRITEMEMORY:
CLI_WriteMemProc();
break;
case CLI_DISPMEM:
CLI_DispMemProc();
break;
default:
break;
}
}
static CommandNode CLI_NAME_DISPMEMORY =
{
"display-mem", // node command hint pointer
"顯示內(nèi)存", // node command help pointer
NULL, // node current input buffer pointer
NULL, // down leaf pointer
NULL, // right leaf pointer
COMMAND_TYPE_HEX, // node type
CLI_DISPMEM // node command value
};
CommandNode *CLI_DisplayMem[] =
{
&CLI_NAME_DISPMEMORY, // display memopy
NULL
};
void CLI_RebootProc( void )
{
INT_DISABLE_FIQ();
INT_DISABLE_IRQ();
INT_IRQ_CLEAR_ALL_PENDING();
INT_FIQ_CLEAR_ALL_PENDING();
WATCHDOG_SetPrescaler( 0 );
WATCHDOG_TimerEnable();
WATCHDOG_ResetEnable();
WATCHDOG_Clear();
for(;;);
}
void CLI_RunProc( void )
{
unsigned long addr;
char *str;
str = CLI_GetCommandKey( 0 );
if( str != NULL )
{
if( 1 == sscanf( str, "%lX", &addr ))
{
jmp_to( addr );
}
}
}
void CLI_GoProc( void )
{
jmp_to( 0x0c000000 );
}
void CLI_ReadMemProc( void )
{
unsigned long addr;
unsigned char *p;
char *str;
str = CLI_GetCommandKey( 0 );
if( str != NULL )
{
if( 1 == sscanf( str, "%lX", &addr ))
{
p = (unsigned char*)addr;
UART_Printf( "\r\nAddr 0X%08lX : 0X%02X", addr, *p );
UART_Printf( "\r\nAddr 0X%08lX : 0X%02X", addr + 1, *( p + 1 ) );
UART_Printf( "\r\nAddr 0X%08lX : 0X%02X", addr + 2, *( p + 2 ) );
UART_Printf( "\r\nAddr 0X%08lX : 0X%02X", addr + 3, *( p + 3 ) );
}
}
}
void CLI_WriteMemProc( void )
{
unsigned long addr;
unsigned char data;
unsigned char *p;
char *str;
str = CLI_GetCommandKey( 0 );
if( str != NULL )
{
if( 1 == sscanf( str, "%lX", &addr ))
{
}
else
{
UART_Printf("\r\nInput Error");
return;
}
}
str = CLI_GetCommandKey( 1 );
if( str != NULL )
{
if( 1 == sscanf( str, "%2X", &data ))
{
p = (unsigned char*)addr;
*p = data;
UART_Printf( "\r\nAddr 0X%08lX : 0X%02X", addr, *p );
UART_Printf( "\r\nAddr 0X%08lX : 0X%02X", addr + 1, *( p + 1 ) );
UART_Printf( "\r\nAddr 0X%08lX : 0X%02X", addr + 2, *( p + 2 ) );
UART_Printf( "\r\nAddr 0X%08lX : 0X%02X", addr + 3, *( p + 3 ) );
}
else
{
UART_Printf("\r\nInput Error");
return;
}
}
}
void CLI_DispMemProc( void )
{
char *str;
unsigned long addr;
str = CLI_GetCommandKey( 0 );
if( str!= NULL )
{
if( 1 == sscanf( str, "%lX", &addr ))
{
CLI_DispMem( (unsigned char *)addr );
}
}
}
void CLI_DispMem( unsigned char *addr )
{
unsigned long loop1, k;
unsigned char *p;
p = addr;
for( loop1 = 0; loop1 < 0x10; loop1++ )
{
UART_Printf( "\r\n%08lX:", p );
UART_Printf( "%02X", *p++ );
for( k = 1; k < 0x10; k++ )
{
if( k % 0x8 == 0 )
{
UART_Printf( " -" );
}
UART_Printf( " %02X", *p );
p++;
}
p-=0x10;
UART_Printf( " - " );
for( k = 0; k < 0x10; k++ )
{
if( isprint( *p ))
{
UART_Printf( "%c", *p );
}
else
{
UART_Printf( "%c", ' ' );
}
p++;
}
}
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -