void init_fsboot(void) { char *envp; ulong loadaddr; ulong testaddr; ulong alt_loadaddr; char buf[9]; /* * Get test image address */ if ((envp = getenv("testaddr")) != NULL) testaddr = simple_strtoul(envp, NULL, 16); else testaddr = -1; /* * Are we going to test boot and image? */ if ((testaddr != -1) && image_check(testaddr)) { /* Set alt_loadaddr */ alt_loadaddr = testaddr; sprintf(buf, "%lX", alt_loadaddr); setenv("alt_loadaddr", buf); /* Clear test_addr */ setenv("testaddr", NULL); /* * Save current environment with alt_loadaddr, * and cleared testaddr. */ saveenv(); /* * Setup temporary loadaddr to alt_loadaddr * XXX - DO NOT SAVE ENVIRONMENT! */ loadaddr = alt_loadaddr; sprintf(buf, "%lX", loadaddr); setenv("loadaddr", buf); } else { /* Normal boot */ setenv("alt_loadaddr", NULL); /* Clear alt_loadaddr */ setenv("testaddr", NULL); /* Clear testaddr */ saveenv(); } return; }
int main (int argc, char **argv) { int ch, i, boot, imagefd = 0, force, unlocked; char *erase[MAX_ARGS], *device = NULL; char *fis_layout = NULL; size_t offset = 0, part_offset = 0, dump_len = 0; enum { CMD_ERASE, CMD_WRITE, CMD_UNLOCK, CMD_JFFS2WRITE, CMD_FIXTRX, CMD_FIXSEAMA, CMD_VERIFY, CMD_DUMP, } cmd = -1; erase[0] = NULL; boot = 0; force = 0; buflen = 0; quiet = 0; no_erase = 0; while ((ch = getopt(argc, argv, #ifdef FIS_SUPPORT "F:" #endif "frnqe:d:s:j:p:o:l:")) != -1) switch (ch) { case 'f': force = 1; break; case 'r': boot = 1; break; case 'n': no_erase = 1; break; case 'j': jffs2file = optarg; break; case 's': errno = 0; jffs2_skip_bytes = strtoul(optarg, 0, 0); if (errno) { fprintf(stderr, "-s: illegal numeric string\n"); usage(); } break; case 'q': quiet++; break; case 'e': i = 0; while ((erase[i] != NULL) && ((i + 1) < MAX_ARGS)) i++; erase[i++] = optarg; erase[i] = NULL; break; case 'd': jffs2dir = optarg; break; case 'p': errno = 0; part_offset = strtoul(optarg, 0, 0); if (errno) { fprintf(stderr, "-p: illegal numeric string\n"); usage(); } break; case 'l': errno = 0; dump_len = strtoul(optarg, 0, 0); if (errno) { fprintf(stderr, "-l: illegal numeric string\n"); usage(); } break; case 'o': errno = 0; offset = strtoul(optarg, 0, 0); if (errno) { fprintf(stderr, "-o: illegal numeric string\n"); usage(); } break; #ifdef FIS_SUPPORT case 'F': fis_layout = optarg; break; #endif case '?': default: usage(); } argc -= optind; argv += optind; if (argc < 2) usage(); if ((strcmp(argv[0], "unlock") == 0) && (argc == 2)) { cmd = CMD_UNLOCK; device = argv[1]; } else if ((strcmp(argv[0], "erase") == 0) && (argc == 2)) { cmd = CMD_ERASE; device = argv[1]; } else if (((strcmp(argv[0], "fixtrx") == 0) && (argc == 2)) && mtd_fixtrx) { cmd = CMD_FIXTRX; device = argv[1]; } else if (((strcmp(argv[0], "fixseama") == 0) && (argc == 2)) && mtd_fixseama) { cmd = CMD_FIXSEAMA; device = argv[1]; } else if ((strcmp(argv[0], "verify") == 0) && (argc == 3)) { cmd = CMD_VERIFY; imagefile = argv[1]; device = argv[2]; } else if ((strcmp(argv[0], "dump") == 0) && (argc == 2)) { cmd = CMD_DUMP; device = argv[1]; } else if ((strcmp(argv[0], "write") == 0) && (argc == 3)) { cmd = CMD_WRITE; device = argv[2]; if (strcmp(argv[1], "-") == 0) { imagefile = "<stdin>"; imagefd = 0; } else { imagefile = argv[1]; if ((imagefd = open(argv[1], O_RDONLY)) < 0) { fprintf(stderr, "Couldn't open image file: %s!\n", imagefile); exit(1); } } if (!mtd_check(device)) { fprintf(stderr, "Can't open device for writing!\n"); exit(1); } /* check trx file before erasing or writing anything */ if (!image_check(imagefd, device) && !force) { fprintf(stderr, "Image check failed.\n"); exit(1); } } else if ((strcmp(argv[0], "jffs2write") == 0) && (argc == 3)) { cmd = CMD_JFFS2WRITE; device = argv[2]; imagefile = argv[1]; if (!mtd_check(device)) { fprintf(stderr, "Can't open device for writing!\n"); exit(1); } } else { usage(); } sync(); i = 0; unlocked = 0; while (erase[i] != NULL) { mtd_unlock(erase[i]); mtd_erase(erase[i]); if (strcmp(erase[i], device) == 0) unlocked = 1; i++; } switch (cmd) { case CMD_UNLOCK: if (!unlocked) mtd_unlock(device); break; case CMD_VERIFY: mtd_verify(device, imagefile); break; case CMD_DUMP: mtd_dump(device, offset, dump_len); break; case CMD_ERASE: if (!unlocked) mtd_unlock(device); mtd_erase(device); break; case CMD_WRITE: if (!unlocked) mtd_unlock(device); mtd_write(imagefd, device, fis_layout, part_offset); break; case CMD_JFFS2WRITE: if (!unlocked) mtd_unlock(device); mtd_write_jffs2(device, imagefile, jffs2dir); break; case CMD_FIXTRX: if (mtd_fixtrx) { mtd_fixtrx(device, offset); } case CMD_FIXSEAMA: if (mtd_fixseama) mtd_fixseama(device, 0); break; } sync(); if (boot) do_reboot(); return 0; }
int main (int argc, char **argv) { int ch, i, boot, imagefd = 0, force, unlocked; char *erase[MAX_ARGS], *device = NULL; enum { CMD_ERASE, CMD_WRITE, CMD_UNLOCK, CMD_REFRESH, CMD_JFFS2WRITE } cmd = -1; erase[0] = NULL; boot = 0; force = 0; buflen = 0; quiet = 0; while ((ch = getopt(argc, argv, "frqe:d:j:")) != -1) switch (ch) { case 'f': force = 1; break; case 'r': boot = 1; break; case 'j': jffs2file = optarg; break; case 'q': quiet++; break; case 'e': i = 0; while ((erase[i] != NULL) && ((i + 1) < MAX_ARGS)) i++; erase[i++] = optarg; erase[i] = NULL; break; case 'd': jffs2dir = optarg; break; case '?': default: usage(); } argc -= optind; argv += optind; if (argc < 2) usage(); if ((strcmp(argv[0], "unlock") == 0) && (argc == 2)) { cmd = CMD_UNLOCK; device = argv[1]; } else if ((strcmp(argv[0], "refresh") == 0) && (argc == 2)) { cmd = CMD_REFRESH; device = argv[1]; } else if ((strcmp(argv[0], "erase") == 0) && (argc == 2)) { cmd = CMD_ERASE; device = argv[1]; } else if ((strcmp(argv[0], "write") == 0) && (argc == 3)) { cmd = CMD_WRITE; device = argv[2]; if (strcmp(argv[1], "-") == 0) { imagefile = "<stdin>"; imagefd = 0; } else { imagefile = argv[1]; if ((imagefd = open(argv[1], O_RDONLY)) < 0) { fprintf(stderr, "Couldn't open image file: %s!\n", imagefile); exit(1); } } if (!mtd_check(device)) { fprintf(stderr, "Can't open device for writing!\n"); exit(1); } /* check trx file before erasing or writing anything */ if (!image_check(imagefd, device) && !force) { fprintf(stderr, "Image check failed.\n"); exit(1); } } else if ((strcmp(argv[0], "jffs2write") == 0) && (argc == 3)) { cmd = CMD_JFFS2WRITE; device = argv[2]; imagefile = argv[1]; if (!mtd_check(device)) { fprintf(stderr, "Can't open device for writing!\n"); exit(1); } } else { usage(); } sync(); i = 0; unlocked = 0; while (erase[i] != NULL) { mtd_unlock(erase[i]); mtd_erase(erase[i]); if (strcmp(erase[i], device) == 0) unlocked = 1; i++; } switch (cmd) { case CMD_UNLOCK: if (!unlocked) mtd_unlock(device); break; case CMD_ERASE: if (!unlocked) mtd_unlock(device); mtd_erase(device); break; case CMD_WRITE: if (!unlocked) mtd_unlock(device); mtd_write(imagefd, device); break; case CMD_JFFS2WRITE: if (!unlocked) mtd_unlock(device); mtd_write_jffs2(device, imagefile, jffs2dir); break; case CMD_REFRESH: mtd_refresh(device); break; } sync(); if (boot) do_reboot(); return 0; }
int mtd_main(int argc, char **argv) { int ch, i, boot, unlock, imagefd, force, quiet, unlocked; char *erase[MAX_ARGS], *device, *imagefile; enum { CMD_ERASE, CMD_WRITE, CMD_UNLOCK } cmd; erase[0] = NULL; boot = 0; force = 0; buflen = 0; quiet = 0; while ((ch = getopt(argc, argv, "frqe:")) != -1) switch (ch) { case 'f': force = 1; break; case 'r': boot = 1; break; case 'q': quiet++; break; case 'e': i = 0; while ((erase[i] != NULL) && ((i + 1) < MAX_ARGS)) i++; erase[i++] = optarg; erase[i] = NULL; break; case '?': default: usage(); } argc -= optind; argv += optind; if (argc < 2) usage(); if ((strcmp(argv[0], "unlock") == 0) && (argc == 2)) { cmd = CMD_UNLOCK; device = argv[1]; } else if ((strcmp(argv[0], "erase") == 0) && (argc == 2)) { cmd = CMD_ERASE; device = argv[1]; } else if ((strcmp(argv[0], "write") == 0) && (argc == 3)) { cmd = CMD_WRITE; device = argv[2]; if (strcmp(argv[1], "-") == 0) { imagefile = "<stdin>"; imagefd = 0; } else { imagefile = argv[1]; if ((imagefd = open(argv[1], O_RDONLY)) < 0) { fprintf(stderr, "Couldn't open image file: %s!\n", imagefile); exit(1); } } /* * check trx file before erasing or writing anything */ if (!image_check(imagefd, device)) { if ((quiet < 2) || !force) fprintf(stderr, "TRX check failed!\n"); if (!force) exit(1); } else { if (!mtd_check(device)) { fprintf(stderr, "Can't open device for writing!\n"); exit(1); } } } else { usage(); } sync(); i = 0; unlocked = 0; while (erase[i] != NULL) { if (quiet < 2) fprintf(stderr, "Unlocking %s ...\n", erase[i]); mtd_unlock(erase[i]); if (quiet < 2) fprintf(stderr, "Erasing %s ...\n", erase[i]); mtd_erase(erase[i]); if (strcmp(erase[i], device) == 0) unlocked = 1; i++; } if (!unlocked) { if (quiet < 2) fprintf(stderr, "Unlocking %s ...\n", device); mtd_unlock(device); } switch (cmd) { case CMD_UNLOCK: break; case CMD_ERASE: if (quiet < 2) fprintf(stderr, "Erasing %s ...\n", device); mtd_erase(device); break; case CMD_WRITE: if (quiet < 2) fprintf(stderr, "Writing from %s to %s ... ", imagefile, device); mtd_write(imagefd, device, quiet); if (quiet < 2) fprintf(stderr, "\n"); break; } sync(); if (boot) kill(1, 15); // send SIGTERM to init for reboot return 0; }
int main(int argc, char * const* argv) { int ret = 0; int c = 0; const char* optstring = "d:r:c:"; if(argc < 3||argc > 5) { printf("invalid arguments argc==%d\n", argc); fprintf(stderr,usage,argv[0],argv[0],argv[0],argv[0]); exit(-1); } ImageDecoderIf_t* pDecoder = AmlImage_Init(); //for (int i = 1; i < argc; ++i) { const char* option = argv[1]; char* const*optarg = argv + 2; if(!strcmp("-d", option))//unpack: argv[0] -d <archive> [out dir] { const char* amlImg = optarg[0]; const char* unPackDir = optarg[1]; if(access(amlImg,F_OK|R_OK) < 0){ printf("Err:%s is not found! \n",amlImg); return __LINE__; } if(argc == 4) ret = image_unpack(amlImg,unPackDir); else ret = image_unpack(amlImg,NULL); } else if(!strcmp("-r", option))//pack: argv[0] -r cfgFile workDir targetFile { if(argc != 5){ printf("invalid arguments argc==%d\n", argc); fprintf(stderr,usage,argv[0],argv[0],argv[0],argv[0]); exit(-1); } const char* cfgFile = optarg[0]; const char* workdir = optarg[1]; const char* targetFile = optarg[2]; if(access(cfgFile,F_OK|R_OK) < 0){ fprintf(stderr,"Err:%s is not found! \n", cfgFile); } printf("image_pack cfg: %s\n", cfgFile); ret = image_pack(cfgFile, workdir, targetFile); } else if(!strcmp("-c", option))//check: argv[0] amlImage { const char* amlImg = optarg[0]; if(access(amlImg,F_OK|R_OK) < 0){ fprintf(stderr,"Err:%s is not found!\n", amlImg); } FILE *fp = fopen(amlImg,"rb"); if(image_check((HIMAGE) fp) < 0){ fprintf(stderr,"the image check fail!!\n"); }else{ printf("the image check ok!\n"); } fclose(fp); } else if(!strcmp("-?", option)) { fprintf(stderr,usage,argv[0],argv[0],argv[0],argv[0]); ret = -1; } else{ fprintf(stderr,usage,argv[0],argv[0],argv[0],argv[0]); } } AmlImage_Final(pDecoder); return ret; }
EXPORT #endif int image_unpack(const char* imagefile,const char *outpath) { int ret = 0; unsigned int itemCountTotal = 0; unsigned int nItem = 0; unsigned int write_bytes = 0; char main_type[32] = {0}; char sub_type[32] = {0}; char outfile[512] = {0}; char cfgfile[128] = {0}; char buff[256] = {0}; #ifdef BUILD_DLL if(ImageDecoder->AmlFirmwareImg == NULL){ ImageDecoder->AmlFirmwareImg = (AmlFirmwareImg_t*)malloc(sizeof(AmlFirmwareImg_t)); if(ImageDecoder->AmlFirmwareImg == NULL){ fprintf(stderr,"not enough memory\n"); return -1; } } #endif if(outpath){ strcpy(outfile,outpath); strcat(outfile,"\\"); strcpy(cfgfile,outfile); } strcat(cfgfile,"image.cfg"); HIMAGE hImage = image_open(imagefile); if(image_check(hImage) < 0){ fprintf(stderr,"the image check fail!!\n"); return -1; }else{ printf("the image check ok!\n"); } itemCountTotal = image_get_item_count(hImage,NULL); const unsigned itemCountVerify = image_get_item_count(hImage, "VERIFY"); const unsigned itemCountNormal = itemCountTotal - itemCountVerify * 2; debugP("item cnt:total[%u], normal[%u], verify[%u]\n", itemCountTotal, itemCountNormal, itemCountVerify); char *unPackBuf = (char*)malloc(RW_MAX_SIZE); if(unPackBuf==NULL){ fprintf(stderr,"allocate memccpy failed at %s %d \n", __FILE__,__LINE__); return __LINE__; } FILE *fp_cfg = fopen(cfgfile,"wb+"); if(fp_cfg==NULL){ fprintf(stderr,"create image.cfg failed ! [%s] \n",strerror(errno)); return __LINE__; } fwrite(TAG_NORMALLIST,1,strlen(TAG_NORMALLIST), fp_cfg); fwrite("\r\n", 1, 2, fp_cfg); for(nItem = 0; nItem < itemCountTotal; ++nItem) { if(image_get_next_item(hImage,nItem,main_type,sub_type) < 0){ ret = -1; break; } if(!strcmp("VERIFY", main_type)) { continue;//skip verify item } if(nItem == itemCountNormal)//[List_normal]ends, [List_verify] starts { fwrite("\r\n", 1, 2, fp_cfg); fwrite(TAG_VERIFYLIST,1,strlen(TAG_VERIFYLIST), fp_cfg); fwrite("\r\n", 1, 2, fp_cfg); } memset(outfile,0,64); if(outpath){ strcpy(outfile,outpath); strcat(outfile,"/"); } strcat(outfile,sub_type); strcat(outfile,"."); strcat(outfile,main_type); debugP("out file: %s \n",outfile);//sub_type.main_type HIMAGEITEM hItem = image_open_item(hImage,main_type,sub_type); if(hItem == NULL){ fprintf(stderr,"open item[%s, %s] failed!\n", main_type, sub_type); ret = -1; break; } int backUpItemId = 0; int itemIsBacked = is_item_backup_for_other_item(hItem, &backUpItemId); if(itemIsBacked < 0){ errorP("Fail to in test is_item_backup_for_other_item\n"); ret = __LINE__; break; } if(itemIsBacked)//item is back item { char* CfgLine = (char*)unPackBuf; char srcBackItemMainType[32]; char srcBackItemSubType[32]; if(image_get_next_item(hImage, backUpItemId, srcBackItemMainType, srcBackItemSubType)){ errorP("Fail to get the backui item head\n"); ret = __LINE__; break; } sprintf(CfgLine, IMG_CFG_LINE, srcBackItemSubType, srcBackItemMainType, main_type, sub_type); fwrite(CfgLine,1,strlen(CfgLine), fp_cfg); continue; } FILE *fp_out = fopen(outfile,"wb+"); if(fp_out == NULL){ fprintf(stderr,"failed to create out file : %s \n",outfile); ret = -1; break; } while((write_bytes = image_read_item_data(hImage, hItem, unPackBuf, RW_MAX_SIZE))>0) { if(fwrite(unPackBuf,1,write_bytes,fp_out)!=write_bytes){ fprintf(stderr,"write to image file fail! [%s] \n",strerror(errno)); ret = -1; break; } } fclose(fp_out); image_close_item(hItem); char* CfgLine = (char*)unPackBuf; sprintf(CfgLine, IMG_CFG_LINE, sub_type, main_type, main_type, sub_type); fwrite(CfgLine,1,strlen(CfgLine), fp_cfg); } free(unPackBuf); fclose(fp_cfg); fp_cfg = NULL; #ifdef BUILD_DLL if(ImageDecoder->AmlFirmwareImg){ free(ImageDecoder->AmlFirmwareImg); ImageDecoder->AmlFirmwareImg = NULL; } #endif return ret; }