📄 idewimage.c
字号:
//// idewimage//// usage : idewimage (option) /dev/xxx file// option : // --kernel (default)// --romfs #include <stdio.h>enum { IMAGE_TYPE_NONE, IMAGE_TYPE_KERNEL, IMAGE_TYPE_ROMFS };#define SECTOR_SIZE 512#define IMAGE_SIGNATURE "Sigma Designs"#define IMAGE_ID_KERNEL "Kernel"#define IMAGE_ID_ROMFS "ROMFS"#define IMAGE_SUBPART_SIZE 0x200000#define IMAGE_SUBPART_SECTORS (IMAGE_SUBPART_SIZE / SECTOR_SIZE)typedef union { unsigned char data[SECTOR_SIZE]; struct { unsigned char dummy[16]; unsigned char signature[16]; unsigned char id[8]; unsigned short major, minor; unsigned int len; } u;} image_infoblock_t;int ide_write_image(int type, char *device, int subpart, char *datafile);int main(int argc, char *argv[]){ int i, subpart = 0; char *cp, *device = NULL, *datafile = NULL; int type = IMAGE_TYPE_KERNEL; int dohelp = 0; for (i = 1; i < argc; ++i) { if (argv[i][0] == '-') { if (strcmp(argv[i], "--kernel") == 0) type = IMAGE_TYPE_KERNEL; else if (strcmp(argv[i], "--romfs") == 0) type = IMAGE_TYPE_ROMFS; else if (strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "--sub") == 0) { if (++i == argc) dohelp = 1; else subpart = atoi(argv[i]); } else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) dohelp = 1; } else { if (device == NULL) device = argv[i]; else if (datafile == NULL) datafile = argv[i]; } } if (dohelp || device == NULL || datafile == NULL) { fprintf(stderr, "Usage : idewimage <options> [device file] [filename]\n"); fprintf(stderr, "options :\n"); fprintf(stderr, " -h, --help : This screen\n"); fprintf(stderr, " -s, --sub [sub partition] : Sub partition number in a partition\n"); fprintf(stderr, " --kernel : Writes kernel image\n"); fprintf(stderr, " --romfs : Writes ROMFS image\n"); return 1; } // check if the device file is one of the partition cp = device + strlen(device) - 1; if (*cp < '0' || *cp > '9') { fprintf(stderr, "Error : Specify partition device file instead of whole device\n"); return 2; } ide_write_image(type, device, subpart, datafile); return 0;}#define IMAGE_BUFFER_SIZE 10000int ide_write_image(int type, char *device, int subpart, char *datafile){ FILE *fpdev, *fpsrc; image_infoblock_t info; unsigned int filesize, len; unsigned char buf[IMAGE_BUFFER_SIZE]; if ((fpdev = fopen(device, "w")) == NULL) { printf("Can not open device file %s\n", device); return -1; } if ((fpsrc = fopen(datafile, "r")) == NULL) { printf("Can not open source file %s\n", datafile); fclose(fpdev); return -2; } // move the file pointer on the destination fseek(fpdev, IMAGE_SUBPART_SIZE * subpart, SEEK_SET); // get the lenght of file fseek(fpsrc, 0, SEEK_END); filesize = ftell(fpsrc); fseek(fpsrc, 0, SEEK_SET); // print information printf("Write image to %s subpartition %d (offset = %dMB) file size = %dKB\n", device, subpart, (IMAGE_SUBPART_SIZE * subpart) >> 20, filesize >> 10); // fill out the information block memset(&info, 0, sizeof info); strcpy(info.u.signature, IMAGE_SIGNATURE); if (type == IMAGE_TYPE_KERNEL) strcpy(info.u.id, IMAGE_ID_KERNEL); else if (type == IMAGE_TYPE_ROMFS) strcpy(info.u.id, IMAGE_ID_ROMFS); else return 1; info.u.major = 1; info.u.minor = 0; info.u.len = filesize; // write header fwrite(&info, sizeof info, 1, fpdev); // write data while ((len = fread(buf, 1, IMAGE_BUFFER_SIZE, fpsrc)) > 0) fwrite(buf, 1, len, fpdev); fclose(fpdev); fclose(fpsrc);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -