示例#1
0
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;
}
示例#2
0
文件: mtd.c 项目: AlexKust/openwrt
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;
}
示例#3
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;
}
示例#4
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;
}
示例#5
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;
}
示例#6
0
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;
}