"Das U-Boot" Source Tree
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

tools: Import Rockchip loaderimage

+218
+3
tools/Makefile
··· 108 108 109 109 ROCKCHIP_OBS = generated/lib/rc4.o rkcommon.o rkimage.o rksd.o rkspi.o 110 110 111 + hostprogs-always-$(CONFIG_ROCKCHIP_RK3128) += loaderimage 112 + loaderimage-objs := rockchip/loaderimage.o generated/lib/sha1.o 113 + 111 114 # common objs for dumpimage and mkimage 112 115 dumpimage-mkimage-objs := aisimage.o \ 113 116 amlimage.o \
+215
tools/rockchip/loaderimage.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + #include "compiler.h" 3 + #include <version.h> 4 + #include <u-boot/sha1.h> 5 + 6 + #define MODE_PACK 0 7 + #define MODE_UNPACK 1 8 + #define UBOOT_NUM 4 9 + #define UBOOT_MAX_SIZE (1024*1024) 10 + #ifndef CONFIG_TEXT_BASE 11 + #define CONFIG_TEXT_BASE 0x60000000 12 + #endif 13 + 14 + #define LOADER_MAGIC_SIZE 16 15 + #define LOADER_HASH_SIZE 32 16 + 17 + #define RK_UBOOT_MAGIC "LOADER " 18 + #define RK_UBOOT_SIGN_TAG 0x4E474953 19 + #define RK_UBOOT_SIGN_LEN 256 20 + 21 + typedef struct tag_second_loader_hdr { 22 + uint8_t magic[LOADER_MAGIC_SIZE]; /* "LOADER " */ 23 + 24 + uint32_t loader_load_addr; /* physical load addr, default 0x60000000 */ 25 + uint32_t loader_load_size; /* size in bytes */ 26 + uint32_t crc32; /* crc32 */ 27 + uint32_t hash_len; /* 20 or 32, 0 is no hash */ 28 + uint8_t hash[LOADER_HASH_SIZE]; /* sha */ 29 + 30 + uint8_t reserved[1024-32-32]; 31 + uint32_t signTag; /* 0x4E474953 */ 32 + uint32_t signlen; /* maybe 128 or 256 */ 33 + uint8_t rsaHash[256]; /* maybe 128 or 256, using max size 256 */ 34 + uint8_t reserved2[2048-1024-256-8]; 35 + } second_loader_hdr; 36 + 37 + static uint32_t gTable_Crc32[256] = { 38 + 0x00000000, 0x04c10db7, 0x09821b6e, 0x0d4316d9, 39 + 0x130436dc, 0x17c53b6b, 0x1a862db2, 0x1e472005, 40 + 0x26086db8, 0x22c9600f, 0x2f8a76d6, 0x2b4b7b61, 41 + 0x350c5b64, 0x31cd56d3, 0x3c8e400a, 0x384f4dbd, 42 + 0x4c10db70, 0x48d1d6c7, 0x4592c01e, 0x4153cda9, 43 + 0x5f14edac, 0x5bd5e01b, 0x5696f6c2, 0x5257fb75, 44 + 0x6a18b6c8, 0x6ed9bb7f, 0x639aada6, 0x675ba011, 45 + 0x791c8014, 0x7ddd8da3, 0x709e9b7a, 0x745f96cd, 46 + 0x9821b6e0, 0x9ce0bb57, 0x91a3ad8e, 0x9562a039, 47 + 0x8b25803c, 0x8fe48d8b, 0x82a79b52, 0x866696e5, 48 + 0xbe29db58, 0xbae8d6ef, 0xb7abc036, 0xb36acd81, 49 + 0xad2ded84, 0xa9ece033, 0xa4aff6ea, 0xa06efb5d, 50 + 0xd4316d90, 0xd0f06027, 0xddb376fe, 0xd9727b49, 51 + 0xc7355b4c, 0xc3f456fb, 0xceb74022, 0xca764d95, 52 + 0xf2390028, 0xf6f80d9f, 0xfbbb1b46, 0xff7a16f1, 53 + 0xe13d36f4, 0xe5fc3b43, 0xe8bf2d9a, 0xec7e202d, 54 + 0x34826077, 0x30436dc0, 0x3d007b19, 0x39c176ae, 55 + 0x278656ab, 0x23475b1c, 0x2e044dc5, 0x2ac54072, 56 + 0x128a0dcf, 0x164b0078, 0x1b0816a1, 0x1fc91b16, 57 + 0x018e3b13, 0x054f36a4, 0x080c207d, 0x0ccd2dca, 58 + 0x7892bb07, 0x7c53b6b0, 0x7110a069, 0x75d1adde, 59 + 0x6b968ddb, 0x6f57806c, 0x621496b5, 0x66d59b02, 60 + 0x5e9ad6bf, 0x5a5bdb08, 0x5718cdd1, 0x53d9c066, 61 + 0x4d9ee063, 0x495fedd4, 0x441cfb0d, 0x40ddf6ba, 62 + 0xaca3d697, 0xa862db20, 0xa521cdf9, 0xa1e0c04e, 63 + 0xbfa7e04b, 0xbb66edfc, 0xb625fb25, 0xb2e4f692, 64 + 0x8aabbb2f, 0x8e6ab698, 0x8329a041, 0x87e8adf6, 65 + 0x99af8df3, 0x9d6e8044, 0x902d969d, 0x94ec9b2a, 66 + 0xe0b30de7, 0xe4720050, 0xe9311689, 0xedf01b3e, 67 + 0xf3b73b3b, 0xf776368c, 0xfa352055, 0xfef42de2, 68 + 0xc6bb605f, 0xc27a6de8, 0xcf397b31, 0xcbf87686, 69 + 0xd5bf5683, 0xd17e5b34, 0xdc3d4ded, 0xd8fc405a, 70 + 0x6904c0ee, 0x6dc5cd59, 0x6086db80, 0x6447d637, 71 + 0x7a00f632, 0x7ec1fb85, 0x7382ed5c, 0x7743e0eb, 72 + 0x4f0cad56, 0x4bcda0e1, 0x468eb638, 0x424fbb8f, 73 + 0x5c089b8a, 0x58c9963d, 0x558a80e4, 0x514b8d53, 74 + 0x25141b9e, 0x21d51629, 0x2c9600f0, 0x28570d47, 75 + 0x36102d42, 0x32d120f5, 0x3f92362c, 0x3b533b9b, 76 + 0x031c7626, 0x07dd7b91, 0x0a9e6d48, 0x0e5f60ff, 77 + 0x101840fa, 0x14d94d4d, 0x199a5b94, 0x1d5b5623, 78 + 0xf125760e, 0xf5e47bb9, 0xf8a76d60, 0xfc6660d7, 79 + 0xe22140d2, 0xe6e04d65, 0xeba35bbc, 0xef62560b, 80 + 0xd72d1bb6, 0xd3ec1601, 0xdeaf00d8, 0xda6e0d6f, 81 + 0xc4292d6a, 0xc0e820dd, 0xcdab3604, 0xc96a3bb3, 82 + 0xbd35ad7e, 0xb9f4a0c9, 0xb4b7b610, 0xb076bba7, 83 + 0xae319ba2, 0xaaf09615, 0xa7b380cc, 0xa3728d7b, 84 + 0x9b3dc0c6, 0x9ffccd71, 0x92bfdba8, 0x967ed61f, 85 + 0x8839f61a, 0x8cf8fbad, 0x81bbed74, 0x857ae0c3, 86 + 0x5d86a099, 0x5947ad2e, 0x5404bbf7, 0x50c5b640, 87 + 0x4e829645, 0x4a439bf2, 0x47008d2b, 0x43c1809c, 88 + 0x7b8ecd21, 0x7f4fc096, 0x720cd64f, 0x76cddbf8, 89 + 0x688afbfd, 0x6c4bf64a, 0x6108e093, 0x65c9ed24, 90 + 0x11967be9, 0x1557765e, 0x18146087, 0x1cd56d30, 91 + 0x02924d35, 0x06534082, 0x0b10565b, 0x0fd15bec, 92 + 0x379e1651, 0x335f1be6, 0x3e1c0d3f, 0x3add0088, 93 + 0x249a208d, 0x205b2d3a, 0x2d183be3, 0x29d93654, 94 + 0xc5a71679, 0xc1661bce, 0xcc250d17, 0xc8e400a0, 95 + 0xd6a320a5, 0xd2622d12, 0xdf213bcb, 0xdbe0367c, 96 + 0xe3af7bc1, 0xe76e7676, 0xea2d60af, 0xeeec6d18, 97 + 0xf0ab4d1d, 0xf46a40aa, 0xf9295673, 0xfde85bc4, 98 + 0x89b7cd09, 0x8d76c0be, 0x8035d667, 0x84f4dbd0, 99 + 0x9ab3fbd5, 0x9e72f662, 0x9331e0bb, 0x97f0ed0c, 100 + 0xafbfa0b1, 0xab7ead06, 0xa63dbbdf, 0xa2fcb668, 101 + 0xbcbb966d, 0xb87a9bda, 0xb5398d03, 0xb1f880b4, 102 + }; 103 + 104 + static uint32_t rkloader_crc32(uint8_t *pData, uint32_t ulSize) 105 + { 106 + uint32_t i; 107 + uint32_t nAccum = 0; 108 + 109 + for (i = 0; i < ulSize; i++) 110 + nAccum = (nAccum << 8) ^ gTable_Crc32[(nAccum >> 24) ^ (*pData++)]; 111 + return nAccum; 112 + } 113 + 114 + static void usage(const char *prog) 115 + { 116 + fprintf(stderr, "Usage: %s --pack input output [load_addr]\n", prog); 117 + fprintf(stderr, " %s --unpack input output\n", prog); 118 + } 119 + 120 + int main(int argc, char *argv[]) 121 + { 122 + int mode, size, i; 123 + uint32_t load_addr = CONFIG_TEXT_BASE; 124 + FILE *fi, *fo; 125 + second_loader_hdr hdr; 126 + char *buf = NULL; 127 + 128 + if (argc < 4) { 129 + usage(argv[0]); 130 + exit(EXIT_FAILURE); 131 + } 132 + 133 + if (!strcmp(argv[1], "--pack")) 134 + mode = MODE_PACK; 135 + else if (!strcmp(argv[1], "--unpack")) 136 + mode = MODE_UNPACK; 137 + else { 138 + usage(argv[0]); 139 + exit(EXIT_FAILURE); 140 + } 141 + 142 + if (mode == MODE_PACK && argc > 4) 143 + load_addr = strtoul(argv[4], NULL, 0); 144 + 145 + fi = fopen(argv[2], "rb"); 146 + if (!fi) { 147 + perror(argv[2]); 148 + exit(EXIT_FAILURE); 149 + } 150 + 151 + fo = fopen(argv[3], "wb"); 152 + if (!fo) { 153 + perror(argv[3]); 154 + exit(EXIT_FAILURE); 155 + } 156 + 157 + buf = calloc(UBOOT_MAX_SIZE, UBOOT_NUM); 158 + if (!buf) { 159 + perror("calloc"); 160 + exit(EXIT_FAILURE); 161 + } 162 + 163 + if (mode == MODE_PACK) { 164 + sha1_context ctx; 165 + uint8_t sha_output[SHA1_SUM_LEN]; 166 + 167 + printf("pack input %s\n", argv[2]); 168 + fseek(fi, 0, SEEK_END); 169 + size = ftell(fi); 170 + fseek(fi, 0, SEEK_SET); 171 + printf("pack file size: %d\n", size); 172 + if (size > UBOOT_MAX_SIZE - (int)sizeof(second_loader_hdr)) { 173 + fprintf(stderr, "input file too large\n"); 174 + exit(EXIT_FAILURE); 175 + } 176 + memset(&hdr, 0, sizeof(second_loader_hdr)); 177 + strcpy((char *)hdr.magic, RK_UBOOT_MAGIC); 178 + hdr.loader_load_addr = load_addr; 179 + hdr.loader_load_size = size; 180 + fread(buf + sizeof(second_loader_hdr), size, 1, fi); 181 + hdr.crc32 = rkloader_crc32((uint8_t *)buf + sizeof(second_loader_hdr), size); 182 + printf("crc = 0x%08x\n", hdr.crc32); 183 + 184 + hdr.hash_len = (SHA1_SUM_LEN > LOADER_HASH_SIZE) ? 185 + LOADER_HASH_SIZE : SHA1_SUM_LEN; 186 + sha1_starts(&ctx); 187 + sha1_update(&ctx, (unsigned char *)buf + sizeof(second_loader_hdr), size); 188 + sha1_update(&ctx, (unsigned char *)&hdr.loader_load_addr, 189 + sizeof(hdr.loader_load_addr)); 190 + sha1_update(&ctx, (unsigned char *)&hdr.loader_load_size, 191 + sizeof(hdr.loader_load_size)); 192 + sha1_update(&ctx, (unsigned char *)&hdr.hash_len, 193 + sizeof(hdr.hash_len)); 194 + sha1_finish(&ctx, sha_output); 195 + memcpy(hdr.hash, sha_output, hdr.hash_len); 196 + 197 + printf("load addr: 0x%08x\n", load_addr); 198 + memcpy(buf, &hdr, sizeof(second_loader_hdr)); 199 + for (i = 0; i < UBOOT_NUM; i++) 200 + fwrite(buf, UBOOT_MAX_SIZE, 1, fo); 201 + printf("pack %s success!\n", argv[3]); 202 + } else if (mode == MODE_UNPACK) { 203 + printf("unpack input %s\n", argv[2]); 204 + memset(&hdr, 0, sizeof(second_loader_hdr)); 205 + fread(&hdr, sizeof(second_loader_hdr), 1, fi); 206 + fread(buf, hdr.loader_load_size, 1, fi); 207 + fwrite(buf, hdr.loader_load_size, 1, fo); 208 + printf("unpack %s success!\n", argv[3]); 209 + } 210 + free(buf); 211 + fclose(fi); 212 + fclose(fo); 213 + 214 + return 0; 215 + }