* [U-Boot] [PATCH 7/7] FAT: Make it possible to read from any file position @ 2012-07-19 22:03 Benoît Thébaudeau 2012-07-19 22:44 ` Mike Frysinger 0 siblings, 1 reply; 16+ messages in thread From: Benoît Thébaudeau @ 2012-07-19 22:03 UTC (permalink / raw) To: u-boot When storage devices contain files larger than the embedded RAM, it is useful to be able to read these files by chunks, e.g. for a software update to the embedded NAND Flash from an external storage device (USB stick, SD card, etc.). Hence, this patch makes it possible by adding a new FAT API to read files from a given position. Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau@advansee.com> Cc: Wolfgang Denk <wd@denx.de> --- .../fs/fat/fat.c | 90 ++++++++++++++++---- 1 file changed, 72 insertions(+), 18 deletions(-) diff --git u-boot-66714b1.orig/fs/fat/fat.c u-boot-66714b1/fs/fat/fat.c index 8ac8b85..709a5eb 100644 --- u-boot-66714b1.orig/fs/fat/fat.c +++ u-boot-66714b1/fs/fat/fat.c @@ -329,13 +329,16 @@ get_cluster (fsdata *mydata, __u32 clustnum, __u8 *buffer, } /* - * Read at most 'maxsize' bytes from the file associated with 'dentptr' + * Read at most 'maxsize' bytes from 'pos' in the file associated with 'dentptr' * into 'buffer'. * Return the number of bytes read or -1 on fatal errors. */ +__u8 get_contents_vfatname_block[MAX_CLUSTSIZE] + __aligned(ARCH_DMA_MINALIGN); + static long -get_contents (fsdata *mydata, dir_entry *dentptr, __u8 *buffer, - unsigned long maxsize) +get_contents (fsdata *mydata, dir_entry *dentptr, unsigned long pos, + __u8 *buffer, unsigned long maxsize) { unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0; unsigned int bytesperclust = mydata->clust_size * mydata->sect_size; @@ -345,12 +348,59 @@ get_contents (fsdata *mydata, dir_entry *dentptr, __u8 *buffer, debug("Filesize: %ld bytes\n", filesize); - if (maxsize > 0 && filesize > maxsize) - filesize = maxsize; + if (pos >= filesize) { + debug("Read position past EOF: %lu\n", pos); + return gotsize; + } + + if (maxsize > 0 && filesize > pos + maxsize) + filesize = pos + maxsize; debug("%ld bytes\n", filesize); actsize = bytesperclust; + + /* go to cluster at pos */ + while (actsize <= pos) { + curclust = get_fatent(mydata, curclust); + if (CHECK_CLUST(curclust, mydata->fatsize)) { + debug("curclust: 0x%x\n", curclust); + debug("Invalid FAT entry\n"); + return gotsize; + } + actsize += bytesperclust; + } + + /* actsize > pos */ + actsize -= bytesperclust; + filesize -= actsize; + pos -= actsize; + + /* align to beginning of next cluster if any */ + if (pos) { + actsize = min(filesize, bytesperclust); + if (get_cluster(mydata, curclust, get_contents_vfatname_block, + (int)actsize) != 0) { + printf("Error reading cluster\n"); + return -1; + } + filesize -= actsize; + actsize -= pos; + memcpy(buffer, get_contents_vfatname_block + pos, actsize); + gotsize += actsize; + if (!filesize) + return gotsize; + buffer += actsize; + + curclust = get_fatent(mydata, curclust); + if (CHECK_CLUST(curclust, mydata->fatsize)) { + debug("curclust: 0x%x\n", curclust); + debug("Invalid FAT entry\n"); + return gotsize; + } + } + + actsize = bytesperclust; endclust = curclust; do { @@ -434,9 +484,6 @@ static int slot2str (dir_slot *slotptr, char *l_name, int *idx) * into 'retdent' * Return 0 on success, -1 otherwise. */ -__u8 get_vfatname_block[MAX_CLUSTSIZE] - __aligned(ARCH_DMA_MINALIGN); - static int get_vfatname (fsdata *mydata, int curclust, __u8 *cluster, dir_entry *retdent, char *l_name) @@ -475,13 +522,13 @@ get_vfatname (fsdata *mydata, int curclust, __u8 *cluster, return -1; } - if (get_cluster(mydata, curclust, get_vfatname_block, + if (get_cluster(mydata, curclust, get_contents_vfatname_block, mydata->clust_size * mydata->sect_size) != 0) { debug("Error: reading directory block\n"); return -1; } - slotptr2 = (dir_slot *)get_vfatname_block; + slotptr2 = (dir_slot *)get_contents_vfatname_block; while (counter > 0) { if (((slotptr2->id & ~LAST_LONG_ENTRY_MASK) & 0xff) != counter) @@ -492,7 +539,7 @@ get_vfatname (fsdata *mydata, int curclust, __u8 *cluster, /* Save the real directory entry */ realdent = (dir_entry *)slotptr2; - while ((__u8 *)slotptr2 > get_vfatname_block) { + while ((__u8 *)slotptr2 > get_contents_vfatname_block) { slotptr2--; slot2str(slotptr2, l_name, &idx); } @@ -771,12 +818,12 @@ exit: return ret; } -__u8 do_fat_read_block[MAX_CLUSTSIZE] +__u8 do_fat_read_at_block[MAX_CLUSTSIZE] __aligned(ARCH_DMA_MINALIGN); long -do_fat_read (const char *filename, void *buffer, unsigned long maxsize, - int dols) +do_fat_read_at (const char *filename, unsigned long pos, void *buffer, + unsigned long maxsize, int dols) { char fnamecopy[2048]; boot_sector bs; @@ -890,12 +937,12 @@ do_fat_read (const char *filename, void *buffer, unsigned long maxsize, (mydata->fatsize == 32) ? (mydata->clust_size) : PREFETCH_BLOCKS, - do_fat_read_block) < 0) { + do_fat_read_at_block) < 0) { debug("Error: reading rootdir block\n"); goto exit; } - dentptr = (dir_entry *) do_fat_read_block; + dentptr = (dir_entry *) do_fat_read_at_block; } for (i = 0; i < DIRENTSPERBLOCK; i++) { @@ -915,7 +962,7 @@ do_fat_read (const char *filename, void *buffer, unsigned long maxsize, get_vfatname(mydata, root_cluster, - do_fat_read_block, + do_fat_read_at_block, dentptr, l_name); if (dols == LS_ROOT) { @@ -1118,7 +1165,7 @@ rootdir_done: subname = nextname; } - ret = get_contents(mydata, dentptr, buffer, maxsize); + ret = get_contents(mydata, dentptr, pos, buffer, maxsize); debug("Size: %d, got: %ld\n", FAT2CPU32(dentptr->size), ret); exit: @@ -1126,6 +1173,13 @@ exit: return ret; } +long +do_fat_read (const char *filename, void *buffer, unsigned long maxsize, + int dols) +{ + return do_fat_read_at(filename, 0, buffer, maxsize, dols); +} + int file_fat_detectfs (void) { boot_sector bs; ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH 7/7] FAT: Make it possible to read from any file position 2012-07-19 22:03 [U-Boot] [PATCH 7/7] FAT: Make it possible to read from any file position Benoît Thébaudeau @ 2012-07-19 22:44 ` Mike Frysinger 2012-07-19 23:17 ` Benoît Thébaudeau 0 siblings, 1 reply; 16+ messages in thread From: Mike Frysinger @ 2012-07-19 22:44 UTC (permalink / raw) To: u-boot On Thursday 19 July 2012 18:03:06 Beno?t Th?baudeau wrote: > --- u-boot-66714b1.orig/fs/fat/fat.c > +++ u-boot-66714b1/fs/fat/fat.c > > +__u8 get_contents_vfatname_block[MAX_CLUSTSIZE] > + __aligned(ARCH_DMA_MINALIGN); is there any reason for this to be exported ? could you mark it static ? > static long > -get_contents (fsdata *mydata, dir_entry *dentptr, __u8 *buffer, > - unsigned long maxsize) > +get_contents (fsdata *mydata, dir_entry *dentptr, unsigned long pos, delete the space before the "(" > long > -do_fat_read (const char *filename, void *buffer, unsigned long maxsize, > - int dols) > +do_fat_read_at (const char *filename, unsigned long pos, void *buffer, delete the space before the "(" > +long > +do_fat_read (const char *filename, void *buffer, unsigned long maxsize, no spaces before that "(" -mike -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 836 bytes Desc: This is a digitally signed message part. URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120719/ced33472/attachment.pgp> ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH 7/7] FAT: Make it possible to read from any file position 2012-07-19 22:44 ` Mike Frysinger @ 2012-07-19 23:17 ` Benoît Thébaudeau 2012-07-20 3:02 ` Mike Frysinger 0 siblings, 1 reply; 16+ messages in thread From: Benoît Thébaudeau @ 2012-07-19 23:17 UTC (permalink / raw) To: u-boot On Friday 20 July 2012 00:44:52 Mike Frysinger wrote: > On Thursday 19 July 2012 18:03:06 Beno?t Th?baudeau wrote: > > --- u-boot-66714b1.orig/fs/fat/fat.c > > +++ u-boot-66714b1/fs/fat/fat.c > > > > +__u8 get_contents_vfatname_block[MAX_CLUSTSIZE] > > + __aligned(ARCH_DMA_MINALIGN); > > is there any reason for this to be exported ? could you mark it > static ? I'll do that. There are probably other variables in fat.c missing static, so I'll do a dedicated patch before this series. That will shift the patch numbers. How should I repost the new version of the series? Should I keep the message ID of each patch even if the numbering changes, or should I post a v2 completely separately from v1? > > static long > > -get_contents (fsdata *mydata, dir_entry *dentptr, __u8 *buffer, > > - unsigned long maxsize) > > +get_contents (fsdata *mydata, dir_entry *dentptr, unsigned long > > pos, > > delete the space before the "(" > > > long > > -do_fat_read (const char *filename, void *buffer, unsigned long > > maxsize, > > - int dols) > > +do_fat_read_at (const char *filename, unsigned long pos, void > > *buffer, > > delete the space before the "(" > > > +long > > +do_fat_read (const char *filename, void *buffer, unsigned long > > maxsize, > > no spaces before that "(" I'll add a cosmetic patch for that in a prequel. Regards, Beno?t ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH 7/7] FAT: Make it possible to read from any file position 2012-07-19 23:17 ` Benoît Thébaudeau @ 2012-07-20 3:02 ` Mike Frysinger 2012-07-20 13:22 ` [U-Boot] [PATCH v2 8/8] " Benoît Thébaudeau 0 siblings, 1 reply; 16+ messages in thread From: Mike Frysinger @ 2012-07-20 3:02 UTC (permalink / raw) To: u-boot On Thursday 19 July 2012 19:17:31 Beno?t Th?baudeau wrote: > On Friday 20 July 2012 00:44:52 Mike Frysinger wrote: > > On Thursday 19 July 2012 18:03:06 Beno?t Th?baudeau wrote: > > > --- u-boot-66714b1.orig/fs/fat/fat.c > > > +++ u-boot-66714b1/fs/fat/fat.c > > > > > > +__u8 get_contents_vfatname_block[MAX_CLUSTSIZE] > > > + __aligned(ARCH_DMA_MINALIGN); > > > > is there any reason for this to be exported ? could you mark it > > static ? > > I'll do that. There are probably other variables in fat.c missing static, > so I'll do a dedicated patch before this series. That will shift the patch > numbers. How should I repost the new version of the series? Should I keep > the message ID of each patch even if the numbering changes, or should I > post a v2 completely separately from v1? it's easier on everyone to do this. you might want to look at tools/patman/ as a way for managing the review process. -mike -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 836 bytes Desc: This is a digitally signed message part. URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120719/d0029746/attachment.pgp> ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH v2 8/8] FAT: Make it possible to read from any file position 2012-07-20 3:02 ` Mike Frysinger @ 2012-07-20 13:22 ` Benoît Thébaudeau 2012-09-02 15:28 ` Wolfgang Denk 2012-09-18 18:14 ` [U-Boot] [PATCH v3] " Benoît Thébaudeau 0 siblings, 2 replies; 16+ messages in thread From: Benoît Thébaudeau @ 2012-07-20 13:22 UTC (permalink / raw) To: u-boot When storage devices contain files larger than the embedded RAM, it is useful to be able to read these files by chunks, e.g. for a software update to the embedded NAND Flash from an external storage device (USB stick, SD card, etc.). Hence, this patch makes it possible by adding a new FAT API to read files from a given position. Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau@advansee.com> Cc: Wolfgang Denk <wd@denx.de> --- Changes for v2: - Patch renumbering because of the new v2 1/8. - Possible code style changes due to the new v2 1/8. - Add missing vairable renaming to fat_write.c. .../fs/fat/fat.c | 88 ++++++++++++++++---- .../fs/fat/fat_write.c | 18 ++-- 2 files changed, 80 insertions(+), 26 deletions(-) diff --git u-boot-66714b1.orig/fs/fat/fat.c u-boot-66714b1/fs/fat/fat.c index 19f6a8c..8c94b28 100644 --- u-boot-66714b1.orig/fs/fat/fat.c +++ u-boot-66714b1/fs/fat/fat.c @@ -328,13 +328,16 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size) } /* - * Read at most 'maxsize' bytes from the file associated with 'dentptr' + * Read at most 'maxsize' bytes from 'pos' in the file associated with 'dentptr' * into 'buffer'. * Return the number of bytes read or -1 on fatal errors. */ +__u8 get_contents_vfatname_block[MAX_CLUSTSIZE] + __aligned(ARCH_DMA_MINALIGN); + static long -get_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer, - unsigned long maxsize) +get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos, + __u8 *buffer, unsigned long maxsize) { unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0; unsigned int bytesperclust = mydata->clust_size * mydata->sect_size; @@ -344,12 +347,59 @@ get_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer, debug("Filesize: %ld bytes\n", filesize); - if (maxsize > 0 && filesize > maxsize) - filesize = maxsize; + if (pos >= filesize) { + debug("Read position past EOF: %lu\n", pos); + return gotsize; + } + + if (maxsize > 0 && filesize > pos + maxsize) + filesize = pos + maxsize; debug("%ld bytes\n", filesize); actsize = bytesperclust; + + /* go to cluster at pos */ + while (actsize <= pos) { + curclust = get_fatent(mydata, curclust); + if (CHECK_CLUST(curclust, mydata->fatsize)) { + debug("curclust: 0x%x\n", curclust); + debug("Invalid FAT entry\n"); + return gotsize; + } + actsize += bytesperclust; + } + + /* actsize > pos */ + actsize -= bytesperclust; + filesize -= actsize; + pos -= actsize; + + /* align to beginning of next cluster if any */ + if (pos) { + actsize = min(filesize, bytesperclust); + if (get_cluster(mydata, curclust, get_contents_vfatname_block, + (int)actsize) != 0) { + printf("Error reading cluster\n"); + return -1; + } + filesize -= actsize; + actsize -= pos; + memcpy(buffer, get_contents_vfatname_block + pos, actsize); + gotsize += actsize; + if (!filesize) + return gotsize; + buffer += actsize; + + curclust = get_fatent(mydata, curclust); + if (CHECK_CLUST(curclust, mydata->fatsize)) { + debug("curclust: 0x%x\n", curclust); + debug("Invalid FAT entry\n"); + return gotsize; + } + } + + actsize = bytesperclust; endclust = curclust; do { @@ -433,9 +483,6 @@ static int slot2str(dir_slot *slotptr, char *l_name, int *idx) * into 'retdent' * Return 0 on success, -1 otherwise. */ -__u8 get_vfatname_block[MAX_CLUSTSIZE] - __aligned(ARCH_DMA_MINALIGN); - static int get_vfatname(fsdata *mydata, int curclust, __u8 *cluster, dir_entry *retdent, char *l_name) @@ -474,13 +521,13 @@ get_vfatname(fsdata *mydata, int curclust, __u8 *cluster, return -1; } - if (get_cluster(mydata, curclust, get_vfatname_block, + if (get_cluster(mydata, curclust, get_contents_vfatname_block, mydata->clust_size * mydata->sect_size) != 0) { debug("Error: reading directory block\n"); return -1; } - slotptr2 = (dir_slot *)get_vfatname_block; + slotptr2 = (dir_slot *)get_contents_vfatname_block; while (counter > 0) { if (((slotptr2->id & ~LAST_LONG_ENTRY_MASK) & 0xff) != counter) @@ -491,7 +538,7 @@ get_vfatname(fsdata *mydata, int curclust, __u8 *cluster, /* Save the real directory entry */ realdent = (dir_entry *)slotptr2; - while ((__u8 *)slotptr2 > get_vfatname_block) { + while ((__u8 *)slotptr2 > get_contents_vfatname_block) { slotptr2--; slot2str(slotptr2, l_name, &idx); } @@ -770,11 +817,12 @@ exit: return ret; } -__u8 do_fat_read_block[MAX_CLUSTSIZE] +__u8 do_fat_read_at_block[MAX_CLUSTSIZE] __aligned(ARCH_DMA_MINALIGN); long -do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols) +do_fat_read_at(const char *filename, unsigned long pos, void *buffer, + unsigned long maxsize, int dols) { char fnamecopy[2048]; boot_sector bs; @@ -888,12 +936,12 @@ do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols) (mydata->fatsize == 32) ? (mydata->clust_size) : PREFETCH_BLOCKS, - do_fat_read_block) < 0) { + do_fat_read_at_block) < 0) { debug("Error: reading rootdir block\n"); goto exit; } - dentptr = (dir_entry *) do_fat_read_block; + dentptr = (dir_entry *) do_fat_read_at_block; } for (i = 0; i < DIRENTSPERBLOCK; i++) { @@ -913,7 +961,7 @@ do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols) get_vfatname(mydata, root_cluster, - do_fat_read_block, + do_fat_read_at_block, dentptr, l_name); if (dols == LS_ROOT) { @@ -1116,7 +1164,7 @@ rootdir_done: subname = nextname; } - ret = get_contents(mydata, dentptr, buffer, maxsize); + ret = get_contents(mydata, dentptr, pos, buffer, maxsize); debug("Size: %d, got: %ld\n", FAT2CPU32(dentptr->size), ret); exit: @@ -1124,6 +1172,12 @@ exit: return ret; } +long +do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols) +{ + return do_fat_read_at(filename, 0, buffer, maxsize, dols); +} + int file_fat_detectfs(void) { boot_sector bs; diff --git u-boot-66714b1.orig/fs/fat/fat_write.c u-boot-66714b1/fs/fat/fat_write.c index a6181e7..5829adf 100644 --- u-boot-66714b1.orig/fs/fat/fat_write.c +++ u-boot-66714b1/fs/fat/fat_write.c @@ -328,7 +328,7 @@ static void flush_dir_table(fsdata *mydata, dir_entry **dentptr); static void fill_dir_slot(fsdata *mydata, dir_entry **dentptr, const char *l_name) { - dir_slot *slotptr = (dir_slot *)get_vfatname_block; + dir_slot *slotptr = (dir_slot *)get_contents_vfatname_block; __u8 counter = 0, checksum; int idx = 0, ret; char s_name[16]; @@ -373,7 +373,7 @@ static __u32 dir_curclust; * a slot) into 'l_name'. If successful also copy the real directory entry * into 'retdent' * If additional adjacent cluster for directory entries is read into memory, - * then 'get_vfatname_block' is copied into 'get_dentfromdir_block' and + * then 'get_contents_vfatname_block' is copied into 'get_dentfromdir_block' and * the location of the real directory entry is returned by 'retdent' * Return 0 on success, -1 otherwise. */ @@ -416,13 +416,13 @@ get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster, dir_curclust = curclust; - if (get_cluster(mydata, curclust, get_vfatname_block, + if (get_cluster(mydata, curclust, get_contents_vfatname_block, mydata->clust_size * mydata->sect_size) != 0) { debug("Error: reading directory block\n"); return -1; } - slotptr2 = (dir_slot *)get_vfatname_block; + slotptr2 = (dir_slot *)get_contents_vfatname_block; while (counter > 0) { if (((slotptr2->id & ~LAST_LONG_ENTRY_MASK) & 0xff) != counter) @@ -433,7 +433,7 @@ get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster, /* Save the real directory entry */ realdent = (dir_entry *)slotptr2; - while ((__u8 *)slotptr2 > get_vfatname_block) { + while ((__u8 *)slotptr2 > get_contents_vfatname_block) { slotptr2--; slot2str(slotptr2, l_name, &idx); } @@ -459,9 +459,9 @@ get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster, *retdent = realdent; if (slotptr2) { - memcpy(get_dentfromdir_block, get_vfatname_block, + memcpy(get_dentfromdir_block, get_contents_vfatname_block, mydata->clust_size * mydata->sect_size); - cur_position = (__u8 *)realdent - get_vfatname_block; + cur_position = (__u8 *)realdent - get_contents_vfatname_block; *retdent = (dir_entry *) &get_dentfromdir_block[cur_position]; } @@ -980,11 +980,11 @@ static int do_fat_write(const char *filename, void *buffer, if (disk_read(cursect, (mydata->fatsize == 32) ? (mydata->clust_size) : - PREFETCH_BLOCKS, do_fat_read_block) < 0) { + PREFETCH_BLOCKS, do_fat_read_at_block) < 0) { debug("Error: reading rootdir block\n"); goto exit; } - dentptr = (dir_entry *) do_fat_read_block; + dentptr = (dir_entry *) do_fat_read_at_block; name_len = strlen(filename); if (name_len >= VFAT_MAXLEN_BYTES) ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH v2 8/8] FAT: Make it possible to read from any file position 2012-07-20 13:22 ` [U-Boot] [PATCH v2 8/8] " Benoît Thébaudeau @ 2012-09-02 15:28 ` Wolfgang Denk 2012-09-03 14:17 ` Benoît Thébaudeau 2012-09-18 18:14 ` [U-Boot] [PATCH v3] " Benoît Thébaudeau 1 sibling, 1 reply; 16+ messages in thread From: Wolfgang Denk @ 2012-09-02 15:28 UTC (permalink / raw) To: u-boot Dear Beno?t Th?baudeau, In message <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you wrote: > When storage devices contain files larger than the embedded RAM, it is usef> ul to > be able to read these files by chunks, e.g. for a software update to the > embedded NAND Flash from an external storage device (USB stick, SD card, et> c.). > > Hence, this patch makes it possible by adding a new FAT API to read files f> rom a > given position. > > Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau@advansee.com> > Cc: Wolfgang Denk <wd@denx.de> > --- > Changes for v2: > - Patch renumbering because of the new v2 1/8. > - Possible code style changes due to the new v2 1/8. > - Add missing vairable renaming to fat_write.c. > > .../fs/fat/fat.c | 88 ++++++++++++++++> ---- > .../fs/fat/fat_write.c | 18 ++-- > 2 files changed, 80 insertions(+), 26 deletions(-) I don't see any command line interface to actually use this code. How would I put this to use? Skipped for now. Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de "Obviously, a major malfunction has occurred." -- Steve Nesbitt, voice of Mission Control, January 28, 1986, as the shuttle Challenger exploded within view of the grandstands. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH v2 8/8] FAT: Make it possible to read from any file position 2012-09-02 15:28 ` Wolfgang Denk @ 2012-09-03 14:17 ` Benoît Thébaudeau 2012-09-14 20:49 ` Tom Rini 0 siblings, 1 reply; 16+ messages in thread From: Benoît Thébaudeau @ 2012-09-03 14:17 UTC (permalink / raw) To: u-boot Dear Wolfgang Denk, On Sunday, September 2, 2012 5:28:09 PM, Wolfgang Denk wrote: > Dear Beno?t Th?baudeau, > > In message > <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you > wrote: > > When storage devices contain files larger than the embedded RAM, it > > is usef> ul to > > be able to read these files by chunks, e.g. for a software update > > to the > > embedded NAND Flash from an external storage device (USB stick, SD > > card, et> c.). > > > > Hence, this patch makes it possible by adding a new FAT API to read > > files f> rom a > > given position. > > > > Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau@advansee.com> > > Cc: Wolfgang Denk <wd@denx.de> > > --- > > Changes for v2: > > - Patch renumbering because of the new v2 1/8. > > - Possible code style changes due to the new v2 1/8. > > - Add missing vairable renaming to fat_write.c. > > > > .../fs/fat/fat.c | 88 > > ++++++++++++++++> ---- > > .../fs/fat/fat_write.c | 18 ++-- > > 2 files changed, 80 insertions(+), 26 deletions(-) > > I don't see any command line interface to actually use this code. > > How would I put this to use? Here is the current "fatload" command line interface: fatload <interface> <dev[:part]> <addr> <filename> [bytes] Do you prefer to change it to: fatload <interface> <dev[:part]> <addr> <filename> [offset] [bytes] or to have a new dedicated command, or something else? Best regards, Beno?t ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH v2 8/8] FAT: Make it possible to read from any file position 2012-09-03 14:17 ` Benoît Thébaudeau @ 2012-09-14 20:49 ` Tom Rini 2012-09-14 22:03 ` Benoît Thébaudeau 0 siblings, 1 reply; 16+ messages in thread From: Tom Rini @ 2012-09-14 20:49 UTC (permalink / raw) To: u-boot On Mon, Sep 03, 2012 at 04:17:09PM +0200, Beno??t Th??baudeau wrote: > Dear Wolfgang Denk, > > On Sunday, September 2, 2012 5:28:09 PM, Wolfgang Denk wrote: > > Dear Beno??t Th??baudeau, > > > > In message > > <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you > > wrote: > > > When storage devices contain files larger than the embedded RAM, it > > > is usef> ul to > > > be able to read these files by chunks, e.g. for a software update > > > to the > > > embedded NAND Flash from an external storage device (USB stick, SD > > > card, et> c.). > > > > > > Hence, this patch makes it possible by adding a new FAT API to read > > > files f> rom a > > > given position. > > > > > > Signed-off-by: Beno??t Th??baudeau <benoit.thebaudeau@advansee.com> > > > Cc: Wolfgang Denk <wd@denx.de> > > > --- > > > Changes for v2: > > > - Patch renumbering because of the new v2 1/8. > > > - Possible code style changes due to the new v2 1/8. > > > - Add missing vairable renaming to fat_write.c. > > > > > > .../fs/fat/fat.c | 88 > > > ++++++++++++++++> ---- > > > .../fs/fat/fat_write.c | 18 ++-- > > > 2 files changed, 80 insertions(+), 26 deletions(-) > > > > I don't see any command line interface to actually use this code. > > > > How would I put this to use? > > Here is the current "fatload" command line interface: > fatload <interface> <dev[:part]> <addr> <filename> [bytes] > > Do you prefer to change it to: > fatload <interface> <dev[:part]> <addr> <filename> [offset] [bytes] > > or to have a new dedicated command, or something else? Lets go with: fatload <interface> <dev[:part]> <addr> <filename> [bytes] [offset] and update the long help text to mention both bytes and offset and that offset requires bytes. -- Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120914/a2619e25/attachment.pgp> ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH v2 8/8] FAT: Make it possible to read from any file position 2012-09-14 20:49 ` Tom Rini @ 2012-09-14 22:03 ` Benoît Thébaudeau 2012-09-14 22:02 ` Tom Rini 0 siblings, 1 reply; 16+ messages in thread From: Benoît Thébaudeau @ 2012-09-14 22:03 UTC (permalink / raw) To: u-boot On Friday, September 14, 2012 10:49:04 PM, Tom Rini wrote: > On Mon, Sep 03, 2012 at 04:17:09PM +0200, Beno??t Th??baudeau wrote: > > Dear Wolfgang Denk, > > > > On Sunday, September 2, 2012 5:28:09 PM, Wolfgang Denk wrote: > > > Dear Beno??t Th??baudeau, > > > > > > In message > > > <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you > > > wrote: > > > > When storage devices contain files larger than the embedded > > > > RAM, it > > > > is usef> ul to > > > > be able to read these files by chunks, e.g. for a software > > > > update > > > > to the > > > > embedded NAND Flash from an external storage device (USB stick, > > > > SD > > > > card, et> c.). > > > > > > > > Hence, this patch makes it possible by adding a new FAT API to > > > > read > > > > files f> rom a > > > > given position. > > > > > > > > Signed-off-by: Beno??t Th??baudeau > > > > <benoit.thebaudeau@advansee.com> > > > > Cc: Wolfgang Denk <wd@denx.de> > > > > --- > > > > Changes for v2: > > > > - Patch renumbering because of the new v2 1/8. > > > > - Possible code style changes due to the new v2 1/8. > > > > - Add missing vairable renaming to fat_write.c. > > > > > > > > .../fs/fat/fat.c | 88 > > > > ++++++++++++++++> ---- > > > > .../fs/fat/fat_write.c | 18 ++-- > > > > 2 files changed, 80 insertions(+), 26 deletions(-) > > > > > > I don't see any command line interface to actually use this code. > > > > > > How would I put this to use? > > > > Here is the current "fatload" command line interface: > > fatload <interface> <dev[:part]> <addr> <filename> [bytes] > > > > Do you prefer to change it to: > > fatload <interface> <dev[:part]> <addr> <filename> [offset] > > [bytes] > > > > or to have a new dedicated command, or something else? > > Lets go with: > fatload <interface> <dev[:part]> <addr> <filename> [bytes] [offset] > and > update the long help text to mention both bytes and offset and that > offset requires bytes. OK. Do you want that in an update of this patch or in a separate patch? You're right: Having [bytes] before [offset] will avoid breaking the current users of this command. However, this has one drawback: fatls first has to be used to get the file size (with [offset] first, 0 could be easily used for offset to access [bytes]). Hence, still with [bytes] first, would you like to have some special bytes value (let's say -1 or any negative value) meaning "from offset to end of file"? Best regards, Beno?t ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH v2 8/8] FAT: Make it possible to read from any file position 2012-09-14 22:03 ` Benoît Thébaudeau @ 2012-09-14 22:02 ` Tom Rini 2012-09-22 20:32 ` Benoît Thébaudeau 0 siblings, 1 reply; 16+ messages in thread From: Tom Rini @ 2012-09-14 22:02 UTC (permalink / raw) To: u-boot On 09/14/2012 03:03 PM, Beno?t Th?baudeau wrote: > On Friday, September 14, 2012 10:49:04 PM, Tom Rini wrote: >> On Mon, Sep 03, 2012 at 04:17:09PM +0200, Beno??t Th??baudeau wrote: >>> Dear Wolfgang Denk, >>> >>> On Sunday, September 2, 2012 5:28:09 PM, Wolfgang Denk wrote: >>>> Dear Beno??t Th??baudeau, >>>> >>>> In message >>>> <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you >>>> wrote: >>>>> When storage devices contain files larger than the embedded >>>>> RAM, it >>>>> is usef> ul to >>>>> be able to read these files by chunks, e.g. for a software >>>>> update >>>>> to the >>>>> embedded NAND Flash from an external storage device (USB stick, >>>>> SD >>>>> card, et> c.). >>>>> >>>>> Hence, this patch makes it possible by adding a new FAT API to >>>>> read >>>>> files f> rom a >>>>> given position. >>>>> >>>>> Signed-off-by: Beno??t Th??baudeau >>>>> <benoit.thebaudeau@advansee.com> >>>>> Cc: Wolfgang Denk <wd@denx.de> >>>>> --- >>>>> Changes for v2: >>>>> - Patch renumbering because of the new v2 1/8. >>>>> - Possible code style changes due to the new v2 1/8. >>>>> - Add missing vairable renaming to fat_write.c. >>>>> >>>>> .../fs/fat/fat.c | 88 >>>>> ++++++++++++++++> ---- >>>>> .../fs/fat/fat_write.c | 18 ++-- >>>>> 2 files changed, 80 insertions(+), 26 deletions(-) >>>> >>>> I don't see any command line interface to actually use this code. >>>> >>>> How would I put this to use? >>> >>> Here is the current "fatload" command line interface: >>> fatload <interface> <dev[:part]> <addr> <filename> [bytes] >>> >>> Do you prefer to change it to: >>> fatload <interface> <dev[:part]> <addr> <filename> [offset] >>> [bytes] >>> >>> or to have a new dedicated command, or something else? >> >> Lets go with: >> fatload <interface> <dev[:part]> <addr> <filename> [bytes] [offset] >> and >> update the long help text to mention both bytes and offset and that >> offset requires bytes. > > OK. Do you want that in an update of this patch or in a separate patch? New patch to replace this. > You're right: Having [bytes] before [offset] will avoid breaking the current > users of this command. However, this has one drawback: fatls first has to be > used to get the file size (with [offset] first, 0 could be easily used for > offset to access [bytes]). Hence, still with [bytes] first, would you like to > have some special bytes value (let's say -1 or any negative value) meaning "from > offset to end of file"? Lets go with -1 meaning until end of file since we don't have a good way today to determine total filesize. -- Tom ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH v2 8/8] FAT: Make it possible to read from any file position 2012-09-14 22:02 ` Tom Rini @ 2012-09-22 20:32 ` Benoît Thébaudeau 0 siblings, 0 replies; 16+ messages in thread From: Benoît Thébaudeau @ 2012-09-22 20:32 UTC (permalink / raw) To: u-boot On Saturday, September 15, 2012 12:02:53 AM, Tom Rini wrote: > On 09/14/2012 03:03 PM, Beno?t Th?baudeau wrote: > > On Friday, September 14, 2012 10:49:04 PM, Tom Rini wrote: > >> On Mon, Sep 03, 2012 at 04:17:09PM +0200, Beno??t Th??baudeau > >> wrote: > >>> Dear Wolfgang Denk, > >>> > >>> On Sunday, September 2, 2012 5:28:09 PM, Wolfgang Denk wrote: > >>>> Dear Beno??t Th??baudeau, > >>>> > >>>> In message > >>>> <1285759492.332736.1342790529256.JavaMail.root@advansee.com> you > >>>> wrote: > >>>>> When storage devices contain files larger than the embedded > >>>>> RAM, it > >>>>> is usef> ul to > >>>>> be able to read these files by chunks, e.g. for a software > >>>>> update > >>>>> to the > >>>>> embedded NAND Flash from an external storage device (USB stick, > >>>>> SD > >>>>> card, et> c.). > >>>>> > >>>>> Hence, this patch makes it possible by adding a new FAT API to > >>>>> read > >>>>> files f> rom a > >>>>> given position. > >>>>> > >>>>> Signed-off-by: Beno??t Th??baudeau > >>>>> <benoit.thebaudeau@advansee.com> > >>>>> Cc: Wolfgang Denk <wd@denx.de> > >>>>> --- > >>>>> Changes for v2: > >>>>> - Patch renumbering because of the new v2 1/8. > >>>>> - Possible code style changes due to the new v2 1/8. > >>>>> - Add missing vairable renaming to fat_write.c. > >>>>> > >>>>> .../fs/fat/fat.c | 88 > >>>>> ++++++++++++++++> ---- > >>>>> .../fs/fat/fat_write.c | 18 ++-- > >>>>> 2 files changed, 80 insertions(+), 26 deletions(-) > >>>> > >>>> I don't see any command line interface to actually use this > >>>> code. > >>>> > >>>> How would I put this to use? > >>> > >>> Here is the current "fatload" command line interface: > >>> fatload <interface> <dev[:part]> <addr> <filename> [bytes] > >>> > >>> Do you prefer to change it to: > >>> fatload <interface> <dev[:part]> <addr> <filename> [offset] > >>> [bytes] > >>> > >>> or to have a new dedicated command, or something else? > >> > >> Lets go with: > >> fatload <interface> <dev[:part]> <addr> <filename> [bytes] > >> [offset] > >> and > >> update the long help text to mention both bytes and offset and > >> that > >> offset requires bytes. > > > > OK. Do you want that in an update of this patch or in a separate > > patch? > > New patch to replace this. > > > You're right: Having [bytes] before [offset] will avoid breaking > > the current > > users of this command. However, this has one drawback: fatls first > > has to be > > used to get the file size (with [offset] first, 0 could be easily > > used for > > offset to access [bytes]). Hence, still with [bytes] first, would > > you like to > > have some special bytes value (let's say -1 or any negative value) > > meaning "from > > offset to end of file"? > > Lets go with -1 meaning until end of file since we don't have a good > way > today to determine total filesize. OK. I took 0 instead of -1 because 0 already had this behavior. Done here: http://patchwork.ozlabs.org/patch/184793/ Best regards, Beno?t ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [PATCH v3] FAT: Make it possible to read from any file position 2012-07-20 13:22 ` [U-Boot] [PATCH v2 8/8] " Benoît Thébaudeau 2012-09-02 15:28 ` Wolfgang Denk @ 2012-09-18 18:14 ` Benoît Thébaudeau 2012-09-27 16:20 ` [U-Boot] [U-Boot, " Tom Rini 1 sibling, 1 reply; 16+ messages in thread From: Benoît Thébaudeau @ 2012-09-18 18:14 UTC (permalink / raw) To: u-boot When storage devices contain files larger than the embedded RAM, it is useful to be able to read these files by chunks, e.g. for a software update to the embedded NAND Flash from an external storage device (USB stick, SD card, etc.). Hence, this patch makes it possible by adding a new FAT API to read files from a given position. This patch also adds this feature to the fatload command. Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau@advansee.com> Cc: Tom Rini <trini@ti.com> Cc: Wolfgang Denk <wd@denx.de> --- Changes for v2: - Add missing variable renaming to fat_write.c. Changes for v3: - Make this new feature available through the fatload command. .../common/cmd_fat.c | 25 +++-- .../fs/fat/fat.c | 98 ++++++++++++++++---- .../fs/fat/fat_write.c | 18 ++-- .../include/fat.h | 2 + 4 files changed, 105 insertions(+), 38 deletions(-) diff --git u-boot-037e9d3.orig/common/cmd_fat.c u-boot-037e9d3/common/cmd_fat.c index 559a16d..2e34c54 100644 --- u-boot-037e9d3.orig/common/cmd_fat.c +++ u-boot-037e9d3/common/cmd_fat.c @@ -37,7 +37,8 @@ int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { long size; unsigned long offset; - unsigned long count; + unsigned long count = 0; + unsigned long pos = 0; char buf [12]; block_dev_desc_t *dev_desc=NULL; int dev=0; @@ -46,7 +47,7 @@ int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (argc < 5) { printf( "usage: fatload <interface> <dev[:part]> " - "<addr> <filename> [bytes]\n"); + "<addr> <filename> [bytes [pos]]\n"); return 1; } @@ -69,11 +70,11 @@ int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 1; } offset = simple_strtoul(argv[3], NULL, 16); - if (argc == 6) + if (argc >= 6) count = simple_strtoul(argv[5], NULL, 16); - else - count = 0; - size = file_fat_read(argv[4], (unsigned char *)offset, count); + if (argc >= 7) + pos = simple_strtoul(argv[6], NULL, 16); + size = file_fat_read_at(argv[4], pos, (unsigned char *)offset, count); if(size==-1) { printf("\n** Unable to read \"%s\" from %s %d:%d **\n", @@ -91,11 +92,15 @@ int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) U_BOOT_CMD( - fatload, 6, 0, do_fat_fsload, + fatload, 7, 0, do_fat_fsload, "load binary file from a dos filesystem", - "<interface> <dev[:part]> <addr> <filename> [bytes]\n" - " - load binary file 'filename' from 'dev' on 'interface'\n" - " to address 'addr' from dos filesystem" + "<interface> <dev[:part]> <addr> <filename> [bytes [pos]]\n" + " - Load binary file 'filename' from 'dev' on 'interface'\n" + " to address 'addr' from dos filesystem.\n" + " 'pos' gives the file position to start loading from.\n" + " If 'pos' is omitted, 0 is used. 'pos' requires 'bytes'.\n" + " 'bytes' gives the size to load. If 'bytes' is 0 or omitted,\n" + " the load stops on end of file." ); int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) diff --git u-boot-037e9d3.orig/fs/fat/fat.c u-boot-037e9d3/fs/fat/fat.c index f7bb1da..c8beb30 100644 --- u-boot-037e9d3.orig/fs/fat/fat.c +++ u-boot-037e9d3/fs/fat/fat.c @@ -328,13 +328,16 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size) } /* - * Read at most 'maxsize' bytes from the file associated with 'dentptr' + * Read at most 'maxsize' bytes from 'pos' in the file associated with 'dentptr' * into 'buffer'. * Return the number of bytes read or -1 on fatal errors. */ +__u8 get_contents_vfatname_block[MAX_CLUSTSIZE] + __aligned(ARCH_DMA_MINALIGN); + static long -get_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer, - unsigned long maxsize) +get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos, + __u8 *buffer, unsigned long maxsize) { unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0; unsigned int bytesperclust = mydata->clust_size * mydata->sect_size; @@ -344,12 +347,59 @@ get_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer, debug("Filesize: %ld bytes\n", filesize); - if (maxsize > 0 && filesize > maxsize) - filesize = maxsize; + if (pos >= filesize) { + debug("Read position past EOF: %lu\n", pos); + return gotsize; + } + + if (maxsize > 0 && filesize > pos + maxsize) + filesize = pos + maxsize; debug("%ld bytes\n", filesize); actsize = bytesperclust; + + /* go to cluster at pos */ + while (actsize <= pos) { + curclust = get_fatent(mydata, curclust); + if (CHECK_CLUST(curclust, mydata->fatsize)) { + debug("curclust: 0x%x\n", curclust); + debug("Invalid FAT entry\n"); + return gotsize; + } + actsize += bytesperclust; + } + + /* actsize > pos */ + actsize -= bytesperclust; + filesize -= actsize; + pos -= actsize; + + /* align to beginning of next cluster if any */ + if (pos) { + actsize = min(filesize, bytesperclust); + if (get_cluster(mydata, curclust, get_contents_vfatname_block, + (int)actsize) != 0) { + printf("Error reading cluster\n"); + return -1; + } + filesize -= actsize; + actsize -= pos; + memcpy(buffer, get_contents_vfatname_block + pos, actsize); + gotsize += actsize; + if (!filesize) + return gotsize; + buffer += actsize; + + curclust = get_fatent(mydata, curclust); + if (CHECK_CLUST(curclust, mydata->fatsize)) { + debug("curclust: 0x%x\n", curclust); + debug("Invalid FAT entry\n"); + return gotsize; + } + } + + actsize = bytesperclust; endclust = curclust; do { @@ -433,9 +483,6 @@ static int slot2str(dir_slot *slotptr, char *l_name, int *idx) * into 'retdent' * Return 0 on success, -1 otherwise. */ -__u8 get_vfatname_block[MAX_CLUSTSIZE] - __aligned(ARCH_DMA_MINALIGN); - static int get_vfatname(fsdata *mydata, int curclust, __u8 *cluster, dir_entry *retdent, char *l_name) @@ -474,13 +521,13 @@ get_vfatname(fsdata *mydata, int curclust, __u8 *cluster, return -1; } - if (get_cluster(mydata, curclust, get_vfatname_block, + if (get_cluster(mydata, curclust, get_contents_vfatname_block, mydata->clust_size * mydata->sect_size) != 0) { debug("Error: reading directory block\n"); return -1; } - slotptr2 = (dir_slot *)get_vfatname_block; + slotptr2 = (dir_slot *)get_contents_vfatname_block; while (counter > 0) { if (((slotptr2->id & ~LAST_LONG_ENTRY_MASK) & 0xff) != counter) @@ -491,7 +538,7 @@ get_vfatname(fsdata *mydata, int curclust, __u8 *cluster, /* Save the real directory entry */ realdent = (dir_entry *)slotptr2; - while ((__u8 *)slotptr2 > get_vfatname_block) { + while ((__u8 *)slotptr2 > get_contents_vfatname_block) { slotptr2--; slot2str(slotptr2, l_name, &idx); } @@ -770,11 +817,12 @@ exit: return ret; } -__u8 do_fat_read_block[MAX_CLUSTSIZE] +__u8 do_fat_read_at_block[MAX_CLUSTSIZE] __aligned(ARCH_DMA_MINALIGN); long -do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols) +do_fat_read_at(const char *filename, unsigned long pos, void *buffer, + unsigned long maxsize, int dols) { char fnamecopy[2048]; boot_sector bs; @@ -888,12 +936,12 @@ do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols) (mydata->fatsize == 32) ? (mydata->clust_size) : PREFETCH_BLOCKS, - do_fat_read_block) < 0) { + do_fat_read_at_block) < 0) { debug("Error: reading rootdir block\n"); goto exit; } - dentptr = (dir_entry *) do_fat_read_block; + dentptr = (dir_entry *) do_fat_read_at_block; } for (i = 0; i < DIRENTSPERBLOCK; i++) { @@ -913,7 +961,7 @@ do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols) get_vfatname(mydata, root_cluster, - do_fat_read_block, + do_fat_read_at_block, dentptr, l_name); if (dols == LS_ROOT) { @@ -1116,7 +1164,7 @@ rootdir_done: } } - ret = get_contents(mydata, dentptr, buffer, maxsize); + ret = get_contents(mydata, dentptr, pos, buffer, maxsize); debug("Size: %d, got: %ld\n", FAT2CPU32(dentptr->size), ret); exit: @@ -1124,6 +1172,12 @@ exit: return ret; } +long +do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols) +{ + return do_fat_read_at(filename, 0, buffer, maxsize, dols); +} + int file_fat_detectfs(void) { boot_sector bs; @@ -1192,8 +1246,14 @@ int file_fat_ls(const char *dir) return do_fat_read(dir, NULL, 0, LS_YES); } -long file_fat_read(const char *filename, void *buffer, unsigned long maxsize) +long file_fat_read_at(const char *filename, unsigned long pos, void *buffer, + unsigned long maxsize) { printf("reading %s\n", filename); - return do_fat_read(filename, buffer, maxsize, LS_NO); + return do_fat_read_at(filename, pos, buffer, maxsize, LS_NO); +} + +long file_fat_read(const char *filename, void *buffer, unsigned long maxsize) +{ + return file_fat_read_at(filename, 0, buffer, maxsize); } diff --git u-boot-037e9d3.orig/fs/fat/fat_write.c u-boot-037e9d3/fs/fat/fat_write.c index a6181e7..5829adf 100644 --- u-boot-037e9d3.orig/fs/fat/fat_write.c +++ u-boot-037e9d3/fs/fat/fat_write.c @@ -328,7 +328,7 @@ static void flush_dir_table(fsdata *mydata, dir_entry **dentptr); static void fill_dir_slot(fsdata *mydata, dir_entry **dentptr, const char *l_name) { - dir_slot *slotptr = (dir_slot *)get_vfatname_block; + dir_slot *slotptr = (dir_slot *)get_contents_vfatname_block; __u8 counter = 0, checksum; int idx = 0, ret; char s_name[16]; @@ -373,7 +373,7 @@ static __u32 dir_curclust; * a slot) into 'l_name'. If successful also copy the real directory entry * into 'retdent' * If additional adjacent cluster for directory entries is read into memory, - * then 'get_vfatname_block' is copied into 'get_dentfromdir_block' and + * then 'get_contents_vfatname_block' is copied into 'get_dentfromdir_block' and * the location of the real directory entry is returned by 'retdent' * Return 0 on success, -1 otherwise. */ @@ -416,13 +416,13 @@ get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster, dir_curclust = curclust; - if (get_cluster(mydata, curclust, get_vfatname_block, + if (get_cluster(mydata, curclust, get_contents_vfatname_block, mydata->clust_size * mydata->sect_size) != 0) { debug("Error: reading directory block\n"); return -1; } - slotptr2 = (dir_slot *)get_vfatname_block; + slotptr2 = (dir_slot *)get_contents_vfatname_block; while (counter > 0) { if (((slotptr2->id & ~LAST_LONG_ENTRY_MASK) & 0xff) != counter) @@ -433,7 +433,7 @@ get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster, /* Save the real directory entry */ realdent = (dir_entry *)slotptr2; - while ((__u8 *)slotptr2 > get_vfatname_block) { + while ((__u8 *)slotptr2 > get_contents_vfatname_block) { slotptr2--; slot2str(slotptr2, l_name, &idx); } @@ -459,9 +459,9 @@ get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster, *retdent = realdent; if (slotptr2) { - memcpy(get_dentfromdir_block, get_vfatname_block, + memcpy(get_dentfromdir_block, get_contents_vfatname_block, mydata->clust_size * mydata->sect_size); - cur_position = (__u8 *)realdent - get_vfatname_block; + cur_position = (__u8 *)realdent - get_contents_vfatname_block; *retdent = (dir_entry *) &get_dentfromdir_block[cur_position]; } @@ -980,11 +980,11 @@ static int do_fat_write(const char *filename, void *buffer, if (disk_read(cursect, (mydata->fatsize == 32) ? (mydata->clust_size) : - PREFETCH_BLOCKS, do_fat_read_block) < 0) { + PREFETCH_BLOCKS, do_fat_read_at_block) < 0) { debug("Error: reading rootdir block\n"); goto exit; } - dentptr = (dir_entry *) do_fat_read_block; + dentptr = (dir_entry *) do_fat_read_at_block; name_len = strlen(filename); if (name_len >= VFAT_MAXLEN_BYTES) diff --git u-boot-037e9d3.orig/include/fat.h u-boot-037e9d3/include/fat.h index f1b4a0d..cc85b06 100644 --- u-boot-037e9d3.orig/include/fat.h +++ u-boot-037e9d3/include/fat.h @@ -208,6 +208,8 @@ file_read_func file_fat_read; int file_cd(const char *path); int file_fat_detectfs(void); int file_fat_ls(const char *dir); +long file_fat_read_at(const char *filename, unsigned long pos, void *buffer, + unsigned long maxsize); long file_fat_read(const char *filename, void *buffer, unsigned long maxsize); const char *file_getfsname(int idx); int fat_register_device(block_dev_desc_t *dev_desc, int part_no); ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [U-Boot] [U-Boot, v3] FAT: Make it possible to read from any file position 2012-09-18 18:14 ` [U-Boot] [PATCH v3] " Benoît Thébaudeau @ 2012-09-27 16:20 ` Tom Rini 2012-09-28 11:32 ` Benoît Thébaudeau 0 siblings, 1 reply; 16+ messages in thread From: Tom Rini @ 2012-09-27 16:20 UTC (permalink / raw) To: u-boot On Tue, Sep 18, 2012 at 08:14:56AM -0000, Beno?t Th?baudeau wrote: > When storage devices contain files larger than the embedded RAM, it is useful to > be able to read these files by chunks, e.g. for a software update to the > embedded NAND Flash from an external storage device (USB stick, SD card, etc.). > > Hence, this patch makes it possible by adding a new FAT API to read files from a > given position. This patch also adds this feature to the fatload command. > > Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau@advansee.com> > Cc: Tom Rini <trini@ti.com> > Cc: Wolfgang Denk <wd@denx.de> With a reformatting of the commit message and making the changes re-apply to master, I've applied this to u-boot/master, thanks! -- Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120927/88f22428/attachment.pgp> ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [U-Boot, v3] FAT: Make it possible to read from any file position 2012-09-27 16:20 ` [U-Boot] [U-Boot, " Tom Rini @ 2012-09-28 11:32 ` Benoît Thébaudeau 2012-09-28 15:34 ` Stephen Warren 0 siblings, 1 reply; 16+ messages in thread From: Benoît Thébaudeau @ 2012-09-28 11:32 UTC (permalink / raw) To: u-boot Hi Tom, On Thursday, September 27, 2012 6:20:55 PM, Tom Rini wrote: > On Tue, Sep 18, 2012 at 08:14:56AM -0000, Beno?t Th?baudeau wrote: > > > When storage devices contain files larger than the embedded RAM, it > > is useful to > > be able to read these files by chunks, e.g. for a software update > > to the > > embedded NAND Flash from an external storage device (USB stick, SD > > card, etc.). > > > > Hence, this patch makes it possible by adding a new FAT API to read > > files from a > > given position. This patch also adds this feature to the fatload > > command. > > > > Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau@advansee.com> > > Cc: Tom Rini <trini@ti.com> > > Cc: Wolfgang Denk <wd@denx.de> > > With a reformatting of the commit message and making the changes > re-apply to master, I've applied this to u-boot/master, thanks! Perfect. I have a concern regarding the two patches that came in between: [1] http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commitdiff;h=cfda5aeab89d73779e26f0d34cf10f64caa67431 [2] http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commitdiff;h=10a37fd7a40826c43a63591855346adf1a1ac02d Perhaps I'm wrong, and I admit I have not tested them, but looking at the code, it seems to me that [2] breaks the "-" in the following feature of [1]: "With the common function "dev:part" can come from the environment and a '-' can be used in that case." Hence, tests like "if (argc < 5)" in do_fat_fsload() get broken. Also, the command usage message marks dev:part as optional, but it does not say that this should actually be replaced by "-" if skipped. Best regards, Beno?t ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [U-Boot, v3] FAT: Make it possible to read from any file position 2012-09-28 11:32 ` Benoît Thébaudeau @ 2012-09-28 15:34 ` Stephen Warren 2012-09-28 16:17 ` Tom Rini 0 siblings, 1 reply; 16+ messages in thread From: Stephen Warren @ 2012-09-28 15:34 UTC (permalink / raw) To: u-boot On 09/28/2012 05:32 AM, Beno?t Th?baudeau wrote: > Hi Tom, > > On Thursday, September 27, 2012 6:20:55 PM, Tom Rini wrote: >> On Tue, Sep 18, 2012 at 08:14:56AM -0000, Beno?t Th?baudeau wrote: >> >>> When storage devices contain files larger than the embedded RAM, it >>> is useful to >>> be able to read these files by chunks, e.g. for a software update >>> to the >>> embedded NAND Flash from an external storage device (USB stick, SD >>> card, etc.). >>> >>> Hence, this patch makes it possible by adding a new FAT API to read >>> files from a >>> given position. This patch also adds this feature to the fatload >>> command. >>> >>> Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau@advansee.com> >>> Cc: Tom Rini <trini@ti.com> >>> Cc: Wolfgang Denk <wd@denx.de> >> >> With a reformatting of the commit message and making the changes >> re-apply to master, I've applied this to u-boot/master, thanks! > > Perfect. > > I have a concern regarding the two patches that came in between: > [1] http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commitdiff;h=cfda5aeab89d73779e26f0d34cf10f64caa67431 > [2] http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commitdiff;h=10a37fd7a40826c43a63591855346adf1a1ac02d > > Perhaps I'm wrong, and I admit I have not tested them, but looking at the code, > it seems to me that [2] breaks the "-" in the following feature of [1]: > "With the common function "dev:part" can come from the environment and a '-' can > be used in that case." I've sent a patch to fix this. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [U-Boot] [U-Boot, v3] FAT: Make it possible to read from any file position 2012-09-28 15:34 ` Stephen Warren @ 2012-09-28 16:17 ` Tom Rini 0 siblings, 0 replies; 16+ messages in thread From: Tom Rini @ 2012-09-28 16:17 UTC (permalink / raw) To: u-boot On Fri, Sep 28, 2012 at 09:34:42AM -0600, Stephen Warren wrote: > On 09/28/2012 05:32 AM, Beno??t Th??baudeau wrote: > > Hi Tom, > > > > On Thursday, September 27, 2012 6:20:55 PM, Tom Rini wrote: > >> On Tue, Sep 18, 2012 at 08:14:56AM -0000, Beno?t Th?baudeau wrote: > >> > >>> When storage devices contain files larger than the embedded RAM, it > >>> is useful to > >>> be able to read these files by chunks, e.g. for a software update > >>> to the > >>> embedded NAND Flash from an external storage device (USB stick, SD > >>> card, etc.). > >>> > >>> Hence, this patch makes it possible by adding a new FAT API to read > >>> files from a > >>> given position. This patch also adds this feature to the fatload > >>> command. > >>> > >>> Signed-off-by: Beno?t Th?baudeau <benoit.thebaudeau@advansee.com> > >>> Cc: Tom Rini <trini@ti.com> > >>> Cc: Wolfgang Denk <wd@denx.de> > >> > >> With a reformatting of the commit message and making the changes > >> re-apply to master, I've applied this to u-boot/master, thanks! > > > > Perfect. > > > > I have a concern regarding the two patches that came in between: > > [1] http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commitdiff;h=cfda5aeab89d73779e26f0d34cf10f64caa67431 > > [2] http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=commitdiff;h=10a37fd7a40826c43a63591855346adf1a1ac02d > > > > Perhaps I'm wrong, and I admit I have not tested them, but looking at the code, > > it seems to me that [2] breaks the "-" in the following feature of [1]: > > "With the common function "dev:part" can come from the environment and a '-' can > > be used in that case." > > I've sent a patch to fix this. Thanks guys, I was a little worried about that merge, but not as worried as I should have been. -- Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120928/faff753b/attachment.pgp> ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2012-09-28 16:17 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-07-19 22:03 [U-Boot] [PATCH 7/7] FAT: Make it possible to read from any file position Benoît Thébaudeau 2012-07-19 22:44 ` Mike Frysinger 2012-07-19 23:17 ` Benoît Thébaudeau 2012-07-20 3:02 ` Mike Frysinger 2012-07-20 13:22 ` [U-Boot] [PATCH v2 8/8] " Benoît Thébaudeau 2012-09-02 15:28 ` Wolfgang Denk 2012-09-03 14:17 ` Benoît Thébaudeau 2012-09-14 20:49 ` Tom Rini 2012-09-14 22:03 ` Benoît Thébaudeau 2012-09-14 22:02 ` Tom Rini 2012-09-22 20:32 ` Benoît Thébaudeau 2012-09-18 18:14 ` [U-Boot] [PATCH v3] " Benoît Thébaudeau 2012-09-27 16:20 ` [U-Boot] [U-Boot, " Tom Rini 2012-09-28 11:32 ` Benoît Thébaudeau 2012-09-28 15:34 ` Stephen Warren 2012-09-28 16:17 ` Tom Rini
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox