Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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;
}