Skip to content
Snippets Groups Projects
Commit cc734f5a authored by Paul Burton's avatar Paul Burton Committed by Scott Wood
Browse files

cmd_ubi: add write.part command, to write a volume in multiple parts


This allows you to write data to an UBI volume when the amount of memory
available to write that data from is less than the total size of the
data. For example, you may split a root filesystem UBIFS image into
parts, provide the total size of the image to the first write.part
command and then use multiple write.part commands to write the
subsequent parts of the volume. This results in a sequence of commands
akin to:

  ext4load mmc 0:1 0x80000000 rootfs.ubifs.0
  ubi write.part 0x80000000 root 0x08000000 0x18000000
  ext4load mmc 0:1 0x80000000 rootfs.ubifs.1
  ubi write.part 0x80000000 root 0x08000000
  ext4load mmc 0:1 0x80000000 rootfs.ubifs.2
  ubi write.part 0x80000000 root 0x08000000

This would write 384MiB of data to the UBI volume 'root' whilst only
requiring 128MiB of said data to be held in memory at a time.

Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
Acked-by: default avatarStefan Roese <sr@denx.de>
parent dd7185f1
No related branches found
No related tags found
No related merge requests found
...@@ -266,28 +266,15 @@ out_err: ...@@ -266,28 +266,15 @@ out_err:
return err; return err;
} }
int ubi_volume_write(char *volume, void *buf, size_t size) int ubi_volume_continue_write(char *volume, void *buf, size_t size)
{ {
int err = 1; int err = 1;
int rsvd_bytes = 0;
struct ubi_volume *vol; struct ubi_volume *vol;
vol = ubi_find_volume(volume); vol = ubi_find_volume(volume);
if (vol == NULL) if (vol == NULL)
return ENODEV; return ENODEV;
rsvd_bytes = vol->reserved_pebs * (ubi->leb_size - vol->data_pad);
if (size < 0 || size > rsvd_bytes) {
printf("size > volume size! Aborting!\n");
return EINVAL;
}
err = ubi_start_update(ubi, vol, size);
if (err < 0) {
printf("Cannot start volume update\n");
return -err;
}
err = ubi_more_update_data(ubi, vol, buf, size); err = ubi_more_update_data(ubi, vol, buf, size);
if (err < 0) { if (err < 0) {
printf("Couldnt or partially wrote data\n"); printf("Couldnt or partially wrote data\n");
...@@ -314,6 +301,37 @@ int ubi_volume_write(char *volume, void *buf, size_t size) ...@@ -314,6 +301,37 @@ int ubi_volume_write(char *volume, void *buf, size_t size)
return 0; return 0;
} }
int ubi_volume_begin_write(char *volume, void *buf, size_t size,
size_t full_size)
{
int err = 1;
int rsvd_bytes = 0;
struct ubi_volume *vol;
vol = ubi_find_volume(volume);
if (vol == NULL)
return ENODEV;
rsvd_bytes = vol->reserved_pebs * (ubi->leb_size - vol->data_pad);
if (size < 0 || size > rsvd_bytes) {
printf("size > volume size! Aborting!\n");
return EINVAL;
}
err = ubi_start_update(ubi, vol, full_size);
if (err < 0) {
printf("Cannot start volume update\n");
return -err;
}
return ubi_volume_continue_write(volume, buf, size);
}
int ubi_volume_write(char *volume, void *buf, size_t size)
{
return ubi_volume_begin_write(volume, buf, size, size);
}
int ubi_volume_read(char *volume, char *buf, size_t size) int ubi_volume_read(char *volume, char *buf, size_t size)
{ {
int err, lnum, off, len, tbuf_size; int err, lnum, off, len, tbuf_size;
...@@ -588,7 +606,20 @@ static int do_ubi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) ...@@ -588,7 +606,20 @@ static int do_ubi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
addr = simple_strtoul(argv[2], NULL, 16); addr = simple_strtoul(argv[2], NULL, 16);
size = simple_strtoul(argv[4], NULL, 16); size = simple_strtoul(argv[4], NULL, 16);
ret = ubi_volume_write(argv[3], (void *)addr, size); if (strlen(argv[1]) == 10 &&
strncmp(argv[1] + 5, ".part", 5) == 0) {
if (argc < 6) {
ret = ubi_volume_continue_write(argv[3],
(void *)addr, size);
} else {
size_t full_size;
full_size = simple_strtoul(argv[5], NULL, 16);
ret = ubi_volume_begin_write(argv[3],
(void *)addr, size, full_size);
}
} else {
ret = ubi_volume_write(argv[3], (void *)addr, size);
}
if (!ret) { if (!ret) {
printf("%lld bytes written to volume %s\n", size, printf("%lld bytes written to volume %s\n", size,
argv[3]); argv[3]);
...@@ -636,6 +667,8 @@ U_BOOT_CMD( ...@@ -636,6 +667,8 @@ U_BOOT_CMD(
" - create volume name with size\n" " - create volume name with size\n"
"ubi write[vol] address volume size" "ubi write[vol] address volume size"
" - Write volume from address with size\n" " - Write volume from address with size\n"
"ubi write.part address volume size [fullsize]\n"
" - Write part of a volume from address\n"
"ubi read[vol] address volume [size]" "ubi read[vol] address volume [size]"
" - Read volume to address with size\n" " - Read volume to address with size\n"
"ubi remove[vol] volume" "ubi remove[vol] volume"
......
...@@ -14,6 +14,8 @@ ubi part [part] [offset] ...@@ -14,6 +14,8 @@ ubi part [part] [offset]
ubi info [l[ayout]] - Display volume and ubi layout information ubi info [l[ayout]] - Display volume and ubi layout information
ubi create[vol] volume [size] [type] - create volume name with size ubi create[vol] volume [size] [type] - create volume name with size
ubi write[vol] address volume size - Write volume from address with size ubi write[vol] address volume size - Write volume from address with size
ubi write.part address volume size [fullsize]
- Write part of a volume from address
ubi read[vol] address volume [size] - Read volume to address with size ubi read[vol] address volume [size] - Read volume to address with size
ubi remove[vol] volume - Remove volume ubi remove[vol] volume - Remove volume
[Legends] [Legends]
...@@ -77,6 +79,7 @@ ubi createvol Create UBI volume on UBI device ...@@ -77,6 +79,7 @@ ubi createvol Create UBI volume on UBI device
ubi removevol Remove UBI volume from UBI device ubi removevol Remove UBI volume from UBI device
ubi read Read data from UBI volume to memory ubi read Read data from UBI volume to memory
ubi write Write data from memory to UBI volume ubi write Write data from memory to UBI volume
ubi write.part Write data from memory to UBI volume, in parts
Here a few examples on the usage: Here a few examples on the usage:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment