/* * 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; }
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; }