📄 nc3016_boot.c.bak
字号:
#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/am29lv320mb.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 + -