コード例 #1
0
ファイル: boot.c プロジェクト: centurysys/barebox
/*
 * Start a single boot script. 'path' is a full path to a boot script.
 */
static int boot_script(char *path)
{
	int ret;
	struct bootm_data data = {
		.os_address = UIMAGE_SOME_ADDRESS,
		.initrd_address = UIMAGE_SOME_ADDRESS,
	};

	globalvar_set_match("linux.bootargs.dyn.", "");
	globalvar_set_match("bootm.", "");

	ret = run_command(path);
	if (ret) {
		printf("Running %s failed\n", path);
		goto out;
	}

	data.initrd_address = UIMAGE_INVALID_ADDRESS;
	data.os_address = UIMAGE_SOME_ADDRESS;
	data.oftree_file = getenv_nonempty("global.bootm.oftree");
	data.os_file = getenv_nonempty("global.bootm.image");
	getenv_ul("global.bootm.image.loadaddr", &data.os_address);
	getenv_ul("global.bootm.initrd.loadaddr", &data.initrd_address);
	data.initrd_file = getenv_nonempty("global.bootm.initrd");
	data.verbose = verbose;
	data.dryrun = dryrun;

	ret = bootm_boot(&data);
	if (ret)
		pr_err("Booting %s failed: %s\n", basename(path), strerror(-ret));
out:
	return ret;
}
コード例 #2
0
ファイル: cmd_fwupgrade.c プロジェクト: RC-MODULE/mboot
static int do_eupgrade(struct cmd_ctx *cmdctx, int argc, char * const argv[])
{
    struct mtd_info *mtd = mtd_by_name(argv[1]);
    int ret;
    struct efw_settings es;
    unsigned long laddr;
    unsigned char* buffer0;
    unsigned char* buffer1;
    unsigned char* buffer2;
    uint64_t offset = 0;
    getenv_ul("loadaddr", &laddr, 0);
    if (laddr == 0)
    {
        printf("Bad loadaddr\n");
        return -1;
    }
    buffer0 = ((unsigned char*) laddr);
    buffer1 = buffer0 + SZ_1M;
    buffer2 = buffer1 + SZ_1M;
    printf("buffer   0 @ %x\n", (unsigned int) buffer0);
    printf("buffer   1 @ %x\n", (unsigned int) buffer1);
    printf("readback   @ %x\n", (unsigned int) buffer2);

    if (mtd == NULL) {
        printf("FWU mtd device is not available (bad part name?)\n");
        return -1;
    }

    es.erase_size = mtd->erasesize;
    es.oob_size   = mtd->oobsize;
    es.size       = mtd->size;
    es.writesize  = mtd->writesize;

    ret = erase_part(mtd, 0, 1);
    if (ret)
    {
        printf("FW: Partition erase failed, aborting...\n");
        return -1;
    }

    *g_uemd_magic = (uint32_t) &es;
    while (*g_uemd_magic != MAGIC_READY);;
    printf("FW: sent info\n");

    *g_uemd_magic = (uint32_t) buffer0;
    while (*g_uemd_magic != MAGIC_READY);;

    printf("FW: got b0\n");

    while (1)
    {
        *g_uemd_magic = (uint32_t) buffer1;

        write_block(mtd, &offset, buffer0, buffer2, 0);

        e_do_sync(buffer1);

        *g_uemd_magic = (uint32_t) buffer0;

        write_block(mtd, &offset, buffer1, buffer2, 0);

        e_do_sync(buffer0);

    }
out:
    printf("\nFW: done \n");
    *g_uemd_magic = 0x0;
    return 0;
}