13d0407baSopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 23d0407baSopenharmony_ci/* 33d0407baSopenharmony_ci * (C) Copyright Fuzhou Rockchip Electronics Co., Ltd 43d0407baSopenharmony_ci */ 53d0407baSopenharmony_ci 63d0407baSopenharmony_ci#include <stdint.h> 73d0407baSopenharmony_ci#include <stdio.h> 83d0407baSopenharmony_ci#include <stdlib.h> 93d0407baSopenharmony_ci 103d0407baSopenharmony_ci//#define DEBUG 113d0407baSopenharmony_ci#ifdef DEBUG 123d0407baSopenharmony_ci#define PRINTF(fmt, ...) printf(fmt, ##__VA_ARGS__) 133d0407baSopenharmony_ci#else 143d0407baSopenharmony_cistatic inline __attribute__ ((format(printf, 1, 2))) 153d0407baSopenharmony_ciint PRINTF(const char *fmt, ...) 163d0407baSopenharmony_ci{ 173d0407baSopenharmony_ci return 0; 183d0407baSopenharmony_ci} 193d0407baSopenharmony_ci#endif 203d0407baSopenharmony_ci 213d0407baSopenharmony_cistatic uint32_t gTable_Crc32[256] = { 223d0407baSopenharmony_ci 0x00000000, 0x04c10db7, 0x09821b6e, 0x0d4316d9, 233d0407baSopenharmony_ci 0x130436dc, 0x17c53b6b, 0x1a862db2, 0x1e472005, 243d0407baSopenharmony_ci 0x26086db8, 0x22c9600f, 0x2f8a76d6, 0x2b4b7b61, 253d0407baSopenharmony_ci 0x350c5b64, 0x31cd56d3, 0x3c8e400a, 0x384f4dbd, 263d0407baSopenharmony_ci 0x4c10db70, 0x48d1d6c7, 0x4592c01e, 0x4153cda9, 273d0407baSopenharmony_ci 0x5f14edac, 0x5bd5e01b, 0x5696f6c2, 0x5257fb75, 283d0407baSopenharmony_ci 0x6a18b6c8, 0x6ed9bb7f, 0x639aada6, 0x675ba011, 293d0407baSopenharmony_ci 0x791c8014, 0x7ddd8da3, 0x709e9b7a, 0x745f96cd, 303d0407baSopenharmony_ci 0x9821b6e0, 0x9ce0bb57, 0x91a3ad8e, 0x9562a039, 313d0407baSopenharmony_ci 0x8b25803c, 0x8fe48d8b, 0x82a79b52, 0x866696e5, 323d0407baSopenharmony_ci 0xbe29db58, 0xbae8d6ef, 0xb7abc036, 0xb36acd81, 333d0407baSopenharmony_ci 0xad2ded84, 0xa9ece033, 0xa4aff6ea, 0xa06efb5d, 343d0407baSopenharmony_ci 0xd4316d90, 0xd0f06027, 0xddb376fe, 0xd9727b49, 353d0407baSopenharmony_ci 0xc7355b4c, 0xc3f456fb, 0xceb74022, 0xca764d95, 363d0407baSopenharmony_ci 0xf2390028, 0xf6f80d9f, 0xfbbb1b46, 0xff7a16f1, 373d0407baSopenharmony_ci 0xe13d36f4, 0xe5fc3b43, 0xe8bf2d9a, 0xec7e202d, 383d0407baSopenharmony_ci 0x34826077, 0x30436dc0, 0x3d007b19, 0x39c176ae, 393d0407baSopenharmony_ci 0x278656ab, 0x23475b1c, 0x2e044dc5, 0x2ac54072, 403d0407baSopenharmony_ci 0x128a0dcf, 0x164b0078, 0x1b0816a1, 0x1fc91b16, 413d0407baSopenharmony_ci 0x018e3b13, 0x054f36a4, 0x080c207d, 0x0ccd2dca, 423d0407baSopenharmony_ci 0x7892bb07, 0x7c53b6b0, 0x7110a069, 0x75d1adde, 433d0407baSopenharmony_ci 0x6b968ddb, 0x6f57806c, 0x621496b5, 0x66d59b02, 443d0407baSopenharmony_ci 0x5e9ad6bf, 0x5a5bdb08, 0x5718cdd1, 0x53d9c066, 453d0407baSopenharmony_ci 0x4d9ee063, 0x495fedd4, 0x441cfb0d, 0x40ddf6ba, 463d0407baSopenharmony_ci 0xaca3d697, 0xa862db20, 0xa521cdf9, 0xa1e0c04e, 473d0407baSopenharmony_ci 0xbfa7e04b, 0xbb66edfc, 0xb625fb25, 0xb2e4f692, 483d0407baSopenharmony_ci 0x8aabbb2f, 0x8e6ab698, 0x8329a041, 0x87e8adf6, 493d0407baSopenharmony_ci 0x99af8df3, 0x9d6e8044, 0x902d969d, 0x94ec9b2a, 503d0407baSopenharmony_ci 0xe0b30de7, 0xe4720050, 0xe9311689, 0xedf01b3e, 513d0407baSopenharmony_ci 0xf3b73b3b, 0xf776368c, 0xfa352055, 0xfef42de2, 523d0407baSopenharmony_ci 0xc6bb605f, 0xc27a6de8, 0xcf397b31, 0xcbf87686, 533d0407baSopenharmony_ci 0xd5bf5683, 0xd17e5b34, 0xdc3d4ded, 0xd8fc405a, 543d0407baSopenharmony_ci 0x6904c0ee, 0x6dc5cd59, 0x6086db80, 0x6447d637, 553d0407baSopenharmony_ci 0x7a00f632, 0x7ec1fb85, 0x7382ed5c, 0x7743e0eb, 563d0407baSopenharmony_ci 0x4f0cad56, 0x4bcda0e1, 0x468eb638, 0x424fbb8f, 573d0407baSopenharmony_ci 0x5c089b8a, 0x58c9963d, 0x558a80e4, 0x514b8d53, 583d0407baSopenharmony_ci 0x25141b9e, 0x21d51629, 0x2c9600f0, 0x28570d47, 593d0407baSopenharmony_ci 0x36102d42, 0x32d120f5, 0x3f92362c, 0x3b533b9b, 603d0407baSopenharmony_ci 0x031c7626, 0x07dd7b91, 0x0a9e6d48, 0x0e5f60ff, 613d0407baSopenharmony_ci 0x101840fa, 0x14d94d4d, 0x199a5b94, 0x1d5b5623, 623d0407baSopenharmony_ci 0xf125760e, 0xf5e47bb9, 0xf8a76d60, 0xfc6660d7, 633d0407baSopenharmony_ci 0xe22140d2, 0xe6e04d65, 0xeba35bbc, 0xef62560b, 643d0407baSopenharmony_ci 0xd72d1bb6, 0xd3ec1601, 0xdeaf00d8, 0xda6e0d6f, 653d0407baSopenharmony_ci 0xc4292d6a, 0xc0e820dd, 0xcdab3604, 0xc96a3bb3, 663d0407baSopenharmony_ci 0xbd35ad7e, 0xb9f4a0c9, 0xb4b7b610, 0xb076bba7, 673d0407baSopenharmony_ci 0xae319ba2, 0xaaf09615, 0xa7b380cc, 0xa3728d7b, 683d0407baSopenharmony_ci 0x9b3dc0c6, 0x9ffccd71, 0x92bfdba8, 0x967ed61f, 693d0407baSopenharmony_ci 0x8839f61a, 0x8cf8fbad, 0x81bbed74, 0x857ae0c3, 703d0407baSopenharmony_ci 0x5d86a099, 0x5947ad2e, 0x5404bbf7, 0x50c5b640, 713d0407baSopenharmony_ci 0x4e829645, 0x4a439bf2, 0x47008d2b, 0x43c1809c, 723d0407baSopenharmony_ci 0x7b8ecd21, 0x7f4fc096, 0x720cd64f, 0x76cddbf8, 733d0407baSopenharmony_ci 0x688afbfd, 0x6c4bf64a, 0x6108e093, 0x65c9ed24, 743d0407baSopenharmony_ci 0x11967be9, 0x1557765e, 0x18146087, 0x1cd56d30, 753d0407baSopenharmony_ci 0x02924d35, 0x06534082, 0x0b10565b, 0x0fd15bec, 763d0407baSopenharmony_ci 0x379e1651, 0x335f1be6, 0x3e1c0d3f, 0x3add0088, 773d0407baSopenharmony_ci 0x249a208d, 0x205b2d3a, 0x2d183be3, 0x29d93654, 783d0407baSopenharmony_ci 0xc5a71679, 0xc1661bce, 0xcc250d17, 0xc8e400a0, 793d0407baSopenharmony_ci 0xd6a320a5, 0xd2622d12, 0xdf213bcb, 0xdbe0367c, 803d0407baSopenharmony_ci 0xe3af7bc1, 0xe76e7676, 0xea2d60af, 0xeeec6d18, 813d0407baSopenharmony_ci 0xf0ab4d1d, 0xf46a40aa, 0xf9295673, 0xfde85bc4, 823d0407baSopenharmony_ci 0x89b7cd09, 0x8d76c0be, 0x8035d667, 0x84f4dbd0, 833d0407baSopenharmony_ci 0x9ab3fbd5, 0x9e72f662, 0x9331e0bb, 0x97f0ed0c, 843d0407baSopenharmony_ci 0xafbfa0b1, 0xab7ead06, 0xa63dbbdf, 0xa2fcb668, 853d0407baSopenharmony_ci 0xbcbb966d, 0xb87a9bda, 0xb5398d03, 0xb1f880b4, 863d0407baSopenharmony_ci}; 873d0407baSopenharmony_ci 883d0407baSopenharmony_cistatic uint32_t CRC_32(uint8_t *aData, long aSize) 893d0407baSopenharmony_ci{ 903d0407baSopenharmony_ci long i; 913d0407baSopenharmony_ci uint32_t nAccum = 0; 923d0407baSopenharmony_ci 933d0407baSopenharmony_ci for (i = 0; i < aSize; i++) 943d0407baSopenharmony_ci nAccum = 953d0407baSopenharmony_ci (nAccum << 8) ^ gTable_Crc32[(nAccum >> 24) ^ *aData++]; 963d0407baSopenharmony_ci return nAccum; 973d0407baSopenharmony_ci} 983d0407baSopenharmony_ci 993d0407baSopenharmony_ci#define TAG_KERNEL 0x4C4E524B 1003d0407baSopenharmony_ci 1013d0407baSopenharmony_ciint main(int argc, char *argv[]) 1023d0407baSopenharmony_ci{ 1033d0407baSopenharmony_ci FILE *fid_in, *fid_out; 1043d0407baSopenharmony_ci size_t cnt; 1053d0407baSopenharmony_ci uint8_t *ptr1; 1063d0407baSopenharmony_ci long fileSize; 1073d0407baSopenharmony_ci int exit_code = 0; 1083d0407baSopenharmony_ci uint32_t crcData; 1093d0407baSopenharmony_ci 1103d0407baSopenharmony_ci PRINTF("mkkrnlimg V20111117\n"); 1113d0407baSopenharmony_ci PRINTF("cmd:%s %s [%s]\n", argv[1], argv[2], argv[3]); 1123d0407baSopenharmony_ci if (argc < 3) { 1133d0407baSopenharmony_ci printf("Usage: %s srcFile desFile [flag]\n", argv[0]); 1143d0407baSopenharmony_ci printf("sample:\n"); 1153d0407baSopenharmony_ci printf(" %s Image kernel.img\n", argv[0]); 1163d0407baSopenharmony_ci exit(1); 1173d0407baSopenharmony_ci } 1183d0407baSopenharmony_ci 1193d0407baSopenharmony_ci fid_in = fopen(argv[1], "rb"); 1203d0407baSopenharmony_ci if (fid_in == 0) { 1213d0407baSopenharmony_ci printf("input open NG !\n "); 1223d0407baSopenharmony_ci exit(2); 1233d0407baSopenharmony_ci } 1243d0407baSopenharmony_ci 1253d0407baSopenharmony_ci fid_out = fopen(argv[2], "wb"); 1263d0407baSopenharmony_ci if (fid_out == 0) { 1273d0407baSopenharmony_ci printf("output open NG !\n "); 1283d0407baSopenharmony_ci fclose(fid_in); 1293d0407baSopenharmony_ci exit(3); 1303d0407baSopenharmony_ci } 1313d0407baSopenharmony_ci fseek(fid_in, 0, SEEK_END); 1323d0407baSopenharmony_ci fileSize = ftell(fid_in); 1333d0407baSopenharmony_ci PRINTF("fileSize = %ld\n", fileSize); 1343d0407baSopenharmony_ci fseek(fid_in, 0, SEEK_SET); 1353d0407baSopenharmony_ci ptr1 = malloc(fileSize + 512 + 20); 1363d0407baSopenharmony_ci if (ptr1 == 0) { 1373d0407baSopenharmony_ci exit_code = 4; 1383d0407baSopenharmony_ci printf("\n malloc error!"); 1393d0407baSopenharmony_ci goto app_exit; 1403d0407baSopenharmony_ci } 1413d0407baSopenharmony_ci 1423d0407baSopenharmony_ci *(uint32_t *)ptr1 = TAG_KERNEL; 1433d0407baSopenharmony_ci *(uint32_t *)(ptr1 + 4) = fileSize; 1443d0407baSopenharmony_ci fwrite(ptr1, 1, 8, fid_out); 1453d0407baSopenharmony_ci cnt = fread(ptr1, 1, fileSize, fid_in); 1463d0407baSopenharmony_ci PRINTF("fread = %lu\n", cnt); 1473d0407baSopenharmony_ci crcData = CRC_32(ptr1, fileSize); 1483d0407baSopenharmony_ci PRINTF("crc = 0x%x\n", crcData); 1493d0407baSopenharmony_ci cnt = fwrite(ptr1, 1, fileSize, fid_out); 1503d0407baSopenharmony_ci PRINTF("fwrite = %lu\n", cnt); 1513d0407baSopenharmony_ci fwrite(&crcData, 1, 4, fid_out); 1523d0407baSopenharmony_ci 1533d0407baSopenharmony_ciapp_exit: 1543d0407baSopenharmony_ci fclose(fid_in); 1553d0407baSopenharmony_ci fclose(fid_out); 1563d0407baSopenharmony_ci if (ptr1) 1573d0407baSopenharmony_ci free(ptr1); 1583d0407baSopenharmony_ci exit(exit_code); 1593d0407baSopenharmony_ci} 160