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
- SDK 镜像整合工具
- Android SDK镜像
- SDK 镜像网址
- SDK国内镜像
- android sdk 镜像
- Android SDK 国内镜像
- android sdk 国内镜像
- Android SDK 国内镜像
- Android SDK 国内镜像
- SDK更新国内镜像
- Android SDK镜像代理
- Android SDK镜像测试
- 国内Android SDK镜像
- Android SDK国内镜像
- android sdk国内镜像
- Android SDK 国内镜像
- android sdk 国内镜像
- Android SDK 国内镜像
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(5):数据初始化(四)
- 黑马程序员——java集合框架
- Yod Framework v1.3.5 发布,基于 C 的 PHP 框架
- BIRT参数设置详解
- 【LeetCode从零单排】No189.Rotate Array
- SDK 镜像整合工具
- Intent启动Activity,怎么匹配intent-Filter
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(6):执行,调度和渲染(一)
- 网络流模板
- 从今天开始开更博客
- Word2013 图片或数学公式显示不全解决方法
- Ubuntu常用软件安装及解决情况
- 小酱油开博大业,以此博客记录我的学习之路
- Oracle PLSQL语句实例