|
@@ -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)
|
|
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[])
|
|
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(
|
|
" - 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"
|