216 lines
4.9 KiB
C
216 lines
4.9 KiB
C
#include <stdio.h>
|
||
#include <malloc.h>
|
||
#include <string.h>
|
||
#include "uboot_head.h"
|
||
|
||
|
||
typedef unsigned int u32;
|
||
|
||
|
||
void Usage(void)
|
||
{
|
||
printf("\n");
|
||
printf("Usage:\n");
|
||
printf("update_fdt.exe u-boot.bin xxx.dtb output_file.bin\n\n");
|
||
}
|
||
|
||
u32 randto1k(u32 num)
|
||
{
|
||
if(num % 1024)
|
||
{
|
||
printf("update_fdt: num %d randto1k\n", num);
|
||
return ((num+1023)/1024 * 1024);
|
||
}
|
||
else
|
||
{
|
||
return num;
|
||
}
|
||
}
|
||
|
||
int IsFullName(const char *FilePath)
|
||
{
|
||
if (isalpha(FilePath[0]) && ':' == FilePath[1])
|
||
{
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
void GetFullPath(char *dName, const char *sName)
|
||
{
|
||
char Buffer[256];
|
||
|
||
if(IsFullName(sName))
|
||
{
|
||
strcpy(dName, sName);
|
||
return ;
|
||
}
|
||
|
||
/* Get the current working directory: */
|
||
if(getcwd(Buffer, 256 ) == NULL)
|
||
{
|
||
perror( "getcwd error" );
|
||
return ;
|
||
}
|
||
sprintf(dName, "%s/%s", Buffer, sName);
|
||
}
|
||
|
||
int main(int argc, char* argv[])
|
||
{
|
||
char file_name1[256];
|
||
char file_name2[256];
|
||
char file_name3[256];
|
||
FILE *file1 = NULL;
|
||
FILE *file2 = NULL;
|
||
FILE *file3 = NULL;
|
||
unsigned int file1_len, file2_len,file1_len_align,file2_len_align;
|
||
unsigned char *file1_buffer = NULL;
|
||
unsigned char *file2_buffer = NULL;
|
||
unsigned char *file_dst_buffer = NULL;
|
||
//struct andr_img_hdr * img_hdr = NULL;
|
||
struct spare_boot_head_t * img_hdr = NULL;
|
||
|
||
if(argc != 4 )
|
||
{
|
||
Usage();
|
||
return -1;
|
||
}
|
||
|
||
printf("update_fdt: %s will merage %s, generate %s\n", argv[1], argv[2], argv[3]);
|
||
memset(file_name1, 0, sizeof(file_name1));
|
||
memset(file_name2, 0, sizeof(file_name2));
|
||
memset(file_name3, 0, sizeof(file_name3));
|
||
|
||
|
||
/*strcpy(file_name1, "boot.img");
|
||
strcpy(file_name2, "sun50iw1p1.dtb");
|
||
strcpy(file_name3, "test.img");*/
|
||
GetFullPath(file_name1, argv[1]);
|
||
GetFullPath(file_name2, argv[2]);
|
||
GetFullPath(file_name3, argv[3]);
|
||
|
||
//printf("%s will concatenate %s, generate %s", file_name1, file_name2, file_name3);
|
||
|
||
|
||
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><F2B2BBBF><EFBFBD>ʧ<EFBFBD><CAA7>
|
||
file1 = fopen(file_name1, "rb");
|
||
if(!file1)
|
||
{
|
||
printf("unable to open file %s\n", file_name1);
|
||
|
||
goto _err_out;
|
||
}
|
||
|
||
|
||
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><F2B2BBBF><EFBFBD>ʧ<EFBFBD><CAA7>
|
||
file2 = fopen(file_name2, "rb");
|
||
if(!file2)
|
||
{
|
||
printf("unable to open file %s\n", file_name2);
|
||
|
||
goto _err_out;
|
||
}
|
||
|
||
//file1
|
||
fseek(file1, 0, SEEK_END);
|
||
file1_len = ftell(file1);
|
||
fseek(file1, 0, SEEK_SET);
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
|
||
file1_buffer = (char *)malloc(file1_len+1);
|
||
if(file1_buffer == NULL)
|
||
{
|
||
printf("unable to malloc memory for udpate_fdt \n");
|
||
goto _err_out;
|
||
}
|
||
memset(file1_buffer,0,file1_len+1);
|
||
fread(file1_buffer, 1, file1_len, file1);
|
||
fclose(file1); file1 = NULL;
|
||
|
||
//img_hdr = (struct andr_img_hdr *)file1_buffer;
|
||
img_hdr = (struct spare_boot_head_t *)file1_buffer;
|
||
if (memcmp(img_hdr->boot_head.magic, UBOOT_MAGIC, 5)) {
|
||
puts("update_fdt: bad boot image magic, maybe not a uboot?\n");
|
||
goto _err_out;
|
||
}
|
||
|
||
//file2
|
||
fseek(file2, 0, SEEK_END);
|
||
file2_len = ftell(file2);
|
||
fseek(file2, 0, SEEK_SET);
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
|
||
file2_buffer = (char *)malloc(file2_len+1);
|
||
if(file2_buffer == NULL)
|
||
{
|
||
printf("unable to malloc memory for udpate_fdt \n");
|
||
goto _err_out;
|
||
}
|
||
memset(file2_buffer,0,file2_len+1);
|
||
fread(file2_buffer, 1, file2_len, file2);
|
||
fclose(file2); file2=NULL;
|
||
|
||
printf("---0x%x, 0x%x\n",file2_buffer[0],file2_buffer[1]);
|
||
if(!(file2_buffer[0] == 0xD0 && file2_buffer[1] == 0x0D))
|
||
{
|
||
puts("update_fdt: bad dtb magic, maybe not a dtb file?\n");
|
||
goto _err_out;
|
||
}
|
||
|
||
|
||
file1_len_align = randto1k(file1_len);
|
||
file2_len_align = randto1k(file2_len);
|
||
printf("file1_len = %x, file2_len = %x\n", file1_len_align, file2_len_align);
|
||
|
||
//update head
|
||
if(img_hdr->boot_data.dtb_offset != 0)
|
||
{
|
||
//update_uboot will check ,so clear it
|
||
img_hdr->boot_head.length = 0;
|
||
img_hdr->boot_head.uboot_length = 0;
|
||
//update uboot len
|
||
file1_len = file1_len_align = img_hdr->boot_data.dtb_offset;
|
||
}
|
||
else
|
||
{
|
||
img_hdr->boot_data.dtb_offset = file1_len_align;
|
||
}
|
||
//img_hdr->boot_data.dtb_size = file2_len_align;
|
||
printf("dtb offset %x,size %x \n", img_hdr->boot_data.dtb_offset,file2_len_align);
|
||
|
||
|
||
file_dst_buffer = (char *)malloc(file1_len_align+file2_len_align);
|
||
if(file_dst_buffer == NULL)
|
||
{
|
||
printf("unable to malloc memory for udpate_fdt \n");
|
||
goto _err_out;
|
||
}
|
||
memset(file_dst_buffer,0, file1_len_align+file2_len_align);
|
||
memcpy(file_dst_buffer, file1_buffer, file1_len);
|
||
memcpy(file_dst_buffer+file1_len_align, file2_buffer, file2_len);
|
||
|
||
//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><F2B2BBBF><EFBFBD>ʧ<EFBFBD><CAA7>
|
||
file3 = fopen(file_name3, "wb");
|
||
if(!file3)
|
||
{
|
||
printf("unable to open file %s\n", file_name3);
|
||
goto _err_out;
|
||
}
|
||
fwrite(file_dst_buffer, file1_len_align+file2_len_align, 1, file3);
|
||
fclose(file3); file3 = NULL;
|
||
|
||
printf("update_fdt:genrate %s ok\n",file_name3);
|
||
free(file_dst_buffer);
|
||
free(file1_buffer);
|
||
free(file2_buffer);
|
||
return 0;
|
||
|
||
_err_out:
|
||
if(file_dst_buffer != NULL) free(file_dst_buffer);
|
||
if(file1_buffer != NULL) free(file1_buffer);
|
||
if(file2_buffer != NULL) free(file2_buffer);
|
||
|
||
return -1;
|
||
}
|