Esempio n. 1
0
static int splash_select_fs_dev(struct splash_location *location)
{
	int res;

	switch (location->storage) {
	case SPLASH_STORAGE_MMC:
		res = fs_set_blk_dev("mmc", location->devpart, FS_TYPE_ANY);
		break;
	case SPLASH_STORAGE_USB:
		res = fs_set_blk_dev("usb", location->devpart, FS_TYPE_ANY);
		break;
	case SPLASH_STORAGE_SATA:
		res = fs_set_blk_dev("sata", location->devpart, FS_TYPE_ANY);
		break;
	case SPLASH_STORAGE_NAND:
		if (location->ubivol != NULL)
			res = fs_set_blk_dev("ubi", NULL, FS_TYPE_UBIFS);
		else
			res = -ENODEV;
		break;
	default:
		printf("Error: unsupported location storage.\n");
		return -ENODEV;
	}

	if (res)
		printf("Error: could not access storage.\n");

	return res;
}
Esempio n. 2
0
/**
 * fw_get_filesystem_firmware - load firmware into an allocated buffer.
 * @dev: An instance of a driver.
 *
 * Return: Size of total read, negative value when error.
 */
static int fw_get_filesystem_firmware(struct udevice *dev)
{
	loff_t actread;
	char *storage_interface, *dev_part, *ubi_mtdpart, *ubi_volume;
	int ret;

	storage_interface = env_get("storage_interface");
	dev_part = env_get("fw_dev_part");
	ubi_mtdpart = env_get("fw_ubi_mtdpart");
	ubi_volume = env_get("fw_ubi_volume");

	if (storage_interface && dev_part) {
		ret = fs_set_blk_dev(storage_interface, dev_part, FS_TYPE_ANY);
	} else if (storage_interface && ubi_mtdpart && ubi_volume) {
		ret = mount_ubifs(ubi_mtdpart, ubi_volume);
		if (ret)
			return ret;

		if (!strcmp("ubi", storage_interface))
			ret = fs_set_blk_dev(storage_interface, NULL,
				FS_TYPE_UBIFS);
		else
			ret = -ENODEV;
	} else {
		ret = select_fs_dev(dev->platdata);
	}

	if (ret)
		goto out;

	struct firmware *firmwarep = dev_get_priv(dev);

	if (!firmwarep)
		return -ENOMEM;

	ret = fs_read(firmwarep->name, (ulong)map_to_sysmem(firmwarep->data),
			firmwarep->offset, firmwarep->size, &actread);

	if (ret) {
		debug("Error: %d Failed to read %s from flash %lld != %zu.\n",
		      ret, firmwarep->name, actread, firmwarep->size);
	} else {
		ret = actread;
	}

out:
#ifdef CONFIG_CMD_UBIFS
	umount_ubifs();
#endif
	return ret;
}
Esempio n. 3
0
static size_t usb_read_file(const char *file_name)
{
	loff_t act_read = 0;
	struct udevice *dev;
	int rc;

	usb_stop();

	if (usb_init() < 0) {
		printf("Error: usb_init failed\n");
		return 0;
	}

	/* Try to recognize storage devices immediately */
	blk_first_device(IF_TYPE_USB, &dev);
	if (!dev) {
		printf("Error: USB storage device not found\n");
		return 0;
	}

	/* Always load from usb 0 */
	if (fs_set_blk_dev("usb", "0", FS_TYPE_ANY)) {
		printf("Error: USB 0 not found\n");
		return 0;
	}

	/* Perfrom file read */
	rc = fs_read(file_name, get_load_addr(), 0, 0, &act_read);
	if (rc)
		return 0;

	return act_read;
}
Esempio n. 4
0
static size_t mmc_read_file(const char *file_name)
{
	loff_t		act_read = 0;
	int		rc;
	struct mmc	*mmc;
	const u8	mmc_dev_num = CONFIG_SYS_MMC_ENV_DEV;

	mmc = find_mmc_device(mmc_dev_num);
	if (!mmc) {
		printf("No SD/MMC/eMMC card found\n");
		return 0;
	}

	if (mmc_init(mmc)) {
		printf("%s(%d) init failed\n", IS_SD(mmc) ? "SD" : "MMC",
		       mmc_dev_num);
		return 0;
	}

	/* Load from data partition (0) */
	if (fs_set_blk_dev("mmc", "0", FS_TYPE_ANY)) {
		printf("Error: MMC 0 not found\n");
		return 0;
	}

	/* Perfrom file read */
	rc = fs_read(file_name, get_load_addr(), 0, 0, &act_read);
	if (rc)
		return 0;

	return act_read;
}
Esempio n. 5
0
static int load_devicetree(void)
{
	char *dtbname = getenv("dtb");
	char *dtbdev = getenv("dtbdev");
	char *dtppart = getenv("dtbpart");
	u32 dtbaddr = getenv_ulong("dtbaddr", 16, ~0UL);
	loff_t dtbsize;

	if (!dtbdev || !dtbdev) {
		puts("load_devicetree: <dtbdev>/<dtbpart> missing.\n");
		return -1;
	}

	if (fs_set_blk_dev(dtbdev, dtppart, FS_TYPE_EXT)) {
		puts("load_devicetree: set_blk_dev failed.\n");
		return -1;
	}
	if (dtbname && dtbaddr != ~0UL) {
		if (fs_read(dtbname, dtbaddr, 0, 0, &dtbsize) == 0) {
			gd->fdt_blob = (void *)dtbaddr;
			gd->fdt_size = dtbsize;
			debug("loaded %d bytes of dtb onto 0x%08x\n",
			      (u32)dtbsize, dtbaddr);
			return dtbsize;
		}
		puts("load_devicetree: load dtb failed,file does not exist!\n");
	}

	puts("load_devicetree: <dtb>/<dtbaddr> missing!\n");
	return -1;
}
Esempio n. 6
0
static int load_devicetree(void)
{
	int rc;
	loff_t dtbsize;
	u32 dtbaddr = env_get_ulong("dtbaddr", 16, 0UL);

	if (dtbaddr == 0) {
		printf("%s: don't have a valid <dtbaddr> in env!\n", __func__);
		return -1;
	}
#ifdef CONFIG_NAND
	dtbsize = 0x20000;
	rc = nand_read_skip_bad(get_nand_dev_by_index(0), 0x40000,
				(size_t *)&dtbsize,
				NULL, 0x20000, (u_char *)dtbaddr);
#else
	char *dtbname = env_get("dtb");
	char *dtbdev = env_get("dtbdev");
	char *dtbpart = env_get("dtbpart");
	if (!dtbdev || !dtbpart || !dtbname) {
		printf("%s: <dtbdev>/<dtbpart>/<dtb> missing.\n", __func__);
		return -1;
	}

	if (fs_set_blk_dev(dtbdev, dtbpart, FS_TYPE_EXT)) {
		puts("load_devicetree: set_blk_dev failed.\n");
		return -1;
	}
	rc = fs_read(dtbname, (u32)dtbaddr, 0, 0, &dtbsize);
#endif
	if (rc == 0) {
		gd->fdt_blob = (void *)dtbaddr;
		gd->fdt_size = dtbsize;
		debug("loaded %d bytes of dtb onto 0x%08x\n",
		      (u32)dtbsize, (u32)gd->fdt_blob);
		return dtbsize;
	}

	printf("%s: load dtb failed!\n", __func__);
	return -1;
}
Esempio n. 7
0
static int select_fs_dev(struct device_platdata *plat)
{
	int ret;

	if (plat->phandlepart.phandle) {
		ofnode node;

		node = ofnode_get_by_phandle(plat->phandlepart.phandle);

		struct udevice *dev;

		ret = device_get_global_by_ofnode(node, &dev);
		if (!ret) {
			struct blk_desc *desc = blk_get_by_device(dev);
			if (desc) {
				ret = fs_set_blk_dev_with_part(desc,
					plat->phandlepart.partition);
			} else {
				debug("%s: No device found\n", __func__);
				return -ENODEV;
			}
		}
	} else if (plat->mtdpart && plat->ubivol) {
		ret = mount_ubifs(plat->mtdpart, plat->ubivol);
		if (ret)
			return ret;

		ret = fs_set_blk_dev("ubi", NULL, FS_TYPE_UBIFS);
	} else {
		debug("Error: unsupported storage device.\n");
		return -ENODEV;
	}

	if (ret)
		debug("Error: could not access storage.\n");

	return ret;
}
Esempio n. 8
0
static int do_update_sdcard(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	//struct update_sdcard_device *fd = f_devices;
	//struct update_sdcard_part *fp;
	//struct list_head *entry, *n;

	char *p;
	unsigned long addr;
	unsigned long time;
	int i = 0;
	int res = 0;
	int len_read = 0;
	int err = 0;

	if (argc != 5)
	{
		printf("## [%s():%d] ret_error \n", __func__,__LINE__);
		goto ret_error;
	}

	memset(f_sdcard_part, 0x0, sizeof(f_sdcard_part)*UPDATE_SDCARD_DEV_PART_MAX);

	len_read = update_sd_do_load(cmdtp, flag, argc, argv, FS_TYPE_FAT, 16);

	if(len_read > 0)
	{
		fboot_lcd_start();

		// partition map parse
		addr = simple_strtoul(argv[3], NULL, 16);

		p = (char*)addr;
		p[len_read+1] = '\0';
		update_sdcard_sort_string((char*)p, len_read);

		setenv("fastboot", (char *)p);
		saveenv();

		err = update_sdcard_part_lists_make(p, strlen(p));

		if (err >= 0)
		{
			struct update_sdcard_part *fp = f_sdcard_part;

			update_sdcard_part_lists_print();
			printf("\n");

			for(i=0; i<UPDATE_SDCARD_DEV_PART_MAX; i++, fp++)
			{
				if(!strcmp(fp->device, ""))	break;

				if (!strcmp(fp->file_name, "dummy"))
					continue;

				if (fs_set_blk_dev(argv[1], (argc >= 3) ? argv[2] : NULL, FS_TYPE_FAT))
				{
					printf("## [%s():%d] ret_error \n", __func__,__LINE__);
					goto ret_error;
				}


				printf("=============================================================\n");

				fboot_lcd_flash((char*)fp->file_name, "reading            ");

				time = get_timer(0);
				len_read = fs_read(fp->file_name, addr, 0, 0);
				time = get_timer(time);

				printf("%d bytes read in %lu ms", len_read, time);
				if (time > 0) {
					puts(" (");
					print_size(len_read / time * 1000, "/s");
					puts(")");
				}
				puts("\n");

				debug("  %s.%d : %s : %s : 0x%llx, 0x%llx : %s\n", 
							fp->device, fp->dev_no, 
							fp->partition_name, UPDATE_SDCARD_FS_MASK&fp->fs_type?"fs":"img", 
							fp->start, fp->length, 
							fp->file_name);

				if( 0 >= len_read)
					continue;

				fboot_lcd_flash((char*)fp->file_name, "flashing           ");

				{
					block_dev_desc_t *desc;
					char cmd[128];
					int i = 0, l = 0, p = 0;
					char *device = fp->device;
					char *partition_name = fp->partition_name;
					char *file_name = fp->file_name;
					uint64_t start = fp->start;
					uint64_t length = fp->length;
					int dev = fp->dev_no;
					unsigned int fs_type = fp->fs_type;
					int part_num = fp->part_num;
					//lbaint_t blk, cnt;
					//int blk_size = 512;

					length=len_read;

					memset(cmd, 0x0, sizeof(cmd));

					if (!strcmp(device, "eeprom"))
					{
						p = sprintf(cmd, "update_eeprom ");

						if (fs_type & UPDATE_SDCARD_FS_BOOT)
							l = sprintf(&cmd[p], "%s", "uboot");
						else if (fs_type & UPDATE_SDCARD_FS_2NDBOOT)
							l = sprintf(&cmd[p], "%s", "2ndboot");
						else
							l = sprintf(&cmd[p], "%s", "raw");
						p += l;
						l = sprintf(&cmd[p], " 0x%x 0x%llx 0x%llx", (unsigned int)addr, start, length);
						p += l;
						cmd[p] = 0;

						debug("%s\n", cmd);
						if(0 > run_command(cmd, 0))
							printf("Flash : %s - %s\n", file_name, "FAIL");
						else
							printf("Flash : %s - %s\n", file_name, "DONE");
					}
					else if (!strcmp(device, "mmc"))
					{
						sprintf(cmd, "mmc dev %d", dev);
						//printf("** mmc.%d partition %s (%s)**\n",
						//	dev, partition_name, fs_type&UPDATE_SDCARD_FS_EXT4?"FS":"Image");

						/* set mmc devicee */
						if (0 > get_device("mmc", simple_itoa(dev), &desc)) {
					    	if (0 > run_command(cmd, 0))
							{
								printf("## [%s():%d] ret_error \n", __func__,__LINE__);
								goto ret_error;
							}

					    	if (0 > run_command("mmc rescan", 0))
							{
								printf("## [%s():%d] ret_error \n", __func__,__LINE__);
								goto ret_error;
							}
						}

						if (0 > run_command(cmd, 0))	/* mmc device */
						{
							printf("## [%s():%d] ret_error \n", __func__,__LINE__);
							goto ret_error;
						}

						if (0 > get_device("mmc", simple_itoa(dev), &desc))
						{
							printf("## [%s():%d] ret_error \n", __func__,__LINE__);
							goto ret_error;
						}

						memset(cmd, 0x0, sizeof(cmd));

						if (fs_type == UPDATE_SDCARD_FS_2NDBOOT ||
							fs_type == UPDATE_SDCARD_FS_BOOT) {


							if (fs_type == UPDATE_SDCARD_FS_2NDBOOT)
								p = sprintf(cmd, "update_mmc %d 2ndboot", dev);
							else
								p = sprintf(cmd, "update_mmc %d boot", dev);

							l = sprintf(&cmd[p], " 0x%x 0x%llx 0x%llx", (unsigned int)addr, start, length);
							p += l;
							cmd[p] = 0;

						}
						else if (fs_type & UPDATE_SDCARD_FS_MASK) 
						{
							if (update_sdcard_mmc_check_part_table(desc, fp) > 0) {
								struct update_sdcard_part *fp_1 = fp;
								int j, cnt=0;
								uint64_t part_start[UPDATE_SDCARD_DEV_PART_MAX];
								uint64_t part_length[UPDATE_SDCARD_DEV_PART_MAX];
								char args[128];

								printf("Warn  : [%s] make new partitions ....\n", partition_name);

								for (j=i; j<UPDATE_SDCARD_DEV_PART_MAX; j++, fp_1++) {
									if(!strcmp(fp_1->device, ""))	break;
									part_start[cnt] = fp_1->start;
									part_length[cnt] = fp_1->length;
									cnt++;
								}

								l = sprintf(args, "fdisk %d %d:", dev, cnt);
								p = l;

								for (j= 0; j < cnt; j++) {
									l = sprintf(&args[p], " 0x%llx:0x%llx", part_start[j], part_length[j]);
									p += l;
								}
								args[p] = 0;
								printf("%s\n", args);

								if(0 > run_command(args, 0))
									printf("fdisk : %s\n", "FAIL");
								else
									printf("fdisk : %s\n", "DONE");


							}

							//blk = fp->start/blk_size ;
							//cnt = (length/blk_size) + ((length & (blk_size-1)) ? 1 : 0);
							//p = sprintf(cmd, "mmc write %x %x %x", addr, blk, cnt);

							p = sprintf(cmd, "update_mmc %d part %x %d %x", dev, (unsigned int)addr, part_num, (unsigned int)length);
						}

						printf("%s\n", cmd);
						if(0 > run_command(cmd, 0))
							printf("Flash : %s - %s\n", file_name, "FAIL");
						else
							printf("Flash : %s - %s\n", file_name, "DONE");

					}

				}

								
			}
			printf("=============================================================\n");
		}
		else
		{
			printf("## [%s():%d] ret_error \n", __func__,__LINE__);
			goto ret_error;
		}
	}
	else
	{
		printf("## [%s():%d] ret_error \n", __func__,__LINE__);
		goto ret_error;
	}

	fboot_lcd_status("exit");

	while (1) {
		if (ctrlc()) 
		{
			printf("update_sdcard end\n\n");
			break;
		}
	}

	//fboot_lcd_stop();
	//do_reset (NULL, 0, 0, NULL);

	return res; 

ret_error:

	fboot_lcd_stop();
	return -1;

}
Esempio n. 9
0
int update_sd_do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],int fstype, int cmdline_base)
{
	unsigned long addr;
	const char *addr_str;
	const char *filename;
	unsigned long bytes;
	unsigned long pos;
	int len_read;
	char buf[12];
	unsigned long time;

	if (argc < 2)
		return CMD_RET_USAGE;
	if (argc > 7)
		return CMD_RET_USAGE;

	if (fs_set_blk_dev(argv[1], (argc >= 3) ? argv[2] : NULL, fstype))
		return -1;

	if (argc >= 4) {
		addr = simple_strtoul(argv[3], NULL, cmdline_base);
	} else {
		addr_str = getenv("loadaddr");
		if (addr_str != NULL)
			addr = simple_strtoul(addr_str, NULL, 16);
		else
			addr = CONFIG_SYS_LOAD_ADDR;
	}
	if (argc >= 5) {
		filename = argv[4];
	} else {
		filename = getenv("bootfile");
		if (!filename) {
			puts("** No boot file defined **\n");
			return -1;
		}
	}
	if (argc >= 6)
		bytes = simple_strtoul(argv[5], NULL, cmdline_base);
	else
		bytes = 0;
	if (argc >= 7)
		pos = simple_strtoul(argv[6], NULL, cmdline_base);
	else
		pos = 0;

	time = get_timer(0);

	len_read = fs_read(filename, addr, pos, bytes);
	time = get_timer(time);
	if (len_read <= 0)
		return -1;

	printf("%d bytes read in %lu ms", len_read, time);
	if (time > 0) {
		puts(" (");
		print_size(len_read / time * 1000, "/s");
		puts(")");
	}
	puts("\n");

	sprintf(buf, "0x%x", len_read);
	setenv("filesize", buf);

	return len_read;
}