int dfread_header(file_info * headp) { int isize, flsize; FILE *fp; cmndln_info *linep; char buf[80]; int len; fp = headp->dspfinfp; len = strlen(DSPF_ID); fseek(fp, 0L, 0); /* rewind file */ /*read in header information and store in File_info struct */ if (!fread(buf, 1, len, fp)) return (-1); buf[len] = 0; if (strncmp(DSPF_ID, buf, len)) { if (!strncmp("dspf003.01", buf, len)) return (dfread_header_old(headp, fp)); fprintf(stderr, "Error: header mismatch '%s' - '%s'\n", DSPF_ID, buf); return (-1); } linep = &(headp->linefax); isize = sizeof(int); flsize = sizeof(float); if (!fread(&headp->xdim, isize, 1, fp)) return (-1); if (!fread(&headp->ydim, isize, 1, fp)) return (-1); if (!fread(&headp->zdim, isize, 1, fp)) return (-1); if (!fread(&headp->min, flsize, 1, fp)) return (-1); if (!fread(&headp->max, flsize, 1, fp)) return (-1); if (!fread(&linep->litmodel, isize, 1, fp)) return (-1); if (!fread(&linep->nthres, isize, 1, fp)) return (-1); if (!fread(linep->tvalue, flsize, linep->nthres, fp)) return (-1); if (!fread(&headp->Lookoff, isize, 1, fp)) return (-1); if (!fread(&headp->Dataoff, isize, 1, fp)) return (-1); print_head_info(headp); return (1); }
int dfread_header_old(file_info * headp, FILE * fp) { int isize, flsize; cmndln_info *linep; float tmp; linep = &(headp->linefax); isize = sizeof(int); flsize = sizeof(float); if (!fread(&headp->xdim, isize, 1, fp)) return (-1); if (!fread(&headp->ydim, isize, 1, fp)) return (-1); if (!fread(&headp->zdim, isize, 1, fp)) return (-1); if (!fread(&tmp, flsize, 1, fp)) return (-1); if (!fread(&tmp, flsize, 1, fp)) return (-1); if (!fread(&tmp, flsize, 1, fp)) return (-1); if (!fread(&headp->min, flsize, 1, fp)) return (-1); if (!fread(&headp->max, flsize, 1, fp)) return (-1); if (!fread(&linep->litmodel, isize, 1, fp)) return (-1); if (!fread(&linep->nthres, isize, 1, fp)) return (-1); if (!fread(linep->tvalue, flsize, linep->nthres, fp)) return (-1); if (!fread(&headp->Lookoff, isize, 1, fp)) return (-1); if (!fread(&headp->Dataoff, isize, 1, fp)) return (-1); print_head_info(headp); return (1); }
static int pack_firmware(FILE *fp_w, uint32 offst, int num, char *name[]) { FILE *fp_r; int i, j; uint32 curptr, extcrc; char ch; package_header_t *phd = &p_head; image_info_t *iif; /* read version file */ if ((fp_r = fopen(UBOOT_VER_FILE, "rb")) == NULL) { printf("Can't open uboot version file: %s\n", UBOOT_VER_FILE); return(-1); } j=0; while (1) { if (feof(fp_r)) break; if (j > VER_LIMIT_LEN+1) { printf("uboot version can't be longer than 14\n"); goto bail; } phd->p_vuboot[j] = fgetc(fp_r); if ((phd->p_vuboot[j]==0x0d) || (phd->p_vuboot[j]==0x0a)) phd->p_vuboot[j] = '\0'; j++; } fclose(fp_r); if ((fp_r = fopen(KERNEL_VER_FILE, "rb")) == NULL) { printf("Can't open kernel version file: %s\n", KERNEL_VER_FILE); return(-1); } j=0; while (1) { if (feof(fp_r)) break; if (j > VER_LIMIT_LEN+1) { printf("kernel version can't be longer than 14\n"); goto bail; } phd->p_vkernel[j]=fgetc(fp_r); if ((phd->p_vkernel[j]==0x0d) || (phd->p_vkernel[j]==0x0a)) phd->p_vkernel[j] = '\0'; j++; } fclose(fp_r); if ((fp_r = fopen(ROOTFS_VER_FILE, "rb")) == NULL) { printf("Can't open rootfs version file: %s\n", ROOTFS_VER_FILE); return(-1); } j=0; while (1) { if (feof(fp_r)) break; if (j > VER_LIMIT_LEN+1) { printf("rootfs version can't be longer than 14\n"); goto bail; } phd->p_vrootfs[j] = fgetc(fp_r); if ((phd->p_vrootfs[j]==0x0d) ||(phd->p_vrootfs[j]==0x0a)) phd->p_vrootfs[j] = '\0'; j++; } fclose(fp_r); phd->p_imagenum = (uint8)num; phd->p_headsize = sizeof(package_header_t) + phd->p_imagenum * sizeof(image_info_t); /* Bit[3] use to indicate osd2.0 package */ phd->p_reserve = 0x08; phd->p_datasize = 0; phd->p_datacrc = 0; phd->p_headcrc = 0; curptr = phd->p_headsize + sizeof(version_info); for (i=0; i < phd->p_imagenum; i++) { /* image info */ iif = &i_info[i]; if (strncmp(name[i], ROOTFS_FILE_NAME, strlen(ROOTFS_FILE_NAME)) == 0) { iif->i_type = IH_TYPE_ROOTFS; strncpy((char *)iif->i_name, ROOTFS_FILE_NAME, NAMELEN-1); if ((fp_r = fopen(ROOTFS_VER_FILE, "rb")) == NULL) { printf("Can't open kernel version file: %s\n", ROOTFS_VER_FILE); break; } for (j = 0; j < sizeof(iif->i_version); j++) { if (feof(fp_r)) break; iif->i_version[j] = fgetc(fp_r); if ((iif->i_version[j]==0x0d) || (iif->i_version[j]==0x0a)) iif->i_version[j] = '\0'; } fclose(fp_r); } else if (strncmp(name[i], KERNEL_FILE_NAME, strlen(KERNEL_FILE_NAME)) == 0) { iif->i_type = IH_TYPE_KERNEL; strncpy((char *)iif->i_name, KERNEL_FILE_NAME, NAMELEN-1); if ((fp_r = fopen(KERNEL_VER_FILE, "rb")) == NULL) { printf("Can't open kernel version file: %s\n", KERNEL_VER_FILE); break; } for (j = 0; j < sizeof(iif->i_version); j++) { if (feof(fp_r)) break; iif->i_version[j] = fgetc(fp_r); if ((iif->i_version[j]==0x0d) ||(iif->i_version[j]==0x0a)) iif->i_version[j] = '\0'; } fclose(fp_r); } else if (strncmp(name[i], UBOOT_FILE_NAME, strlen(UBOOT_FILE_NAME)) == 0) { iif->i_type = IH_TYPE_UBOOT; strncpy((char *)iif->i_name, UBOOT_FILE_NAME, NAMELEN-1); if ((fp_r = fopen(UBOOT_VER_FILE, "rb")) == NULL) { printf("Can't open uboot version file: %s\n", UBOOT_VER_FILE); break; } for (j = 0; j < sizeof(iif->i_version); j++) { if (feof(fp_r)) break; iif->i_version[j] = fgetc(fp_r); if ((iif->i_version[j]==0x0d)|| (iif->i_version[j]==0x0a)) iif->i_version[j] = '\0'; } fclose(fp_r); } else if (strncmp(name[i], SCRIPT_FILE_NAME, strlen(SCRIPT_FILE_NAME)) == 0) { iif->i_type = IH_TYPE_SCRIPT; strncpy((char *)iif->i_name, SCRIPT_FILE_NAME, NAMELEN-1); } /* address in flash*/ switch (iif->i_type) { case IH_TYPE_ROOTFS: iif->i_startaddr_f = ROOTFS_ADDR_START; iif->i_endaddr_f = ROOTFS_ADDR_END; break; case IH_TYPE_KERNEL: iif->i_startaddr_f = KERNEL_ADDR_START; iif->i_endaddr_f = KERNEL_ADDR_END; break; case IH_TYPE_UBOOT: iif->i_startaddr_f = UBOOT_ADDR_START; iif->i_endaddr_f = UBOOT_ADDR_END; break; case IH_TYPE_SCRIPT: break; default: printf("un-handle image type\n"); break; } /* write whole image to package and calculate the imagesize*/ iif->i_imagesize = 0; /* images file */ if ((fp_r = fopen(name[i], "rb")) == NULL) { printf("can't open file: %s\n", name[i]); break; } fseek(fp_w, offst+curptr,SEEK_SET); extcrc = 0; while (!feof(fp_r)) { ch = fgetc(fp_r); fputc(ch, fp_w); phd->p_datacrc = crc32(phd->p_datacrc,(uint8 *)&ch, 1); iif->i_imagesize ++; } fclose(fp_r); iif->i_startaddr_p = curptr-sizeof(version_info); curptr += iif->i_imagesize; phd->p_datasize += iif->i_imagesize; print_image_info(iif); /* print iff*/ /*write image info */ fseek(fp_w, offst+sizeof(version_info)+sizeof(package_header_t)+i*sizeof(image_info_t), SEEK_SET); if (fwrite(iif, sizeof(image_info_t), 1, fp_w) != 1) { printf("can not write iif into package\n"); break; } } /* write package head*/ phd->p_headcrc = crc32(phd->p_headcrc, (uint8 *)phd, sizeof(package_header_t)); phd->p_headcrc = crc32(phd->p_headcrc, (uint8 *)i_info, phd->p_imagenum*sizeof(image_info_t)); print_head_info(); /* print phd */ fseek(fp_w, offst+sizeof(version_info), SEEK_SET); if (fwrite((uint8 *)phd, sizeof(package_header_t), 1, fp_w) != 1) { printf("can not write head into package"); return(-1); } return 0; bail: fclose(fp_r); return -1; }