📄 comload.c
字号:
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
#define puts Uart_Printf
#define printf Uart_Printf
#define getch Uart_Getch
#ifndef DEBUG_VERSION
#define USE_UART_INT
#endif
extern U32 downloadAddress, downloadFileSize;
static U8* temp;
#ifdef USE_UART_INT
static void __irq Uart0RxInt( void )
{
ClearSubPending( BIT_SUB_RXD0 ); //rSUBSRCPND = BIT_SUB_RXD0; //Clear pending bit (Requested)
ClearPending( BIT_UART0 );
*temp ++ = RdURXH0();
}
#endif
void call_linux( U32 a0 , U32 a1 , U32 a2 );
void comdownload( void )
{
U32 size;
U8* buf;
U16 checksum;
puts( "\nNow download file from uart0...\n" );
downloadAddress = _NONCACHE_STARTADDRESS;
buf = ( U8 * ) downloadAddress;
temp = buf - 4;
Uart_GetKey();
#ifdef USE_UART_INT
pISR_UART0 = ( U32 ) Uart0RxInt; //串口接收数据中断
ClearSubPending( BIT_SUB_RXD0 );
ClearPending( BIT_UART0 );
EnableSubIrq( BIT_SUB_RXD0 );
EnableIrq( BIT_UART0 );
#endif
while ( ( U32 ) temp < ( U32 ) buf )
{
#ifdef USE_UART_INT
Led_Display( 0 );
Delay( 1000 );
Led_Display( 15 );
Delay( 1000 );
#else
*temp++ = Uart_Getch();
#endif
} //接收文件长度,4 bytes
size = *( U32 * ) ( buf - 4 );
downloadFileSize = size - 6;
#ifdef USE_UART_INT
printf( "Download File Size = %d\n" , size );
#endif
while ( ( ( U32 ) temp - ( U32 ) buf ) < ( size - 4 ) )
{
#ifdef USE_UART_INT
Led_Display( 0 );
Delay( 1000 );
Led_Display( 15 );
Delay( 1000 );
#else
*temp++ = Uart_Getch();
#endif
}
#ifdef USE_UART_INT
DisableSubIrq( BIT_SUB_RXD0 );
DisableIrq( BIT_UART0 );
#endif
#ifndef USE_UART_INT
printf( "Download File Size = %d\n" , size );
#endif
checksum = 0;
for ( size = 0; size < downloadFileSize; size++ )
checksum += buf[size];
if ( checksum != ( buf[size] | ( buf[size + 1] << 8 ) ) )
{
puts( "Checksum fail!\n" );
return;
}
puts( "Are you sure to run? [y/n]\n" );
while ( 1 )
{
U8 key = getch();
if ( key == 'n' )
return;
if ( key == 'y' )
break;
}
call_linux( 0 , 193 , downloadAddress );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -