?? xmoden.c
字號:
#include "uart.h"
#include "nand.h"
#define BLOCK_SIZE 128 /* size of transmit blocks */
#define RETRIES 20 /* maximum number of RETRIES */
#define men_base 0x30000000
#define linux_offer 0x8000
#define boot_base 0x31000000
#define SOH 0x01 /* start of header */
#define ACK 0x06 /* Acknowledge */
#define NAK 0x15 /* Negative acknowledge */
#define CAN 0x18 /* Cancel */
#define EOT 0x04 /* end of text */
#define timeout (10000000)
char buf[4096];
static unsigned int kernel_from = 0x00030000;
int get_c()
{char *wrbuf;
char c;
int eorror=0;
int i=-2;
int mun,check=0;
wrbuf=buf;
c=do_getc(timeout,&eorror);
if(c==0) return -1;
switch(c)
{ case SOH :
while(1)
{c=do_getc(timeout,&eorror);
if(eorror) return -1;
switch(i){
case -2:
mun=c;
break;
case -1://if(c!=~(mun))return -2;
break;
case BLOCK_SIZE :
if((check&0xff)!=c) return (-3);
else return mun;
break;
default:
wrbuf[i]=c;
check+=c;
break;
}
i++;}
case EOT : return (-4);
case CAN : return (-5);
default: return (-5);
}
}
int xmoden_recive(char *addre,int len)
{int i,r;
int wrlen=0;
int block_num=1;
char ack;
char *p;
int re=1;
int er_mun=RETRIES;
do
{if((r=get_c())==(block_num&0xff))
{ er_mun=RETRIES;
for(i=0;i<BLOCK_SIZE;i++)
{*(addre++)=buf[i];
}
block_num++;
wrlen+=BLOCK_SIZE;
ack=ACK;
p="rx";
er_mun=RETRIES;
}else {
switch(r)
{case -1: p="byte eorror.";
ack=NAK;
break;
case -2: p="block eorror.";
ack=NAK;
break;
case -3 :p="sum eorror.";
ack=NAK;
break;
case -4 :p="done.";
ack=ACK;
break;
case -5 :p="cancel.";
ack=ACK;
break;
default :
p="bad.";
ack=NAK;
break;
}
er_mun--;
}
sendc(ack);
}while((r>-3)&&er_mun);
uart_send(p);
if(!er_mun||(r!=-4))
{re=0;}
return re;
}
void recive_linux_x(int agrc,char ** agrv)
{
uart_send("Now loading linux kernel to sdram........\n\r");
xmoden_recive((char*)(men_base+linux_offer),0x100000);
uart_send("Now writing linux kernel to flash......\n\r");
nand_write(kernel_from,(unsigned char *)(men_base+linux_offer),0x100000 );
uart_send("DONE\n\r");
}
void load_bootloader_x(int agrc,char ** agrv)
{ uart_send("Now loading new bootloader to sdram......\n\r");
xmoden_recive((char*)boot_base,0x2000);
uart_send("Now writing bootloader to flash......\n\r");
nand_write(0x0,(unsigned char * )boot_base,0x2000);
uart_send("\n\rDONE\n\r");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -