dfu, nand, ubi: add partubi alt settings for updating ubi partition
PATCH 1/2 dfu, nand, ubi: add partubi alt settings for updating ubi partition
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html
So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.
---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img
This must be fixed ... we have no "ubiformat" in u-boot, or?
--- drivers/dfu/dfu.c | 33 ++++++++++++++++++++++++++++++++- drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++ include/dfu.h | 2 ++
3 Dateien ge?ndert, 60 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)
drivers/dfu/dfu.c +32 -1
@@ -23,6 +23,7 @@#include <errno.h> #include <malloc.h> #include <mmc.h> +#include <nand.h> #include <fat.h> #include <dfu.h> #include <linux/list.h>
@@ -176,6 +177,37 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) ret = dfu->flush_medium (dfu);printf ("\nDFU complete CRC32: 0x%08x\n" , dfu->crc); +/* in case of ubi partition, erase rest of the partition */ +if (dfu->ubi ==1 ) { +int ret; +nand_info_t *nand; +/* erase complete partition */ +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size - opts.offset; + opts.lim = opts.length; + opts.spread =1 ; + opts.quiet =0 ; + ret =nand_erase_opts (nand, &opts); +if (ret) { +printf ("Failure erase: %d\n" , ret); +return ret; + } + } +/* clear everything */ dfu_free_buf (); dfu->crc =0 ;
@@ -186,7 +218,6 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) dfu->i_buf = dfu->i_buf_start; dfu->inited =0 ; - }return ret =0 ? size : ret;
drivers/dfu/dfu_nand.c +26 -0
@@ -153,6 +153,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)char *st;int ret, dev, part; + dfu->ubi =0 ; dfu->dev_type =DFU_DEV_NAND ; st =strsep (&s," " );if (!strcmp (st,"raw" )) {
@@ -185,7 +186,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->data.nand.start = pi->offset; dfu->data.nand.size = pi->size; + }else if (!strcmp (st,"partubi" )) { +char mtd_id[32 ]; +struct mtd_device *mtd_dev; +u8 part_num; +struct part_info *pi; + + dfu->layout =DFU_RAW_ADDR ; + dev =simple_strtoul (s, &s,10 ); + s++; + part =simple_strtoul (s, &s,10 ); + +sprintf (mtd_id,"%s%d,%d" ,"nand" , dev, part -1 ); +printf ("using id '%s'\n" , mtd_id); + +mtdparts_init (); + + ret =find_dev_and_part (mtd_id, &mtd_dev, &part_num, &pi); +if (ret !=0 ) { +printf ("Could not locate '%s'\n" , mtd_id); +return -1 ; + } + + dfu->data.nand.start = pi->offset; + dfu->data.nand.size = pi->size; + dfu->ubi =1 ; }else {printf ("%s: Memory layout (%s) not supported!\n" , __func__, st);return -1 ;
include/dfu.h +2 -0
@@ -111,6 +111,8 @@ struct dfu_entity {u32 bad_skip;/* for nand use */ unsigned int inited:1; +/* for nand/ubi use */ + unsigned int ubi:1; };int dfu_config_entities (char *s,char *interface,int num);
Signature · 1 line
1.7.11.7
PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html
So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.
---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img
This must be fixed ... we have no "ubiformat" in u-boot, or?
- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.
--- drivers/dfu/dfu.c | 30 +++++++++++++++++++++++++++++- drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++ include/dfu.h | 2 ++
3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)
drivers/dfu/dfu.c +29 -1
@@ -23,6 +23,7 @@#include <errno.h> #include <malloc.h> #include <mmc.h> +#include <nand.h> #include <fat.h> #include <dfu.h> #include <linux/list.h>
@@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) ret = dfu->flush_medium (dfu);printf ("\nDFU complete CRC32: 0x%08x\n" , dfu->crc); +/* in case of ubi partition, erase rest of the partition */ +if (dfu->ubi ==1 ) { +int ret; +nand_info_t *nand; +/* erase complete partition */ +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size - opts.offset; + ret =nand_erase_opts (nand, &opts); +if (ret !=0 ) { +printf ("Failure erase: %d\n" , ret); +return ret; + } + } +/* clear everything */ dfu_free_buf (); dfu->crc =0 ;
@@ -186,7 +215,6 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) dfu->i_buf = dfu->i_buf_start; dfu->inited =0 ; - }return ret =0 ? size : ret;
drivers/dfu/dfu_nand.c +26 -0
@@ -153,6 +153,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)char *st;int ret, dev, part; + dfu->ubi =0 ; dfu->dev_type =DFU_DEV_NAND ; st =strsep (&s," " );if (!strcmp (st,"raw" )) {
@@ -185,7 +186,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->data.nand.start = pi->offset; dfu->data.nand.size = pi->size; + }else if (!strcmp (st,"partubi" )) { +char mtd_id[32 ]; +struct mtd_device *mtd_dev; +u8 part_num; +struct part_info *pi; + + dfu->layout =DFU_RAW_ADDR ; + dev =simple_strtoul (s, &s,10 ); + s++; + part =simple_strtoul (s, &s,10 ); + +sprintf (mtd_id,"%s%d,%d" ,"nand" , dev, part -1 ); +printf ("using id '%s'\n" , mtd_id); + +mtdparts_init (); + + ret =find_dev_and_part (mtd_id, &mtd_dev, &part_num, &pi); +if (ret !=0 ) { +printf ("Could not locate '%s'\n" , mtd_id); +return -1 ; + } + + dfu->data.nand.start = pi->offset; + dfu->data.nand.size = pi->size; + dfu->ubi =1 ; }else {printf ("%s: Memory layout (%s) not supported!\n" , __func__, st);return -1 ;
include/dfu.h +2 -0
@@ -111,6 +111,8 @@ struct dfu_entity {u32 bad_skip;/* for nand use */ unsigned int inited:1; +/* for nand/ubi use */ + unsigned int ubi:1; };int dfu_config_entities (char *s,char *interface,int num);
Signature · 1 line
1.7.11.7
PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Dear Heiko Schocher,
Quoted 66 lines
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.Signed-off-by Heiko Schocher <[email protected]>Cc Pantelis Antoniou <[email protected]>Cc Tom Rini <[email protected]>Cc Lukasz Majewski <[email protected]>Cc Kyungmin Park <[email protected]>Cc Marek Vasut <[email protected]>Cc Wolfgang Denk <[email protected]>---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.--- drivers/dfu/dfu.c | 30 +++++++++++++++++++++++++++++- drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++ include/dfu.h | 2 ++3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)
drivers/dfu/dfu.c +16
-0@@ -23,6 +23,7 @@#include <errno.h> #include <malloc.h> #include <mmc.h> +#include <nand.h> #include <fat.h> #include <dfu.h> #include <linux/list.h> @@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) ret = dfu->flush_medium(dfu);printf ("\nDFU complete CRC32: 0x%08x\n" , dfu->crc); +/* in case of ubi partition, erase rest of the partition */ +if (dfu->ubi ==1 ) { +int ret; +nand_info_t *nand; +/* erase complete partition */ +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand = &nand_info[nand_curr_device];
drivers/dfu/dfu.c int dfu_write(struct dfu_entity *dfu, void *buf, int · line 204
Quoted 10 lines
drivers/dfu/dfu.c +10
-0+ +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size - opts.offset; + ret =nand_erase_opts (nand, &opts); +if (ret !=0 ) { +printf ("Failure erase: %d\n" , ret); +return ret;
Are you not leaking memory here ? I suspect you should call dfu_free_buf() as below ?
Quoted 73 lines
drivers/dfu/dfu.c +3
-1+ } + } +/* clear everything */ dfu_free_buf (); dfu->crc =0 ;@@ -186,7 +215,6 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) dfu->i_buf = dfu->i_buf_start; dfu->inited =0 ; - }return ret =0 ? size : ret;drivers/dfu/dfu_nand.c +26
-0@@ -153,6 +153,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) char *st;int ret, dev, part; + dfu->ubi =0 ; dfu->dev_type =DFU_DEV_NAND ; st =strsep (&s," " );if (!strcmp (st,"raw" )) {@@ -185,7 +186,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->data.nand.start = pi->offset; dfu->data.nand.size = pi->size; + }else if (!strcmp (st,"partubi" )) { +char mtd_id[32 ]; +struct mtd_device *mtd_dev; +u8 part_num; +struct part_info *pi; + + dfu->layout =DFU_RAW_ADDR ; + dev =simple_strtoul (s, &s,10 ); + s++; + part =simple_strtoul (s, &s,10 ); + +sprintf (mtd_id,"%s%d,%d" ,"nand" , dev, part -1 ); +printf ("using id '%s'\n" , mtd_id); + +mtdparts_init (); + + ret =find_dev_and_part (mtd_id, &mtd_dev, &part_num, &pi); +if (ret !=0 ) { +printf ("Could not locate '%s'\n" , mtd_id); +return -1 ; + } + + dfu->data.nand.start = pi->offset; + dfu->data.nand.size = pi->size; + dfu->ubi =1 ; }else {printf ("%s: Memory layout (%s) not supported!\n" , __func__, st);drivers/dfu/dfu_nand.c +0
-0return -1 ;include/dfu.h +2
-0@@ -111,6 +111,8 @@ struct dfu_entity {u32 bad_skip;/* for nand use */ unsigned int inited:1; +/* for nand/ubi use */ + unsigned int ubi:1; };int dfu_config_entities (char *s,char *interface,int num);
PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Hello Marek,
Am 16.07.2013 07:00, schrieb Marek Vasut:
Quoted 73 lines
Dear Heiko Schocher,
Quoted 71 lines
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.Signed-off-by Heiko Schocher<[email protected]>Cc Pantelis Antoniou<[email protected]>Cc Tom Rini<[email protected]>Cc Lukasz Majewski<[email protected]>Cc Kyungmin Park<[email protected]>Cc Marek Vasut<[email protected]>Cc Wolfgang Denk<[email protected]>---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.--- drivers/dfu/dfu.c | 30 +++++++++++++++++++++++++++++- drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++ include/dfu.h | 2 ++3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)
drivers/dfu/dfu.c +21
-0@@ -23,6 +23,7 @@#include <errno.h> #include <malloc.h> #include <mmc.h> +#include <nand.h> #include <fat.h> #include <dfu.h> #include <linux/list.h> @@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) ret = dfu->flush_medium(dfu);printf ("\nDFU complete CRC32: 0x%08x\n" , dfu->crc); +/* in case of ubi partition, erase rest of the partition */ +if (dfu->ubi ==1 ) { +int ret; +nand_info_t *nand; +/* erase complete partition */ +nand_erase_options_t opts; + +if (nand_curr_device<0 || + nand_curr_device>=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand =&nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start +
Quoted 8 lines
drivers/dfu/dfu.c int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) · line 204
Quoted 5 lines
drivers/dfu/dfu.c +5
-0+ dfu->data.nand.size - opts.offset; + ret =nand_erase_opts (nand,&opts); +if (ret !=0 ) { +printf ("Failure erase: %d\n" , ret); +return ret;Are you not leaking memory here ? I suspect you should call
dfu_free_buf()as below ?
Yes, fixed. Thanks!
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
In reply to Heiko SchocherHi Heiko,
Quoted 61 lines
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.Signed-off-by Heiko Schocher <[email protected]>Cc Pantelis Antoniou <[email protected]>Cc Tom Rini <[email protected]>Cc Lukasz Majewski <[email protected]>Cc Kyungmin Park <[email protected]>Cc Marek Vasut <[email protected]>Cc Wolfgang Denk <[email protected]>---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.--- drivers/dfu/dfu.c | 30 +++++++++++++++++++++++++++++- drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++ include/dfu.h | 2 ++3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)
drivers/dfu/dfu.c +2
-0@@ -23,6 +23,7 @@#include <errno.h> #include <malloc.h> #include <mmc.h> +#include <nand.h> #include <fat.h> #include <dfu.h> #include <linux/list.h> @@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) ret = dfu->flush_medium(dfu);printf ("\nDFU complete CRC32: 0x%08x\n" , dfu->crc); +/* in case of ubi partition, erase rest of the partition */
drivers/dfu/dfu.c +8
-0+ if (dfu->ubi == 1) { + int ret; + nand_info_t *nand; + /* erase complete partition */ + nand_erase_options_t opts; + + if (nand_curr_device < 0 || + nand_curr_device >=
Quoted 1 line
CONFIG_SYS_MAX_NAND_DEVICE||
^^^^^^^^^^^^^^^^^^^^^^^^^^^ - this config won't be defined at devices, which don't have NAND memory (like Trats). Due to that Trats board is not building.
Please remove memory type dependent code from the common dfu code.
Quoted 92 lines
drivers/dfu/dfu.c +2
-0+ !nand_info[nand_curr_device].name) { + printf("%s: invalid nand device\n",
__func__);drivers/dfu/dfu.c +7
-0+return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start +
dfu->offset+drivers/dfu/dfu.c +3
-0+ dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size -opts.offset;
drivers/dfu/dfu.c +7
-1+ ret =nand_erase_opts (nand, &opts); +if (ret !=0 ) { +printf ("Failure erase: %d\n" , ret); +return ret; + } + } +/* clear everything */ dfu_free_buf (); dfu->crc =0 ;@@ -186,7 +215,6 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) dfu->i_buf = dfu->i_buf_start; dfu->inited =0 ; - }return ret =0 ? size : ret;drivers/dfu/dfu_nand.c +26
-0@@ -153,6 +153,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) char *st;int ret, dev, part; + dfu->ubi =0 ; dfu->dev_type =DFU_DEV_NAND ; st =strsep (&s," " );if (!strcmp (st,"raw" )) {@@ -185,7 +186,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->data.nand.start = pi->offset; dfu->data.nand.size = pi->size; + }else if (!strcmp (st,"partubi" )) { +char mtd_id[32 ]; +struct mtd_device *mtd_dev; +u8 part_num; +struct part_info *pi; + + dfu->layout =DFU_RAW_ADDR ; + dev =simple_strtoul (s, &s,10 ); + s++; + part =simple_strtoul (s, &s,10 ); + +sprintf (mtd_id,"%s%d,%d" ,"nand" , dev, part -1 ); +printf ("using id '%s'\n" , mtd_id); + +mtdparts_init (); + + ret =find_dev_and_part (mtd_id, &mtd_dev, &part_num, &pi); +if (ret !=0 ) { +printf ("Could not locate '%s'\n" , mtd_id); +return -1 ; + } + + dfu->data.nand.start = pi->offset; + dfu->data.nand.size = pi->size; + dfu->ubi =1 ; }else { printf("%s: Memory layout (%s) not supported!\n",
__func__, st); return -1;include/dfu.h +2
-0@@ -111,6 +111,8 @@ struct dfu_entity {u32 bad_skip;/* for nand use */ unsigned int inited:1; +/* for nand/ubi use */ + unsigned int ubi:1; };int dfu_config_entities (char *s,char *interface,int num);
Signature · 5 lines
Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Hello Lukasz,
Am 16.07.2013 09:41, schrieb Lukasz Majewski:
Quoted 68 lines
Hi Heiko,
Quoted 61 lines
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.Signed-off-by Heiko Schocher<[email protected]>Cc Pantelis Antoniou<[email protected]>Cc Tom Rini<[email protected]>Cc Lukasz Majewski<[email protected]>Cc Kyungmin Park<[email protected]>Cc Marek Vasut<[email protected]>Cc Wolfgang Denk<[email protected]>---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.--- drivers/dfu/dfu.c | 30 +++++++++++++++++++++++++++++- drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++ include/dfu.h | 2 ++3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)
drivers/dfu/dfu.c +2
-0@@ -23,6 +23,7 @@#include <errno.h> #include <malloc.h> #include <mmc.h> +#include <nand.h> #include <fat.h> #include <dfu.h> #include <linux/list.h> @@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) ret = dfu->flush_medium(dfu);printf ("\nDFU complete CRC32: 0x%08x\n" , dfu->crc); +/* in case of ubi partition, erase rest of the partition */
drivers/dfu/dfu.c +8
-0+ if (dfu->ubi == 1) { + int ret; + nand_info_t *nand; + /* erase complete partition */ + nand_erase_options_t opts; + + if (nand_curr_device< 0 || + nand_curr_device>=Quoted 1 line
CONFIG_SYS_MAX_NAND_DEVICE||^^^^^^^^^^^^^^^^^^^^^^^^^^^ - this config won't be defined at devices, which don't have NAND memory (like Trats). Due to that Trats board is not building.
Quoted 1 line
Please remove memory type dependent code from the common dfu code.
Oh... Hmm... maybe I move this code to drivers/dfu/dfu_nand.c and make there a dfu_nand_flush() ?
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Hi Heiko,
Quoted 72 lines
Hello Lukasz,
Am 16.07.2013 09:41, schrieb Lukasz Majewski:
Quoted 69 lines
Hi Heiko,
Quoted 62 lines
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.Signed-off-by Heiko Schocher<[email protected]>Cc Pantelis Antoniou<[email protected]>Cc Tom Rini<[email protected]>Cc Lukasz Majewski<[email protected]>Cc Kyungmin Park<[email protected]>Cc Marek Vasut<[email protected]>Cc Wolfgang Denk<[email protected]>---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.--- drivers/dfu/dfu.c | 30 +++++++++++++++++++++++++++++- drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++ include/dfu.h | 2 ++3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)
drivers/dfu/dfu.c +2
-0@@ -23,6 +23,7 @@#include <errno.h> #include <malloc.h> #include <mmc.h> +#include <nand.h> #include <fat.h> #include <dfu.h> #include <linux/list.h> @@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) ret = dfu->flush_medium(dfu);printf ("\nDFU complete CRC32: 0x%08x\n" , dfu->crc); +/* in case of ubi partition, erase rest of the partition */
drivers/dfu/dfu.c +8
-0+ if (dfu->ubi == 1) { + int ret; + nand_info_t *nand; + /* erase complete partition */ + nand_erase_options_t opts; + + if (nand_curr_device< 0 || + nand_curr_device>=Quoted 1 line
CONFIG_SYS_MAX_NAND_DEVICE||^^^^^^^^^^^^^^^^^^^^^^^^^^^ - this config won't be defined at devices, which don't have NAND memory (like Trats). Due to that Trats board is not building.
Quoted 5 lines
Quoted 2 lines
Please remove memory type dependent code from the common dfu
code.Oh... Hmm... maybe I move this code to
drivers/dfu/dfu_nand.cand make there adfu_nand_flush()?
Sounds like a good idea :-). I would prefer to encapsulate NAND (MMC) code at dfu_nand.c (dfu_mmc.c) file.
Quoted 3 lines
bye,
Heiko
Signature · 5 lines
Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
In reply to Heiko Schocher-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 07/16/2013 12:54 AM, Heiko Schocher wrote:
[snip]
Quoted 4 lines
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img
So, lets talk. Have you, or can you, take a guess at how long it might take to add code to allow us to do this the right way?
- --
Tom
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
iQIcBAEBAgAGBQJR5WNhAAoJENk4IS6UOR1WQboP/jY3dOXBg0dADKHlrKRwUKRu 9E1Esp5n6y5M6jNmjNPihSFI0PuLclLMab2ZoByzZn0RGDNq++/G5LK3XfaMAv4H yPOqarY2UPvirND0DeYZW471C5hPfsDNm9SGgOU8eL05+b/VaCiYGYYyMn6crFnr dyMfgmDg16Idr/4VNDSW/kGN+FpP+pD8I2zpSMgrzKM+NcAWRe2cBEWLA6tgJYW+ V5oos+8MdbdsBdOPzFhwY9xsW4S7u5nRVPmKna0/F2y4lI497yi2ctPpDyWFyC9O rQSTD7R/BpSbzb8r3u4tHlPCneR1me/IxzjAXZeCYS9Dj3JpJFJM5rY8xMIBKCd+ b+hbrCmPtkMqTPBAIrQNp8KmNkVrKZEdLnVs45PB7P+ldzBcwMWMZ+jVNVtwb6gw D+QcyAJhFXu4kViJcBVdEBoRmTxvJ15Sqxdg9rgL+cgcmpFUUdIgdkcTMngXKAw6 Fk9i01cTCPRaQMDKlR4fuHaRThQIZmdWLLKtJ1AIryS4ArJFlH5e7onZElj6opVc GvRKfBEm1qe9IeYgVoFP9tQmMyK3sVmeGeivWJ1gtEYHZRO3L/48kgcyv84kxDcF pT3+bx7sxejgVfoQH41Rze7eStrkR8rTy0KoXA5nJX2prV7Nlhwx2SrYnCJT7pPv 1QSW19Jd1R7MnKbbM9/N
=ZXBp
-----END PGP SIGNATURE-----
PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Hello Tom,
Am 16.07.2013 17:14, schrieb Tom Rini:
Quoted 5 lines
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1On 07/16/2013 12:54 AM, Heiko Schocher wrote:
Quoted 8 lines
[snip]
Quoted 4 lines
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgSo, lets talk. Have you, or can you, take a guess at how long it might take to add code to allow us to do this the right way?
Good question! My hope was, that this is a result of a discussion here ;-)
First, we should discuss how to handle an update of an ubi partition on nand with dfu ...
I propose:
a) add a "partubi" for dfu_alt_info as this patch do, so we can use "dfu nand 0" as it is for raw nand partitions *and* nand ubi partitions
b) add a "ubi format ..." command
(or can "ubi write" handle writing ubi images created with
ubinize ? I think no ...)
best: "ubi format ..." should handle incremental writes, so we can use the dfu_buf as it is ... else we must malloc an buffer which can hold the hole image -> the board must have enough ram for this ...
c) use "ubi format ..." for burning the ubi image into the nand ubi partition
a) done with this patch,
b) no real idea how many time it needs ...
c) should be trivial if we have step b)
What Do you think?
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
In reply to Heiko SchocherQuoted 17 lines · Heiko Schocher
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.Signed-off-by Heiko Schocher <[email protected]>Cc Pantelis Antoniou <[email protected]>Cc Tom Rini <[email protected]>Cc Lukasz Majewski <[email protected]>Cc Kyungmin Park <[email protected]>Cc Marek Vasut <[email protected]>Cc Wolfgang Denk <[email protected]>
Quoted 8 lines
---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
The lack of erase counter preservation is a problem, but the part about ECC on erased pages is dealt with in U-Boot by the WITH_DROP_FFS flag.
Quoted 52 lines
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.--- drivers/dfu/dfu.c | 30 +++++++++++++++++++++++++++++- drivers/dfu/dfu_nand.c | 26 ++++++++++++++++++++++++++ include/dfu.h | 2 ++3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)
drivers/dfu/dfu.c +2
-0@@ -23,6 +23,7 @@#include <errno.h> #include <malloc.h> #include <mmc.h> +#include <nand.h> #include <fat.h> #include <dfu.h> #include <linux/list.h> @@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) ret = dfu->flush_medium (dfu);printf ("\nDFU complete CRC32: 0x%08x\n" , dfu->crc); +/* in case of ubi partition, erase rest of the partition */
drivers/dfu/dfu.c +8
-0+ if (dfu->ubi == 1) { + int ret; + nand_info_t *nand; + /* erase complete partition */ + nand_erase_options_t opts; + + if (nand_curr_device < 0 || + nand_curr_device >=
CONFIG_SYS_MAX_NAND_DEVICE||drivers/dfu/dfu.c +2
-0+ !nand_info[nand_curr_device].name) { + printf("%s: invalid nand device\n",
__func__);drivers/dfu/dfu.c +7
-0+return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start +
dfu->offset+drivers/dfu/dfu.c +3
-0+ dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size -opts.offset;
drivers/dfu/dfu.c int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) · line 206
Quoted 6 lines
drivers/dfu/dfu.c +6
-0+ ret =nand_erase_opts (nand, &opts); +if (ret !=0 ) { +printf ("Failure erase: %d\n" , ret); +return ret; + } + }
Instead of separately erasing the remainder of the partition, how about recognizing up front that it's UBI (or that a full partition erase is otherwise desired) and erasing the full partition then? Besides being cleaner, it would be easier to convert to an ubi-aware mechanism.
-Scott
PATCH v2 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Hello Scott,
Am 18.07.2013 00:35, schrieb Scott Wood:
Quoted 20 lines · Heiko Schocher
Quoted 19 lines
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.Signed-off-by Heiko Schocher <[email protected]>Cc Pantelis Antoniou <[email protected]>Cc Tom Rini <[email protected]>Cc Lukasz Majewski <[email protected]>Cc Kyungmin Park <[email protected]>Cc Marek Vasut <[email protected]>Cc Wolfgang Denk <[email protected]>---
Quoted 8 lines
Quoted 6 lines
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
The lack of erase counter preservation is a problem, but the part about ECC on erased pages is dealt with in U-Boot by the
WITH_DROP_FFSflag.
Ah, ok!
Quoted 47 lines
Quoted 47 lines
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.
---drivers/dfu/dfu.c| 30 +++++++++++++++++++++++++++++-drivers/dfu/dfu_nand.c| 26 ++++++++++++++++++++++++++include/dfu.h| 2 ++
3 Dateien ge?ndert, 57 Zeilen hinzugef?gt(+), 1 Zeile entfernt(-)drivers/dfu/dfu.c +23
-0@@ -23,6 +23,7 @@#include <errno.h> #include <malloc.h> #include <mmc.h> +#include <nand.h> #include <fat.h> #include <dfu.h> #include <linux/list.h> @@ -176,6 +177,34 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) ret = dfu->flush_medium (dfu);printf ("\nDFU complete CRC32: 0x%08x\n" , dfu->crc); +/* in case of ubi partition, erase rest of the partition */ +if (dfu->ubi ==1 ) { +int ret; +nand_info_t *nand; +/* erase complete partition */ +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size - opts.offset; + ret =nand_erase_opts (nand, &opts);
Quoted 8 lines
drivers/dfu/dfu.c int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) · line 206
Quoted 5 lines
drivers/dfu/dfu.c +5
-0+if (ret !=0 ) { +printf ("Failure erase: %d\n" , ret); +return ret; + } + }Instead of separately erasing the remainder of the partition, how about recognizing up front that it's UBI (or that a full partition erase is otherwise desired) and erasing the full partition then? Besides being cleaner, it would be easier to convert to an ubi-aware mechanism.
I tried this too, but if I erase the hole partition first (when a dfu transfer is started) I got:
GADGET DRIVER: usb_dnl_dfudfu_write: Wrong sequence number! [7] [0]dfu_write: Wrong sequence number! [7] [1]dfu_write: Wrong sequence number! [7] [2]
So, this version needs more investigation ...
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH v3 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
In reply to Heiko Schocherupdating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html
So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.
---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img
This must be fixed ... we have no "ubiformat" in u-boot, or?
- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.
- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()
--- drivers/dfu/dfu_nand.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/dfu.h | 2 ++
2 Dateien ge?ndert, 60 Zeilen hinzugef?gt(+)
drivers/dfu/dfu_nand.c +58 -0
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,return ret; } +static int dfu_flush_medium_nand (struct dfu_entity *dfu) +{ +int ret =0 ; + +/* in case of ubi partition, erase rest of the partition */ +if (dfu->ubi ==1 ) { +nand_info_t *nand; +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size - opts.offset; + ret =nand_erase_opts (nand, &opts); +if (ret !=0 ) +printf ("Failure erase: %d\n" , ret); + } + +return ret; +} +int dfu_fill_entity_nand (struct dfu_entity *dfu,char *s) {char *st;int ret, dev, part; + dfu->ubi =0 ; dfu->dev_type =DFU_DEV_NAND ; st =strsep (&s," " );if (!strcmp (st,"raw" )) {
@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->data.nand.start = pi->offset; dfu->data.nand.size = pi->size; + }else if (!strcmp (st,"partubi" )) { +char mtd_id[32 ]; +struct mtd_device *mtd_dev; +u8 part_num; +struct part_info *pi; + dfu->layout =DFU_RAW_ADDR ; + + dev =simple_strtoul (s, &s,10 ); + s++; + part =simple_strtoul (s, &s,10 ); + +sprintf (mtd_id,"%s%d,%d" ,"nand" , dev, part -1 ); +printf ("using id '%s'\n" , mtd_id); + +mtdparts_init (); + + ret =find_dev_and_part (mtd_id, &mtd_dev, &part_num, &pi); +if (ret !=0 ) { +printf ("Could not locate '%s'\n" , mtd_id); +return -1 ; + } + + dfu->data.nand.start = pi->offset; + dfu->data.nand.size = pi->size; + dfu->ubi =1 ; }else {printf ("%s: Memory layout (%s) not supported!\n" , __func__, st);return -1 ;
@@ -193,6 +250,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->read_medium = dfu_read_medium_nand; dfu->write_medium = dfu_write_medium_nand; + dfu->flush_medium = dfu_flush_medium_nand;/* initial state */ dfu->inited =0 ;
include/dfu.h +2 -0
@@ -111,6 +111,8 @@ struct dfu_entity {u32 bad_skip;/* for nand use */ unsigned int inited:1; +/* for nand/ubi use */ + unsigned int ubi:1; };int dfu_config_entities (char *s,char *interface,int num);
Signature · 1 line
1.7.11.7
PATCH v3 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
On Thu, 18 Jul 2013 08:04:55 +0200 Heiko Schocher hs at denx.de wrote,
Hi Heiko,
Quoted 46 lines
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.Signed-off-by Heiko Schocher <[email protected]>Cc Pantelis Antoniou <[email protected]>Cc Tom Rini <[email protected]>Cc Lukasz Majewski <[email protected]>Cc Kyungmin Park <[email protected]>Cc Marek Vasut <[email protected]>Cc Wolfgang Denk <[email protected]>---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code todfu_nand.cdfu_flush_medium_nand()--- drivers/dfu/dfu_nand.c | 58++++++++++++++++++++++++++++++++++++++++++++++++++
include/dfu.h| 2 ++ 2 Dateien ge?ndert, 60 Zeilen
hinzugef?gt(+)drivers/dfu/dfu_nand.c +0
-0
drivers/dfu/dfu_nand.c static int dfu_read_medium_nand(struct · line 156
Quoted 9 lines
drivers/dfu/dfu_nand.c +6
-0@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf, return ret; } +static int dfu_flush_medium_nand (struct dfu_entity *dfu) +{ +int ret =0 ; + +/* in case of ubi partition, erase rest of the partition */ +if (dfu->ubi ==1 ) {
^^^^^^^^^^^^^^^^^^ if (dfu->ubi) shall be enough here.
Quoted 82 lines
drivers/dfu/dfu_nand.c +26
-0+nand_info_t *nand; +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size - opts.offset; + ret =nand_erase_opts (nand, &opts); +if (ret !=0 ) +printf ("Failure erase: %d\n" , ret); + } + +return ret; +} +int dfu_fill_entity_nand (struct dfu_entity *dfu,char *s) {char *st;int ret, dev, part; + dfu->ubi =0 ; dfu->dev_type =DFU_DEV_NAND ; st =strsep (&s," " );drivers/dfu/dfu_nand.c +25
-0if (!strcmp (st,"raw" )) {@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->data.nand.start = pi->offset; dfu->data.nand.size = pi->size; + }else if (!strcmp (st,"partubi" )) { +char mtd_id[32 ]; +struct mtd_device *mtd_dev; +u8 part_num; +struct part_info *pi; + dfu->layout =DFU_RAW_ADDR ; + + dev =simple_strtoul (s, &s,10 ); + s++; + part =simple_strtoul (s, &s,10 ); + +sprintf (mtd_id,"%s%d,%d" ,"nand" , dev, part -1 ); +printf ("using id '%s'\n" , mtd_id); + +mtdparts_init (); + + ret =find_dev_and_part (mtd_id, &mtd_dev, &part_num, &pi); +if (ret !=0 ) { +printf ("Could not locate '%s'\n" , mtd_id); +return -1 ; + } + + dfu->data.nand.start = pi->offset; + dfu->data.nand.size = pi->size; + dfu->ubi =1 ; }else { printf("%s: Memory layout (%s) not supported!\n",
__func__, st); return -1;drivers/dfu/dfu_nand.c +1
-0@@ -193,6 +250,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->read_medium = dfu_read_medium_nand; dfu->write_medium = dfu_write_medium_nand; + dfu->flush_medium = dfu_flush_medium_nand;/* initial state */ dfu->inited =0 ;include/dfu.h +0
-0
include/dfu.h struct dfu_entity { · line 115
Quoted 5 lines
include/dfu.h +2
-0@@ -111,6 +111,8 @@ struct dfu_entity {u32 bad_skip;/* for nand use */ unsigned int inited:1; +/* for nand/ubi use */ + unsigned int ubi:1;
Maybe it would be better to add this flag to struct nand_internal_data? It seems to me like a nand specific.
As a side note, I'm curious how bool ubi would be implemented by the compiler and if it is equivalent to explicite bit fields.
Quoted 3 lines
include/dfu.h +0
-0};int dfu_config_entities (char *s,char *interface,int num);
Signature · 5 lines
Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH v3 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Quoted 2 lines · Lukasz Majewski
As a side note, I'm curious how bool ubi would be implemented by the compiler and if it is equivalent to explicite bit fields.
I believe the compiler implements bool as an 8-bit data type.
-Scott
PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
In reply to Heiko Schocherupdating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.html
So, add partubi alt setting for the dfu_alt_info environment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.
---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img
This must be fixed ... we have no "ubiformat" in u-boot, or?
- changes for v2:
- do not use spread = 1 for nand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.
- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code to dfu_nand.c dfu_flush_medium_nand()
- changes for v4:
- add comment from Lukasz Majewski:
- move ubi var to internal struct struct nand_internal_data
--- drivers/dfu/dfu_nand.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/dfu.h | 2 ++
2 Dateien ge?ndert, 60 Zeilen hinzugef?gt(+)
drivers/dfu/dfu_nand.c +58 -0
@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,return ret; } +static int dfu_flush_medium_nand (struct dfu_entity *dfu) +{ +int ret =0 ; + +/* in case of ubi partition, erase rest of the partition */ +if (dfu->data.nand.ubi) { +nand_info_t *nand; +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size - opts.offset; + ret =nand_erase_opts (nand, &opts); +if (ret !=0 ) +printf ("Failure erase: %d\n" , ret); + } + +return ret; +} +int dfu_fill_entity_nand (struct dfu_entity *dfu,char *s) {char *st;int ret, dev, part; + dfu->data.nand.ubi =0 ; dfu->dev_type =DFU_DEV_NAND ; st =strsep (&s," " );if (!strcmp (st,"raw" )) {
@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->data.nand.start = pi->offset; dfu->data.nand.size = pi->size; + }else if (!strcmp (st,"partubi" )) { +char mtd_id[32 ]; +struct mtd_device *mtd_dev; +u8 part_num; +struct part_info *pi; + dfu->layout =DFU_RAW_ADDR ; + + dev =simple_strtoul (s, &s,10 ); + s++; + part =simple_strtoul (s, &s,10 ); + +sprintf (mtd_id,"%s%d,%d" ,"nand" , dev, part -1 ); +printf ("using id '%s'\n" , mtd_id); + +mtdparts_init (); + + ret =find_dev_and_part (mtd_id, &mtd_dev, &part_num, &pi); +if (ret !=0 ) { +printf ("Could not locate '%s'\n" , mtd_id); +return -1 ; + } + + dfu->data.nand.start = pi->offset; + dfu->data.nand.size = pi->size; + dfu->data.nand.ubi =1 ; }else {printf ("%s: Memory layout (%s) not supported!\n" , __func__, st);return -1 ;
@@ -193,6 +250,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->read_medium = dfu_read_medium_nand; dfu->write_medium = dfu_write_medium_nand; + dfu->flush_medium = dfu_flush_medium_nand;/* initial state */ dfu->inited =0 ;
include/dfu.h +2 -0
@@ -59,6 +59,8 @@ struct nand_internal_data {unsigned int dev;unsigned int part; +/* for nand/ubi use */ +unsigned int ubi; };static inline unsigned int get_mmc_blk_size (int dev)
Signature · 1 line
1.7.11.7
PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
On Fri, 19 Jul 2013 06:32:14 +0200 Heiko Schocher hs at denx.de wrote,
Hi Heiko,
Quoted 8 lines
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.
I've tested it on Trats. This patch seems to be orthogonal and doesn't interfere with eMMC.
Quoted 141 lines
Signed-off-by Heiko Schocher <[email protected]>Cc Pantelis Antoniou <[email protected]>Cc Tom Rini <[email protected]>Cc Lukasz Majewski <[email protected]>Cc Kyungmin Park <[email protected]>Cc Marek Vasut <[email protected]>Cc Wolfgang Denk <[email protected]>---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code todfu_nand.cdfu_flush_medium_nand()- changes for v4:
- add comment from Lukasz Majewski:
- move ubi var to internal struct structnand_internal_data--- drivers/dfu/dfu_nand.c | 58++++++++++++++++++++++++++++++++++++++++++++++++++
include/dfu.h| 2 ++ 2 Dateien ge?ndert, 60 Zeilen
hinzugef?gt(+)drivers/dfu/dfu_nand.c +32
-0@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf, return ret; } +static int dfu_flush_medium_nand (struct dfu_entity *dfu) +{ +int ret =0 ; + +/* in case of ubi partition, erase rest of the partition */ +if (dfu->data.nand.ubi) { +nand_info_t *nand; +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size - opts.offset; + ret =nand_erase_opts (nand, &opts); +if (ret !=0 ) +printf ("Failure erase: %d\n" , ret); + } + +return ret; +} +int dfu_fill_entity_nand (struct dfu_entity *dfu,char *s) {char *st;int ret, dev, part; + dfu->data.nand.ubi =0 ; dfu->dev_type =DFU_DEV_NAND ; st =strsep (&s," " );drivers/dfu/dfu_nand.c +25
-0if (!strcmp (st,"raw" )) {@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->data.nand.start = pi->offset; dfu->data.nand.size = pi->size; + }else if (!strcmp (st,"partubi" )) { +char mtd_id[32 ]; +struct mtd_device *mtd_dev; +u8 part_num; +struct part_info *pi; + dfu->layout =DFU_RAW_ADDR ; + + dev =simple_strtoul (s, &s,10 ); + s++; + part =simple_strtoul (s, &s,10 ); + +sprintf (mtd_id,"%s%d,%d" ,"nand" , dev, part -1 ); +printf ("using id '%s'\n" , mtd_id); + +mtdparts_init (); + + ret =find_dev_and_part (mtd_id, &mtd_dev, &part_num, &pi); +if (ret !=0 ) { +printf ("Could not locate '%s'\n" , mtd_id); +return -1 ; + } + + dfu->data.nand.start = pi->offset; + dfu->data.nand.size = pi->size; + dfu->data.nand.ubi =1 ; }else { printf("%s: Memory layout (%s) not supported!\n",
__func__, st); return -1;drivers/dfu/dfu_nand.c +1
-0@@ -193,6 +250,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->read_medium = dfu_read_medium_nand; dfu->write_medium = dfu_write_medium_nand; + dfu->flush_medium = dfu_flush_medium_nand;/* initial state */ dfu->inited =0 ;include/dfu.h +2
-0@@ -59,6 +59,8 @@ struct nand_internal_data {unsigned int dev;unsigned int part; +/* for nand/ubi use */ +unsigned int ubi; };static inline unsigned int get_mmc_blk_size (int dev)
Signature · 5 lines
Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Dear Lukasz Majewski,
Quoted 13 lines
On Fri, 19 Jul 2013 06:32:14 +0200 Heiko Schocher hs at denx.de wrote,
Hi Heiko,
Quoted 8 lines
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.
Quoted 5 lines
I've tested it on Trats. This patch seems to be orthogonal and doesn't interfere with eMMC.
I'll wait for Scott's ACK and then pick this, ok?
Best regards,
Marek Vasut
PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
In reply to Heiko SchocherQuoted 17 lines · Heiko Schocher
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.Signed-off-by Heiko Schocher <[email protected]>Cc Pantelis Antoniou <[email protected]>Cc Tom Rini <[email protected]>Cc Lukasz Majewski <[email protected]>Cc Kyungmin Park <[email protected]>Cc Marek Vasut <[email protected]>Cc Wolfgang Denk <[email protected]>
Quoted 8 lines
---
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
In the meantime, should you be using WITH_DROP_FFS when "ubi" is set? Though we really should be skipping FFs at the end of each block, rather than just at the end of the image.
Quoted 24 lines
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code todfu_nand.cdfu_flush_medium_nand()- changes for v4:
- add comment from Lukasz Majewski:
- move ubi var to internal struct structnand_internal_data--- drivers/dfu/dfu_nand.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/dfu.h | 2 ++2 Dateien ge?ndert, 60 Zeilen hinzugef?gt(+)
drivers/dfu/dfu_nand.c +0
-0
drivers/dfu/dfu_nand.c static int dfu_read_medium_nand(struct · line 156
Quoted 9 lines
drivers/dfu/dfu_nand.c +5
-0@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf, return ret; } +static int dfu_flush_medium_nand (struct dfu_entity *dfu) +{ +int ret =0 ; + +/* in case of ubi partition, erase rest of the partition */
Did you have a chance to investigate the errors you saw when erasing the whole partition up front? If there's other DFU data in the partition that needs to be preserved, then replace "partition" with "area reserved for this image".
-Scott
PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Hello Scott,
Am 22.07.2013 23:24, schrieb Scott Wood:
Quoted 20 lines · Heiko Schocher
Quoted 19 lines
updating an ubi partition needs a completely erased mtd partition, see:
http://lists.infradead.org/pipermail/linux-mtd/2011-May/035416.htmlSo, add partubi alt setting for the
dfu_alt_infoenvironment variable to mark this partition as an ubi partition. In case we update an ubi partition, we erase after flashing the image into the partition, the remaining sektors.Signed-off-by Heiko Schocher <[email protected]>Cc Pantelis Antoniou <[email protected]>Cc Tom Rini <[email protected]>Cc Lukasz Majewski <[email protected]>Cc Kyungmin Park <[email protected]>Cc Marek Vasut <[email protected]>Cc Wolfgang Denk <[email protected]>---
Quoted 8 lines
Quoted 6 lines
- This patch is also a good starting point to fix up updating ubi, as we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_imgThis must be fixed ... we have no "ubiformat" in u-boot, or?
In the meantime, should you be using
WITH_DROP_FFSwhen "ubi" is set? Though we really should be skipping FFs at the end of each block, rather than just at the end of the image.
Yes, but this would be another patch, as this patch did not touch the nand write part ...!
Quoted 26 lines
Quoted 26 lines
- changes for v2:
- do not use spread = 1 fornand_erase_opts, to prevent errormessage if there are bad blocks in the erase range.- changes for v3:
- add comment from Marek Vasut:
- prevent losing memory
- added comment from Lukasz Majewski:
- move code todfu_nand.cdfu_flush_medium_nand()- changes for v4:
- add comment from Lukasz Majewski:
- move ubi var to internal struct structnand_internal_data
---drivers/dfu/dfu_nand.c| 58 ++++++++++++++++++++++++++++++++++++++++++++++++++include/dfu.h| 2 ++
2 Dateien ge?ndert, 60 Zeilen hinzugef?gt(+)drivers/dfu/dfu_nand.c +0
-0@@ -148,11 +148,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,return ret; }
Quoted 7 lines
drivers/dfu/dfu_nand.c static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf, · line 155
Quoted 5 lines
drivers/dfu/dfu_nand.c +5
-0+static int dfu_flush_medium_nand (struct dfu_entity *dfu) +{ +int ret =0 ; + +/* in case of ubi partition, erase rest of the partition */ Did you have a chance to investigate the errors you saw when erasing the whole partition up front? If there's other DFU data in the partition that needs to be preserved, then replace "partition" with "area reserved for this image".
Currently no :-(
But I hope to get the chance to fix this in the correct way, by introducing an "ubi format ..." command ...
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Quoted 10 lines · Heiko Schocher
Hello Scott,
Am 22.07.2013 23:24, schrieb Scott Wood:
Quoted 7 lines · Heiko Schocher
Quoted 6 lines
- This patch is also a good starting point to fix up updating ubi, as
we currently use "nand erase" for erasing the sektors. This is not the prefered way for writing an ubi image, see:
http://www.linux-mtd.infradead.org/faq/ubi.html#L_flash_img
Quoted 8 lines
Quoted 5 lines
Quoted 1 line
This must be fixed ... we have no "ubiformat" in u-boot, or?
In the meantime, should you be using
WITH_DROP_FFSwhen "ubi" is set? Though we really should be skipping FFs at the end of each block, rather than just at the end of the image.Yes, but this would be another patch, as this patch did not touch the nand write part ...!
It was a response to the comment, not to the patch.
-Scott
PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
In reply to Heiko SchocherQuoted 13 lines · Heiko Schocher
drivers/dfu/dfu_nand.c +13
-0+static int dfu_flush_medium_nand (struct dfu_entity *dfu) +{ +int ret =0 ; + +/* in case of ubi partition, erase rest of the partition */ +if (dfu->data.nand.ubi) { +nand_info_t *nand; +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__);
drivers/dfu/dfu_nand.c static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf, · line 173
Quoted 10 lines
drivers/dfu/dfu_nand.c +10
-0+return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size - opts.offset;
opts.length is equivalent to dfu->data.nand.size - dfu->offset - dfu->bad_skip. Is this correct? dfu->data.nand.size includes dfu->offset, but dfu->data.nand.start doesn't?
Quoted 22 lines
drivers/dfu/dfu_nand.c +16
-0@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->data.nand.start = pi->offset; + }else if (!strcmp (st,"partubi" )) { dfu->data.nand.size = pi->size; +char mtd_id[32 ]; +struct mtd_device *mtd_dev; +u8 part_num; +struct part_info *pi; + dfu->layout =DFU_RAW_ADDR ; + + dev =simple_strtoul (s, &s,10 ); + s++; + part =simple_strtoul (s, &s,10 ); + +sprintf (mtd_id,"%s%d,%d" ,"nand" , dev, part -1 ); +printf ("using id '%s'\n" , mtd_id); + +mtdparts_init (); +
drivers/dfu/dfu_nand.c int dfu_fill_entity_nand(struct dfu_entity *dfu, · line 247
Quoted 10 lines
drivers/dfu/dfu_nand.c +9
-0+ ret =find_dev_and_part (mtd_id, &mtd_dev, &part_num, &pi); +if (ret !=0 ) { +printf ("Could not locate '%s'\n" , mtd_id); +return -1 ; + } + + dfu->data.nand.start = pi->offset; + dfu->data.nand.size = pi->size; + dfu->data.nand.ubi =1 ;
Please don't duplicate all of this just to set one flag at the end.
-Scott
PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Hello Scott,
Am 24.07.2013 01:22, schrieb Scott Wood:
Quoted 18 lines · Heiko Schocher
Quoted 17 lines
drivers/dfu/dfu_nand.c +17
-0+static int dfu_flush_medium_nand (struct dfu_entity *dfu) +{ +int ret =0 ; + +/* in case of ubi partition, erase rest of the partition */ +if (dfu->data.nand.ubi) { +nand_info_t *nand; +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand = &nand_info[nand_curr_device];
Quoted 8 lines
Quoted 6 lines
+
+memset(&opts, 0, sizeof(opts));
+ opts.offset =dfu->data.nand.start+dfu->offset+
+dfu->bad_skip;
+ opts.length =dfu->data.nand.start+
+dfu->data.nand.size- opts.offset;opts.length is equivalent to
dfu->data.nand.size-dfu->offset-dfu->bad_skip. Is this correct?dfu->data.nand.sizeincludesdfu->offset, butdfu->data.nand.startdoesn't?
Yes, it is correct!
I could not parse "dfu->data.nand.size includes dfu->offset, but dfu->data.nand.start doesn't" ... What do you mean?
I need to calculate "opts-offset" and "opts.length" for nand_erase_opts():
opts.offset contains the starting sector where the erase should begin
dfu->data.nand.start is equal to the starting sector of the
partition, so this is needed here + dfu->offset + dfu->bad_skip
and we are at our starting point.opts.length contains the count of sectors to erase.
I just did here end_sector - start_sector with:
end_sector = dfu->data.nand.start + dfu->data.nand.size start_sector = opts.offset
Maybe my calculation of opts.length is confusing, and I should use "dfu->data.nand.size - dfu->offset - dfu->bad_skip" ?
Quoted 24 lines
Quoted 24 lines
drivers/dfu/dfu_nand.c +19
-0@@ -185,7 +217,32 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) dfu->data.nand.start = pi->offset; + }else if (!strcmp (st,"partubi" )) { dfu->data.nand.size = pi->size; +char mtd_id[32 ]; +struct mtd_device *mtd_dev; +u8 part_num; +struct part_info *pi; + dfu->layout =DFU_RAW_ADDR ; + + dev =simple_strtoul (s, &s,10 ); + s++; + part =simple_strtoul (s, &s,10 ); + +sprintf (mtd_id,"%s%d,%d" ,"nand" , dev, part -1 ); +printf ("using id '%s'\n" , mtd_id); + +mtdparts_init (); + + ret =find_dev_and_part (mtd_id, &mtd_dev, &part_num, &pi); +if (ret !=0 ) { +printf ("Could not locate '%s'\n" , mtd_id);
Quoted 8 lines
drivers/dfu/dfu_nand.c int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) · line 245
Quoted 6 lines
drivers/dfu/dfu_nand.c +6
-0+return -1 ; + } + + dfu->data.nand.start = pi->offset; + dfu->data.nand.size = pi->size; + dfu->data.nand.ubi =1 ;Please don't duplicate all of this just to set one flag at the end.
You are right! Fixed!
Thanks!
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Quoted 32 lines · Heiko Schocher
Hello Scott,
Am 24.07.2013 01:22, schrieb Scott Wood:
Quoted 20 lines · Heiko Schocher
Quoted 19 lines
drivers/dfu/dfu_nand.c +19
-0+static int dfu_flush_medium_nand (struct dfu_entity *dfu) +{ +int ret =0 ; + +/* in case of ubi partition, erase rest of the partition */ +if (dfu->data.nand.ubi) { +nand_info_t *nand; +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__); +return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts));Quoted 8 lines
Quoted 4 lines
+ opts.offset =
dfu->data.nand.start+dfu->offset+
+dfu->bad_skip;
+ opts.length =dfu->data.nand.start+
+dfu->data.nand.size- opts.offset;opts.length is equivalent to
dfu->data.nand.size-dfu->offset-dfu->bad_skip. Is this correct?dfu->data.nand.sizeincludesdfu->offset, butdfu->data.nand.startdoesn't?
Quoted 1 line
Yes, it is correct!
No need to shout...
Quoted 2 lines
I could not parse "
dfu->data.nand.sizeincludesdfu->offset, butdfu->data.nand.startdoesn't" ... What do you mean?
I think my confusion was over what dfu->offset and nand.start represent. If nand.start/nand.size describe the raw partition, and dfu->offset is the offset into that partition that the image starts at, then this looks OK.
-Scott
PATCH v4 1/1 dfu, nand, ubi: add partubi alt settings for updating ubi partition
Hello Scott,
Am 24.07.2013 21:08, schrieb Scott Wood:
Quoted 31 lines · Heiko Schocher
Quoted 30 lines
Hello Scott,
Am 24.07.2013 01:22, schrieb Scott Wood:
Quoted 26 lines · Heiko Schocher
Quoted 13 lines
drivers/dfu/dfu_nand.c +13
-0+static int dfu_flush_medium_nand (struct dfu_entity *dfu) +{ +int ret =0 ; + +/* in case of ubi partition, erase rest of the partition */ +if (dfu->data.nand.ubi) { +nand_info_t *nand; +nand_erase_options_t opts; + +if (nand_curr_device <0 || + nand_curr_device >=CONFIG_SYS_MAX_NAND_DEVICE || + !nand_info[nand_curr_device].name) { +printf ("%s: invalid nand device\n" , __func__);drivers/dfu/dfu_nand.c static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf, · line 173
Quoted 10 lines
drivers/dfu/dfu_nand.c +10
-0+return -1 ; + } + + nand = &nand_info[nand_curr_device]; + +memset (&opts,0 ,sizeof (opts)); + opts.offset = dfu->data.nand.start + dfu->offset + + dfu->bad_skip; + opts.length = dfu->data.nand.start + + dfu->data.nand.size - opts.offset;opts.length is equivalent to
dfu->data.nand.size-dfu->offset-dfu->bad_skip. Is this correct?dfu->data.nand.sizeincludesdfu->offset, butdfu->data.nand.startdoesn't?
Quoted 3 lines
Quoted 1 line
Yes, it is correct!
No need to shout...
Sorry, I did not intent to shout ...
Quoted 4 lines
Quoted 2 lines
I could not parse "
dfu->data.nand.sizeincludesdfu->offset, butdfu->data.nand.startdoesn't" ... What do you mean?I think my confusion was over what
dfu->offsetand nand.start represent. If nand.start/nand.size describe the raw partition, anddfu->offsetis the offset into that partition that the image starts at, then this looks OK.
Ok, I send an update of this patch for your other comment, thanks.
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany