www.pudn.com > LJD2440-II_MON_OK.rar > 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();
}
static void __irq Uart1RxInt(void)
{
ClearSubPending(BIT_SUB_RXD1); //rSUBSRCPND = BIT_SUB_RXD1; //Clear pending bit (Requested)
ClearPending(BIT_UART1);
*temp ++= RdURXH1();
}
#endif
void call_linux(U32 a0, U32 a1, U32 a2);
void comdownload(void)
{
U32 size;
U8 *buf;
U16 checksum;
int up;
puts("\nNow download file from uart0...\n");
downloadAddress = _NONCACHE_STARTADDRESS;
buf = (U8 *)downloadAddress;
temp = buf-4;
Uart_GetKey();
#ifdef USE_UART_INT
up = Uart_Select(-1); //get the console port
if(!up) {
pISR_UART0 = (U32)Uart0RxInt; //串口接收数据中断
ClearSubPending(BIT_SUB_RXD0);
ClearPending(BIT_UART0);
EnableSubIrq(BIT_SUB_RXD0);
EnableIrq(BIT_UART0);
} else {
pISR_UART1 = (U32)Uart1RxInt; //串口接收数据中断
ClearSubPending(BIT_SUB_RXD1);
ClearPending(BIT_UART1);
EnableSubIrq(BIT_SUB_RXD1);
EnableIrq(BIT_UART1);
}
#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
if(!up) {
DisableSubIrq(BIT_SUB_RXD0);
DisableIrq(BIT_UART0);
} else {
DisableSubIrq(BIT_SUB_RXD1);
DisableIrq(BIT_UART1);
}
#endif
#ifndef USE_UART_INT
printf("Download File Size = %d\n", size);
#endif
checksum = 0;
for(size=0; size