SDK 镜像整合工具

来源:互联网 发布:notepad格式化php代码 编辑:程序博客网 时间:2024/05/29 19:43

镜像整合工具其实就是将不同的二进制镜像文件写入到一个文件中,貌似有

现成的工具可以用,但是为了开发方便,还是自己写了一段code实现该功能

直接上code:

#include <stdio.h>
#include <sys/ioctl.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdbool.h>


unsigned long int GetImgSize(char *path);
char CheckImg(char *path);


//where to save image header(flash_hdr) data
#define IMGHDR_START    0x00000000
//define the flash image size produced
//#define IMAGE_LEN       0x01000000


//image path
#define PATH_SPIBOOT "spiboot.bin"
#define PATH_UBOOT "u-boot.bin"
#define PATH_KERNEL "uImage"
#define PATH_ROOTFS "jffs2.img"
#define PATH_APP1 "APP1.img"
#define PATH_APP2 "APP2.img"
#define PATH_PARSER "parse.bin"


#define PATH_FLASHIMG "update.img"


//image version
#define VER_SPIBOOT 141225
#define VER_UBOOT VER_SPIBOOT//Realease data
#define VER_KERNEL301224 //kernel version
#define VER_ROOTFS 141220
#define VER_APP1 141219
#define VER_APP2 141219


//The size between different images.
#define IMG_FILL_NONE 0x00002000
#define IMG_HEADER_LEN 0x00004000
//Add 0x40000(256K) for header and separate all kinds of image;
#define IMG_RESERVE 0x00040000


//Image address in flash image
#define SPIBOOT_START   (IMG_HEADER_LEN+IMG_FILL_NONE)//0x00000000


#define UBOOT_START     ((CheckImg(PATH_SPIBOOT)==true)?(SPIBOOT_START+IMG_FILL_NONE+GetImgSize(PATH_SPIBOOT)):(SPIBOOT_START))//0x00000400


#define KERNEL_START ((CheckImg(PATH_UBOOT)==true)?(UBOOT_START+IMG_FILL_NONE+GetImgSize(PATH_UBOOT)) :(UBOOT_START))//0x00040000


#define ROOTFS_START    ((CheckImg(PATH_KERNEL)==true)?(KERNEL_START+IMG_FILL_NONE+GetImgSize(PATH_KERNEL)):(KERNEL_START))//0x00300000


#define APP1_START      ((CheckImg(PATH_ROOTFS)==true)?(ROOTFS_START+IMG_FILL_NONE+GetImgSize(PATH_ROOTFS)):(ROOTFS_START))//0x00C00000


#define APP2_START      ((CheckImg(PATH_APP1)==true)?(APP1_START+IMG_FILL_NONE+GetImgSize(PATH_APP1)):(APP1_START))//0x00D00000


unsigned int IMG_LEN;


typedef struct flash_image_header{

char reserve[940];
/*
  set the value:IVYEK (means the flash image is for this machine)
  u-boot can get it by getenv("hostname");//hostname is IVYEK
*/
char img_machine[6];
/*
  Inc_image[0]:spiboot.bin
  Inc_image[1]:u-boot.bin. If set true means the flash image include it. It maybe need update.
  Inc_image[2]:uImage(kernel). Inc_image[3]:rootfs. Inc_image[4]:app1. Inc_image[5]:app2. 
*/
char Inc_img[6];
/*
  The uboot read this and compare with the firmware env in spiflash to decide if the
  image need update.
*/
int img_version[6];
/*
  The start address of different image in the flash image.
*/
unsigned int img_start[6];
/*
  The size of the image included in the flash image.
*/
unsigned int img_size[6];


}flash_hdr;


//check image exist?
char CheckImg(char *path)
{
FILE *fr;


        if(fr = fopen(path,"r"))
{
fclose(fr);
return true;
}
else
{
printf("WARNING: cannot get IMG:%s!!\n",path);
return false;
}
}


//get image size if exist
unsigned long int GetImgSize(char *path)
{


FILE *fr;
unsigned long int Filelen;
        if(fr = fopen(path,"r"))
{
fseek(fr,0,SEEK_END);
Filelen = ftell(fr);
//printf("Get %s length:%lu\n",path,Filelen);
fclose(fr);
return Filelen;
}
else
{
//printf("WARNING: cannot get IMG:%s!!\n",path);
return false;
}


}


//produce image header infomation
void GetImgHdr(FILE* fw)
{
char hdr[1024];
flash_hdr *Imghdr;


memset((void*)hdr,0xFF,1024*sizeof(char));
Imghdr = (flash_hdr *)hdr;


Imghdr->img_machine[0] = 'I';
Imghdr->img_machine[1] = 'V';
Imghdr->img_machine[2] = 'Y';
Imghdr->img_machine[3] = 'E';
Imghdr->img_machine[4] = 'V';
Imghdr->img_machine[5] = 'K';


if(CheckImg(PATH_SPIBOOT))
{
Imghdr->Inc_img[0] = CheckImg(PATH_SPIBOOT);
Imghdr->img_version[0] = VER_SPIBOOT;
Imghdr->img_start[0] = SPIBOOT_START;
Imghdr->img_size[0] = GetImgSize(PATH_SPIBOOT)+16;
}
else
{
Imghdr->Inc_img[0] = 0;
Imghdr->img_version[0] = VER_SPIBOOT;
Imghdr->img_start[0] = SPIBOOT_START;
Imghdr->img_size[0] = 0;
}


if(CheckImg(PATH_UBOOT))
{
Imghdr->Inc_img[1] = CheckImg(PATH_UBOOT);
Imghdr->img_version[1] = VER_UBOOT;
Imghdr->img_start[1] = UBOOT_START;
Imghdr->img_size[1] = GetImgSize(PATH_UBOOT);
}
else
{
Imghdr->Inc_img[1] = 0;
Imghdr->img_version[1] = VER_UBOOT;
Imghdr->img_start[1] = UBOOT_START;
Imghdr->img_size[1] = 0;
}


if(CheckImg(PATH_KERNEL))
{
Imghdr->Inc_img[2] = CheckImg(PATH_KERNEL);
Imghdr->img_version[2] = VER_KERNEL;
Imghdr->img_start[2] = KERNEL_START;
Imghdr->img_size[2] = GetImgSize(PATH_KERNEL);
}
else
{
Imghdr->Inc_img[2] = 0;
Imghdr->img_version[2] = VER_KERNEL;                                 
Imghdr->img_start[2] = KERNEL_START;
Imghdr->img_size[2] = 0;
}


if(CheckImg(PATH_ROOTFS))
{
Imghdr->Inc_img[3] = CheckImg(PATH_ROOTFS);
Imghdr->img_version[3] = VER_ROOTFS;
Imghdr->img_start[3] = ROOTFS_START;
Imghdr->img_size[3] = GetImgSize(PATH_ROOTFS);
}
else
{
Imghdr->Inc_img[3] = 0;
Imghdr->img_version[3] = VER_ROOTFS;
Imghdr->img_start[3] = ROOTFS_START;
Imghdr->img_size[3] = 0;
}


if(CheckImg(PATH_APP1))
{
Imghdr->Inc_img[4] = CheckImg(PATH_APP1);
Imghdr->img_version[4] = VER_APP1;
Imghdr->img_start[4] = APP1_START;
Imghdr->img_size[4] = GetImgSize(PATH_APP1);
}
else
{
Imghdr->Inc_img[4] = 0;
Imghdr->img_version[4] = VER_APP1;
Imghdr->img_start[4] = APP1_START;
Imghdr->img_size[4] = 0;
}
#if 1
#if 0
if(CheckImg(PATH_APP2))
{
Imghdr->Inc_img[5] = CheckImg(PATH_APP2);
Imghdr->img_version[5] = VER_APP2;
Imghdr->img_start[5] = APP2_START;
Imghdr->img_size[5] = GetImgSize(PATH_APP2);
}
else
#endif
{
Imghdr->Inc_img[5] = 0;
Imghdr->img_version[5] = VER_APP2;
Imghdr->img_start[5] = APP2_START;
Imghdr->img_size[5] = 0;
}
#endif
fseek(fw,IMGHDR_START,SEEK_SET);
fwrite((void *)hdr,sizeof(unsigned char),1024,fw);


}


int main(int argc, char *argv[])
{
FILE* fr;
FILE* fw;


char *spiboot_f= PATH_SPIBOOT;
char *uboot_f = PATH_UBOOT;
char *uImage_f= PATH_KERNEL;
char *jffs_f = PATH_ROOTFS;
char *app1_f = PATH_APP1;
char *app2_f = PATH_APP2;
//spi image
char *updat_f = PATH_FLASHIMG;


char ch;


//get the whole flash image size
IMG_LEN = GetImgSize(PATH_SPIBOOT) + GetImgSize(PATH_UBOOT) + 
GetImgSize(PATH_KERNEL) + GetImgSize(PATH_ROOTFS) + 
GetImgSize(PATH_APP1) /*+ GetImgSize(PATH_APP2)*/ + IMG_RESERVE;


//produce a Flash Image
if(fw = fopen(updat_f,"w+"))
{
char *buf = (char *)malloc(IMG_LEN*sizeof(char));
memset((void*)buf,0xFF,IMG_LEN*sizeof(char));
fwrite((void *)buf,sizeof(unsigned char),IMG_LEN,fw);
}
#if 1
unsigned char buf_header[16] = {0xEF,0xBE,0xEF,0xBE,0xEF,0xBE,0xEF,0xBE,0xEF,0xBE,0xEF,0xBE,0xEF,0xBE,0xEF,0xBE};
fseek(fw,(SPIBOOT_START),SEEK_SET);
fwrite((void *)buf_header,sizeof(unsigned char),16,fw);


if(fr = fopen(spiboot_f,"r"))
{
fseek(fw,(SPIBOOT_START+16),SEEK_SET);

while(fscanf(fr,"%c",&ch)!=EOF)
fprintf(fw,"%c",ch);

fclose(fr);
}


#endif


#if 1
        if(fr = fopen(uboot_f,"r"))
{
fseek(fw,(UBOOT_START),SEEK_SET);


while(fscanf(fr,"%c",&ch)!=EOF)
fprintf(fw,"%c",ch);


fclose(fr);
}
#endif
if(fr = fopen(uImage_f,"r"))
{


fseek(fw,(KERNEL_START),SEEK_SET);


while(fscanf(fr,"%c",&ch)!=EOF)
fprintf(fw,"%c",ch);


fclose(fr);
}


if(fr = fopen(jffs_f,"r"))
{
fseek(fw,(ROOTFS_START),SEEK_SET);


while(fscanf(fr,"%c",&ch)!=EOF)
fprintf(fw,"%c",ch);


fclose(fr);
}


if(fr = fopen(app1_f,"r"))
{
fseek(fw,(APP1_START),SEEK_SET);


while(fscanf(fr,"%c",&ch)!=EOF)
fprintf(fw,"%c",ch);

fclose(fr);




}

GetImgHdr(fw);

fclose(fw);
}

在生成的镜像中,除了包含所有需要的bootloader/kernel/rootfs/app等镜像外,

还包含了一个header,该header中包含了各个镜像的版本大小等信息,在uboot

中使用命令烧写SPI时会分心header来确定对那个模块进行升级。

0 0
原创粉丝点击