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

📄 nc3016_boot.c

📁 移植好的Ibm405ep bsp板极支持包
💻 C
字号:
#include <ioLib.h>
#include <sockLib.h>
#include <tftpLib.h>
#include <ramDrv.h>
#include <rawFsLib.h>
#include <bootLoadLib.h>
#include <flash/server_flash.h>
#include <flash/mx29lv640bt.c>
/*
 *FUNCPTR:  check the checksum of the file from flash to mem 
 */
int check_checksum(char *p1,char *p2,int filesize)
{
  int i,sum;
  int checksum1,checksum2;
  char *ptr;
  sum=0;
  ptr=p1;
  checksum1=(int)(*ptr<<24)+(int)(*(ptr+1)<<16)+(int)(*(ptr+2)<<8)+(int)(*(ptr+3));
  ptr=p2;
  for(i=0;i<filesize;i++){
       sum=sum+(*ptr);
       ptr++;
  }
  checksum2=sum%filesize;
  if(checksum1==checksum2)
      return OK;
  else
      return ERROR;
} 


/*
 *FUNCPTR: process the file and write it to flash
 */       
int f_boot_write_to_flash(char *host,char *filename,int data_flag)
 {
   int i,byte_num;
   int block_num,block_left;
   int filefd,errorfd;
   int sequence,count=0;
   char *data,*p,*ptr;
   char *firmware_addr;
   char buf[BUFFERSIZE+1];
   
   if((data=(char *)malloc(ALLOC_FILE_SIZE))==NULL){                /*分配空间*/
        printf("Alloc Memory of 0x%x Is Error\n",ALLOC_FILE_SIZE);
        return ERROR;
   }
   if(tftpXfer(host,0,filename,"get","binary", &filefd,
                  &errorfd) == ERROR){ 
       free(data);           	
       return ERROR;
   }        
   p=data;
   i=0;
   printf("Downloading file from server......\n");
   while((byte_num=read(filefd,buf,sizeof(buf)))>0){ 
         ptr=buf;
         count=count+byte_num; 
         if(count>ALLOC_FILE_SIZE){
             printf("Not enough room to load the system file\n");
             close(filefd);
             close(errorfd);
             free(data);  
             return ERROR;
         }    
         memcpy((void *)p,(const void *)ptr,byte_num);
         p=p+byte_num;
         i++;
         if(i>8){
              i=0;
              printf("%8d\r",count);
         }
   }    
   close(filefd);
   close(errorfd);
   printf("File_size=%d\n",count);             
   p=data;
   if(check_mfile_header(p)==ERROR){
       printf("File header is error\n");	            
       free(data);
       return ERROR;
   }
   p=data;
   if(check_mfile_checksum(p,count)==ERROR){
       printf("File checksum is error\n");	    
       free(data);
       return ERROR;
   }
    /*p=data;
   k=check_mfile_version(p); */        
   p=data+count;
   count=count-(M_header_len+6);
   buf[0]=(char)((count>>24) & 0xff); 	
   buf[1]=(char)((count>>16) & 0xff);
   buf[2]=(char)((count>>8) & 0xff);
   buf[3]=(char)(count & 0xff);
   bcopy((const char *)data,&buf[4],M_header_len+6); 
   block_num=count/0x10000+1;
   block_left=0x10000-(count%0x10000);
   memset((void *)p,0xff,block_left);     /*将剩余的数据用0xff填充为a block*/   
   printf("Start writing to flash......\n");
   sequence=f_server_check_data((S_SERVER_FLASH_DATA *)(FLASH_BASE_ADDRESS0+FLASH_FIRMWARE_CHECK),
   		(S_SERVER_FLASH_DATA *)(FLASH_BASE_ADDRESS1+FLASH_FIRMWARE_CHECK),&data_flag);   
   if(!sequence){
   	firmware_addr=(char *)FLASH_BASE_ADDRESS0;
   	data_flag=0;	
   	sequence=0;
   }else{
   	 if(data_flag){
		firmware_addr=(char *)FLASH_BASE_ADDRESS0;
		data_flag=0;
	 }else{
		firmware_addr=(char *)FLASH_BASE_ADDRESS1;
		data_flag=1;
         }
   }
   flash_driver.erase_one_sector(firmware_addr,firmware_addr+FLASH_FIRMWARE_CHECK); 
   flash_driver.erase_one_sector(firmware_addr,firmware_addr+FLASH_FIRMWARE_CHECK2); 	      
   p=data+M_header_len+6;     
   for(i=0;i<block_num;i++){
         flash_driver.program_one_block((void *)firmware_addr,(unsigned char *)(p+i*0x10000),(unsigned char *)((firmware_addr+FLASH_FIRMWARE_ADDR)+i*0x10000));
         printf("%3d",i*100/block_num);
         printf("%c\r",'%');
   }
   p=(char *)(firmware_addr+FLASH_FIRMWARE_CHECK2);
   for(i=0;i<(M_header_len+6+4);i++){
         flash_driver.program_one_byte((void *)firmware_addr,buf[i],p++);
   }   
   f_server_save_firmware(data_flag,sequence+1);
   printf("Write system's file to flash is ok\n");                                        
   free(data);
   return OK;	
}


/*   
 *FUNCPTR:copy data from the FLASH to MEM 0x10000 and check the check_sum.  
 */                  
int f_boot_flash_load(int bootflag,FUNCPTR *pEntry)
{
  int size=0;
  char *ptr=NULL;
  BLK_DEV               *pBlkDev;
  RAW_VOL_DESC		*pVolDesc;
  BLK_DEV               *pBlkDev1;
  RAW_VOL_DESC		*pVolDesc1;
  int fd1,fd,fdold;
  /*hzk add 2004.10.19*/
  ramDrv();
  if(rawFsInit(3)==ERROR){
  	printf("Init raw file system driver is error\n");
  	return ERROR;	
  }
  if((pBlkDev = (BLK_DEV *)ramDevCreate(0,1024,0,4*1024,0))== NULL){ 
    	   printf("Create ram disk is error\n");
    	   return ERROR;
  }    
  if((pVolDesc =rawFsDevInit("Nespyimage", pBlkDev))==NULL){
  	printf("Create raw file system is error\n");
  	return ERROR;	
  }
  if((fd=open("Nespyimage",O_RDWR,0))==ERROR){
  	printf("create netspy image is error\n");
  	return ERROR;	
  }
  if((pBlkDev1 = (BLK_DEV *)ramDevCreate(0,512,0,1,0))== NULL){ 
    	   printf("Create ram disk1 is error\n");
    	   return ERROR;
  }    
  if((pVolDesc1 =rawFsDevInit("Nespyimage1", pBlkDev1))==NULL){
  	printf("Create raw file system1 is error\n");
  	return ERROR;	
  }
  if((fd1=open("Nespyimage1",O_RDWR,0))==ERROR){
  	printf("create netspy image1 is error\n");
  	return ERROR;	
  }
  /*hzk add 2004.10.19 end*/
  if(bootflag == 0){
  	printf("Booting From FlashM0 Is Beginning.....\n");
       	ptr=(char *)(FLASH_BASE_ADDRESS0+FLASH_FIRMWARE_CHECK2);
  	size=(int)((*ptr)<<24)+(int)((*(ptr+1))<<16)+(int)((*(ptr+2))<<8)+(int)(*(ptr+3));
  	ptr=(char *)(FLASH_BASE_ADDRESS0+FLASH_FIRMWARE_ADDR);
  	if(check_checksum((char *)(FLASH_BASE_ADDRESS0+FLASH_FIRMWARE_CHECK2+M_header_len+6),(char *)(FLASH_BASE_ADDRESS0+FLASH_FIRMWARE_ADDR),size)==ERROR){
  	    printf("Check_sum from flash0 is error,addr=0x%x\n",(unsigned int)(FLASH_BASE_ADDRESS0+FLASH_FIRMWARE_ADDR));
  	    return ERROR;
  	} 	
  }
  if(bootflag == 1){
  	printf("Booting From FlashM1 Is Beginning.....\n");
       	ptr=(char *)(FLASH_BASE_ADDRESS1+FLASH_FIRMWARE_CHECK2);
  	size=(int)((*ptr)<<24)+(int)((*(ptr+1))<<16)+(int)((*(ptr+2))<<8)+(int)(*(ptr+3));
  	ptr=(char *)(FLASH_BASE_ADDRESS1+FLASH_FIRMWARE_ADDR);
  	if(check_checksum((char *)(FLASH_BASE_ADDRESS1+FLASH_FIRMWARE_CHECK2+M_header_len+6),(char *)(FLASH_BASE_ADDRESS1+FLASH_FIRMWARE_ADDR),size)==ERROR){
  	    printf("Check_sum from flash1 is error,addr=0x%x\n",(unsigned int)(FLASH_BASE_ADDRESS1+FLASH_FIRMWARE_ADDR));
  	    return ERROR;
  	}  
  }
  if(write(fd,ptr,size)!=size){
  	printf("write image file is error\n");
  	return ERROR;	
  }
  close(fd);
  if((fd=open("Nespyimage",O_RDONLY,0))==ERROR){
  	printf("open netspy image is error\n");
  	return ERROR;	
  }
  fdold=ioGlobalStdGet(STD_OUT);
  ioGlobalStdSet(STD_OUT, fd1);
  if(bootLoadModule(fd, pEntry)!=OK){
  	ioGlobalStdSet(STD_OUT, fdold);
  	printf("Load the image is error size=%d\n",size);
  	close(fd);
  	return ERROR;	
  }
  ioGlobalStdSet(STD_OUT, fdold);
  close(fd); 
  if(bootflag){
  	 printf("Booting From FlashM1 Is Ok\n"); 	
  }else{
  	printf("Booting From FlashM0 Is Ok\n");
  }               
  return OK;
}         


/*
 *FUNCPTR:check the header_flags of the manager_board's software 
 */   	 
int check_mfile_header(char *ptr)
{
  int i;
  char headbuf[M_header_len+1];
  for(i=0;i<M_header_len;i++){
       headbuf[i]=*ptr;
       ptr++;
   }
   headbuf[i]=0;
   if(strcmp((const char *)headbuf,M_file_header)==0)
       return OK;
   else
       return ERROR;
} 
   	 
   	 
/*
 *FUNCPTR:check the checksum of the manager_board's software 
 */
int check_mfile_checksum(char *pdata,int byte_count)
{
  int i,sum,count;
  int checksum1,checksum2;
  char *q;
  sum=0;
  q=pdata+M_header_len+2;
  checksum1=(int)(*q<<24)+(int)(*(q+1)<<16)+(int)(*(q+2)<<8)+(int)(*(q+3));
  q=pdata+M_header_len+6;
  count=byte_count-(M_header_len+6);
  for(i=0;i<count;i++){
       sum=sum+(*q);
       q++;
   }
  checksum2=sum%count;
  if(checksum1==checksum2)
      return OK;
  else
      return ERROR;
}


/*
 *FUNCPTR:  check the file_version on Manager_board.
 *RETURN:   0  update file directly ,not to send msg 
 *          1  the file has been existed ,send msg to manager
 *          2  the file is older,send msg to manager.    
 */             
/*gjy add-- 未用,扩展时使用 */
/* 
int check_mfile_version(char *ptr)    
{
  char *q;
  char *v1,*v2,*v3,*v4;
  u_short vm0,vm1,vm;
  v1=(char *)(manager0_bod_version);
  v2=(char *)(manager0_bod_version+1);
  v3=(char *)(manager1_bod_version);
  v4=(char *)(manager1_bod_version+1);
  vm0=(u_short)(*v1<<8)+(u_short)(*v2);
  vm1=(u_short)(*v3<<8)+(u_short)(*v4);
  q=ptr+M_header_len;
  vm=(u_short)(*q<<8)+(u_short)(*(q+1));
  if(vm1>vm0){
     if(vm==vm1)
     	 return 1;
     if(vm<vm1)
         return 2;
  }
  if(vm1<vm0){
     if(vm==vm0)
         return 1;
  }       
  return 0;
}
*/

	  
/*
 *FUNCPTR:erase the 4K data and modify it 
 */
static char write_symbol_flash_mem[0x1000];
void write_symbol_flash(void * flash_flag_addr,char *flagptr)
{
   char *data,*p,*q;
   char i;
   data=write_symbol_flash_mem;
   memcpy((void *)data,(const void *)(flash_identity_addr_start),0x1000);
   p=data;
   q=flagptr;
   switch((int)flash_flag_addr)
         {                                                                                             
           case system_mac_addr: for(i=0;i<6;i++){
           	                      *p=*q;
           	                      p++;
           	                      q++;
           	                  }
           	                  break;       
           case device_date_address: for(i=0;i<DEVICE_DATE_LEN;i++){
           	                      *(p+0x10)=*q;
           	                      p++;
           	                      q++;
           	                  } 
           	                  break;	
           case device_id_address: for(i=0;i<DEVICE_ID_LEN;i++){
           	                      *(p+0x20)=*q;
           	                      p++;
           	                      q++;
           	                  } 
           	                  p=data;
           	                  *(p+0x70)=0x52;
           	                  *(p+0x71)=0xed;
           	                  break;
           case user_set_macaddr: for(i=0;i<6;i++){
           	                      *(p+0x90)=*q;
           	                      p++;
           	                      q++;
           	                  }
           	                  break;       	   	                                       
           case read_default_macflag: for(i=0;i<4;i++){
           	                          *(p+0xa0)=*q;
           	                          p++;
           	                          q++;
           	                      }
           	                      break;       	   	 
         }
   flash_driver.program_one_sector8((void *)FLASH_BASE_ADDRESS0,(unsigned char *)data,(unsigned char *)flash_identity_addr_start);
   return;
}



    	         

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -