diff options
Diffstat (limited to 'util/kbc1126/kbc1126_ec_insert.c')
-rw-r--r-- | util/kbc1126/kbc1126_ec_insert.c | 98 |
1 files changed, 68 insertions, 30 deletions
diff --git a/util/kbc1126/kbc1126_ec_insert.c b/util/kbc1126/kbc1126_ec_insert.c index 6c19c0e97f..64d1295c96 100644 --- a/util/kbc1126/kbc1126_ec_insert.c +++ b/util/kbc1126/kbc1126_ec_insert.c @@ -18,7 +18,18 @@ static void usage(const char *s) { - printf("%s <rom file> <fw1> <fw2> <fw1 offset> <fw2 offset>\n", s); + printf("insert firmware blobs:\n\t" + "%s <rom file> <fw1> <fw2> <fw1 offset> <fw2 offset>\n\n", + s); + printf("set addresses of firmware blobs only:\n\t" + "%s <rom file> <fw1 offset> <fw2 offset>\n\n", + s); + printf( + "offset can be (example is put it to 0x7ffa00 when ROM is 8MB):\n" + "- file offset: 0x7ffa00\n" + "- distance to the end of file: -0x600\n" + "- the address when ROM is mapped to the end of memory: " + "0xfffffa00\n"); exit(1); } @@ -30,22 +41,50 @@ static void FseekEnd(FILE *fp, long o) } } +static long negoffset(long a, long romsz) +{ + if (a > 0) { + if (a & 0x80000000) /* the address in memory, and sizeof(long) + is 8 */ + return a - 0x100000000; + else /* the file offset */ + return a - romsz; + } else { + return a; + } +} + int main(int argc, char *argv[]) { - if (argc < 6) - usage(argv[0]); + FILE *fp, *fw1, *fw2; + long offset1, offset2; - FILE *fp = fopen(argv[1], "rb+"); - FILE *fw1 = fopen(argv[2], "rb"); - FILE *fw2 = fopen(argv[3], "rb"); - long offset1 = strtol(argv[4], NULL, 0); - long offset2 = strtol(argv[5], NULL, 0); + if (argc != 4 && argc != 6) + usage(argv[0]); - if (fp == NULL || fw1 == NULL || fw2 == NULL) { - puts("Error opening file!"); + fp = fopen(argv[1], "rb+"); + if (fp == NULL) { + puts("Error opening firmware image!"); exit(1); } + if (argc == 6) { + fw1 = fopen(argv[2], "rb"); + fw2 = fopen(argv[3], "rb"); + offset1 = strtoul(argv[4], NULL, 0); + offset2 = strtoul(argv[5], NULL, 0); + + if (fw1 == NULL || fw2 == NULL) { + puts("Error opening file!"); + exit(1); + } + } else { + fw1 = NULL; + fw2 = NULL; + offset1 = strtoul(argv[2], NULL, 0); + offset2 = strtoul(argv[3], NULL, 0); + } + if ((offset1 & 0xff) || (offset2 & 0xff)) { puts("The offsets must be aligned to 0x100"); exit(1); @@ -61,11 +100,8 @@ int main(int argc, char *argv[]) exit(1); } - if (offset1 > 0) - offset1 = offset1 - romsz; - - if (offset2 > 0) - offset2 = offset2 - romsz; + offset1 = negoffset(offset1, romsz); + offset2 = negoffset(offset2, romsz); /* write two offsets to $s-0x100 */ char offs[8]; @@ -80,29 +116,31 @@ int main(int argc, char *argv[]) offs[5] = os >> 8; offs[6] = 0xff - offs[4]; offs[7] = 0xff - offs[5]; - for (size_t i = 0; i < 8; i++) { + for (size_t i = 0; i < 8; i++) printf("%02hhx ", offs[i]); - } + puts(""); FseekEnd(fp, -0x100); printf("writing to 0x%lx\n", ftell(fp)); fwrite(offs, 1, 8, fp); - /* write fw1 and fw2 */ - char c; - FseekEnd(fp, offset1); - printf("writing to 0x%lx\n", ftell(fp)); - while (fread(&c, 1, 1, fw1) == 1) { - fwrite(&c, 1, 1, fp); - } - FseekEnd(fp, offset2); - printf("writing to 0x%lx\n", ftell(fp)); - while (fread(&c, 1, 1, fw2) == 1) { - fwrite(&c, 1, 1, fp); + if (argc == 6) { + /* write fw1 and fw2 */ + char c; + FseekEnd(fp, offset1); + printf("writing to 0x%lx\n", ftell(fp)); + while (fread(&c, 1, 1, fw1) == 1) + fwrite(&c, 1, 1, fp); + + FseekEnd(fp, offset2); + printf("writing to 0x%lx\n", ftell(fp)); + while (fread(&c, 1, 1, fw2) == 1) + fwrite(&c, 1, 1, fp); + + fclose(fw1); + fclose(fw2); } fclose(fp); - fclose(fw1); - fclose(fw2); return 0; } |