void main(int argc, char *argv[]) { FILE * fp1; FILE * fp2; char tmpFilename[50] = "packbin.XXXXXX"; unsigned char imgType; unsigned long imgSize,dateofday,timeofday; unsigned long padTo; struct stat fileStat; unsigned long i; unsigned char ch; unsigned char * pch; unsigned char chksum; fileImageHeader_t imghdr; struct timeval timeval; struct tm *ut; time_t tt; tt = time(NULL); gettimeofday(&timeval,NULL); //gmtime_r(&tt,&ut); ut=localtime(&tt); printf("date %04d/%02d/%02d %02d:%02d:%02d \n", 1900+ut->tm_year, ut->tm_mon+1, ut->tm_mday, ut->tm_hour, ut->tm_min, ut->tm_sec ); dateofday=((ut->tm_year+1900)<<16)+((ut->tm_mon+1)<<8)+(ut->tm_mday); timeofday=((ut->tm_hour)<<24)+((ut->tm_min)<<16)+((ut->tm_sec)<<8); printf("%08x %08x\n",dateofday,timeofday); /* Check arguments */ if (argc < 5) { printf("Usage: PACKBIN input_file image_type pad_to output_file\n"); printf(" input_file Name of the input binary image file.\n"); printf(" image_type [r|b|k] for [runtime|boot|kernel+fs].\n"); printf(" pad_to Size of the output binary image. (0 means no padding)\n"); printf(" output_file Name of the output binary image file.\n"); return; } /* Open file */ if ((fp1=fopen(argv[1], "r+b")) == NULL) { printf("Cannot open %s !!\n", argv[1]); return; } /* Get image type */ imgType = (unsigned char) *argv[2]; bzero((void *) &imghdr, sizeof(fileImageHeader_t)); switch (imgType) { case 'r': imghdr.imageType = ENDIAN_SWITCH16(RTL_IMAGE_TYPE_RUN); break; case 'b': imghdr.imageType = ENDIAN_SWITCH16(RTL_IMAGE_TYPE_BOOT); break; case 'k': imghdr.imageType = ENDIAN_SWITCH16(RTL_IMAGE_TYPE_KFS); break; default: printf("Image type error !!\n"); } /* Get padding size */ padTo = strtol(argv[3], NULL, 0); /* Get file size */ if (stat(argv[1], &fileStat) != 0) { printf("Cannot get file statistics !!\n"); fclose(fp1); exit(-1); } imgSize = fileStat.st_size; /* Check padding size */ if ( (padTo < imgSize + sizeof(fileImageHeader_t)) && (padTo != 0) ) { printf("Padding size error !!\n"); fclose(fp1); exit(-1); } if (!padTo) { if (imgSize%2) padTo=(imgSize+sizeof(fileImageHeader_t))+1; } printf("Image Original Size = 0x%lx\n", imgSize); /* Temparay file */ //tmpnam(tmpFilename); mkstemp(tmpFilename); if ((fp2=fopen(tmpFilename, "w+b")) == NULL) { printf("Cannot open temprary file !!\n"); return; } /* Copy image */ fseek(fp1, 0L, SEEK_SET); fseek(fp2, sizeof(fileImageHeader_t), SEEK_SET); chksum = 0; for (i=0; i<imgSize; i++) { ch = fgetc(fp1); fputc(ch, fp2); chksum ^= ch; } /* Padding */ if (padTo) while (i++ < (padTo - sizeof(fileImageHeader_t))) fputc(0, fp2); /* Forge image header */ printf(" Magic Number = 0x%lx\n", RTL_PRODUCT_MAGIC); imghdr.productMagic = ENDIAN_SWITCH32(RTL_PRODUCT_MAGIC); imghdr.imageHdrVer = RTL_IMAGE_HDR_VER_1_0; /* date and time to be implemented */ imghdr.date=ENDIAN_SWITCH32(dateofday); imghdr.time=ENDIAN_SWITCH32(timeofday); if (padTo) imghdr.imageLen = ENDIAN_SWITCH32(padTo - sizeof(fileImageHeader_t)); else imghdr.imageLen = ENDIAN_SWITCH32(imgSize); printf(" Body Checksum = 0x%x\n", chksum); imghdr.imageBdyCksm = chksum; /* Calculate header checksum */ pch = (unsigned char *) &imghdr; chksum = 0; for (i=0; i<(sizeof(fileImageHeader_t)-1); i++) chksum ^= *pch++; imghdr.imageHdrCksm = chksum; printf(" Header Checksum = 0x%x\n", chksum); /* Write header */ pch = (unsigned char *) &imghdr; fseek(fp2, 0L, SEEK_SET); for (i=0; i<sizeof(fileImageHeader_t); i++) fputc(*pch++, fp2); /* Close file and exit */ fclose(fp1); fclose(fp2); printf("Binary image %s generated!\n", argv[4]); remove(argv[4]); rename(tmpFilename, argv[4]); }
int main(int argc, char *argv[]) { FILE * fp1; FILE * fp2; char tmpFilename[50] = "packbin.XXXXXX"; unsigned long imgSize,dateofday,timeofday; struct stat fileStat; unsigned long i; unsigned char ch; //unsigned long boardMagic; long boardMagic; struct timeval timeval; struct tm *ut; time_t tt; tt = time(NULL); gettimeofday(&timeval,NULL); //gmtime_r(&tt,&ut); ut=localtime(&tt); printf("date %04d/%02d/%02d %02d:%02d:%02d \n", 1900+ut->tm_year, ut->tm_mon+1, ut->tm_mday, ut->tm_hour, ut->tm_min, ut->tm_sec ); dateofday=((ut->tm_year+1900)<<16)+((ut->tm_mon+1)<<8)+(ut->tm_mday); timeofday=((ut->tm_hour)<<24)+((ut->tm_min)<<16)+((ut->tm_sec)<<8); printf("%08lx %08lx\n",dateofday,timeofday); /* Check arguments */ if (argc < 4) { printf("Usage: PACKHDR board_magic input_file output_file\n"); printf(" board_magic Hardware board's magic id.\n"); printf(" input_file Name of the input binary image file.\n"); printf(" output_file Name of the output binary image file.\n"); return 0; } /* Get board_magic */ boardMagic = ENDIAN_SWITCH32(strtol(argv[1], NULL, 0)); if(boardMagic == 0x7fffffff || boardMagic == 0xffffff7f) boardMagic = 0xffffffff; printf("boardMagic=%x\n", boardMagic); /* Open file */ if ((fp1=fopen(argv[2], "r+b")) == NULL) { printf("Cannot open %s !!\n", argv[1]); return -1; } /* Get file size */ if (stat(argv[2], &fileStat) != 0) { printf("Cannot get file statistics !!\n"); fclose(fp1); exit(-1); } imgSize = fileStat.st_size; printf("Image Original Size = 0x%lx\n", imgSize); /* Temparay file */ //tmpnam(tmpFilename); mkstemp(tmpFilename); if ((fp2=fopen(tmpFilename, "w+b")) == NULL) { printf("Cannot open temprary file !!\n"); return -2; } /* Copy image */ fseek(fp1, 0L, SEEK_SET); fseek(fp2, 0L, SEEK_SET); fwrite((void*)&boardMagic, sizeof(boardMagic), 1, fp2); for (i=0; i<imgSize; i++) { ch = fgetc(fp1); fputc(ch, fp2); } /* Close file and exit */ fclose(fp1); fclose(fp2); printf("Binary image %s generated!\n", argv[3]); remove(argv[3]); rename(tmpFilename, argv[3]); return 0; }