/* Copyright 2007, Google Inc. */ #include #include #include #include #include int main(int argc, char *argv[]) { struct stat s; unsigned size, base; int unified_boot = 0; unsigned unified_boot_magic[20]; unsigned non_unified_boot_magic[10]; unsigned magic_len = 0; unsigned *magic; int fd; if(argc < 3) { fprintf(stderr,"usage: mkheader \n"); return -1; } if (argc == 4) { if(!strcmp("unified-boot",argv[3])) { unified_boot = 1; } } if(stat(argv[1], &s)) { perror("cannot stat binary"); return -1; } if(unified_boot) { magic = unified_boot_magic; magic_len = sizeof(unified_boot_magic); } else { magic = non_unified_boot_magic; magic_len = sizeof(non_unified_boot_magic); } size = s.st_size; base = 0; magic[0] = 0x00000005; /* appsbl */ magic[1] = 0x00000002; /* nand */ magic[2] = 0x00000000; magic[3] = base; magic[4] = size; magic[5] = size; magic[6] = size + base; magic[7] = 0x00000000; magic[8] = size + base; magic[9] = 0x00000000; if (unified_boot == 1) { magic[10] = 0x33836685; /* cookie magic number */ magic[11] = 0x00000001; /* cookie version */ magic[12] = 0x00000002; /* file formats */ magic[13] = 0x00000000; magic[14] = 0x00000000; /* not setting size for boot.img */ magic[15] = 0x00000000; magic[16] = 0x00000000; magic[17] = 0x00000000; magic[18] = 0x00000000; magic[19] = 0x00000000; } fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644); if(fd < 0) { perror("cannot open header for writing"); return -1; } if(write(fd, magic, magic_len) != magic_len) { perror("cannot write header"); close(fd); unlink(argv[2]); return -1; } close(fd); return 0; }