|
|
|
@ -50,14 +50,16 @@ static void ums_fini(void) |
|
|
|
|
|
|
|
|
|
#define UMS_NAME_LEN 16 |
|
|
|
|
|
|
|
|
|
static int ums_init(const char *devtype, const char *devnums) |
|
|
|
|
static int ums_init(const char *devtype, const char *devnums_part_str) |
|
|
|
|
{ |
|
|
|
|
char *s, *t, *devnum, *name; |
|
|
|
|
char *s, *t, *devnum_part_str, *name; |
|
|
|
|
struct blk_desc *block_dev; |
|
|
|
|
disk_partition_t info; |
|
|
|
|
int partnum; |
|
|
|
|
int ret; |
|
|
|
|
struct ums *ums_new; |
|
|
|
|
|
|
|
|
|
s = strdup(devnums); |
|
|
|
|
s = strdup(devnums_part_str); |
|
|
|
|
if (!s) |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
@ -65,14 +67,23 @@ static int ums_init(const char *devtype, const char *devnums) |
|
|
|
|
ums_count = 0; |
|
|
|
|
|
|
|
|
|
for (;;) { |
|
|
|
|
devnum = strsep(&t, ","); |
|
|
|
|
if (!devnum) |
|
|
|
|
devnum_part_str = strsep(&t, ","); |
|
|
|
|
if (!devnum_part_str) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
ret = blk_get_device_by_str(devtype, devnum, &block_dev); |
|
|
|
|
if (ret < 0) |
|
|
|
|
partnum = blk_get_device_part_str(devtype, devnum_part_str, |
|
|
|
|
&block_dev, &info, 1); |
|
|
|
|
|
|
|
|
|
if (partnum < 0) |
|
|
|
|
goto cleanup; |
|
|
|
|
|
|
|
|
|
/* Check if the argument is in legacy format. If yes,
|
|
|
|
|
* expose all partitions by setting the partnum = 0 |
|
|
|
|
* e.g. ums 0 mmc 0 |
|
|
|
|
*/ |
|
|
|
|
if (!strchr(devnum_part_str, ':')) |
|
|
|
|
partnum = 0; |
|
|
|
|
|
|
|
|
|
/* f_mass_storage.c assumes SECTOR_SIZE sectors */ |
|
|
|
|
if (block_dev->blksz != SECTOR_SIZE) { |
|
|
|
|
ret = -1; |
|
|
|
@ -86,10 +97,18 @@ static int ums_init(const char *devtype, const char *devnums) |
|
|
|
|
} |
|
|
|
|
ums = ums_new; |
|
|
|
|
|
|
|
|
|
/* if partnum = 0, expose all partitions */ |
|
|
|
|
if (partnum == 0) { |
|
|
|
|
ums[ums_count].start_sector = 0; |
|
|
|
|
ums[ums_count].num_sectors = block_dev->lba; |
|
|
|
|
} else { |
|
|
|
|
ums[ums_count].start_sector = info.start; |
|
|
|
|
ums[ums_count].num_sectors = info.size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ums[ums_count].read_sector = ums_read_sector; |
|
|
|
|
ums[ums_count].write_sector = ums_write_sector; |
|
|
|
|
ums[ums_count].start_sector = 0; |
|
|
|
|
ums[ums_count].num_sectors = block_dev->lba; |
|
|
|
|
|
|
|
|
|
name = malloc(UMS_NAME_LEN); |
|
|
|
|
if (!name) { |
|
|
|
|
ret = -1; |
|
|
|
@ -230,6 +249,6 @@ cleanup_ums_init: |
|
|
|
|
|
|
|
|
|
U_BOOT_CMD(ums, 4, 1, do_usb_mass_storage, |
|
|
|
|
"Use the UMS [USB Mass Storage]", |
|
|
|
|
"<USB_controller> [<devtype>] <devnum> e.g. ums 0 mmc 0\n" |
|
|
|
|
"<USB_controller> [<devtype>] <dev[:part]> e.g. ums 0 mmc 0\n" |
|
|
|
|
" devtype defaults to mmc" |
|
|
|
|
); |
|
|
|
|