* [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 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 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 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] [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] [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