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

📄 xmoden.c

📁 ADS开发的BOOTLOADER,针对2410,是某培训班出的!
💻 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 + -