All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] FAT on non standard sector size devices
@ 2008-11-12 10:09 Igor Luri
  2008-11-12 11:25 ` Remy Bohmer
  0 siblings, 1 reply; 10+ messages in thread
From: Igor Luri @ 2008-11-12 10:09 UTC (permalink / raw)
  To: u-boot

Hi all!

There are USB devices with sector size different than 512 bytes. In
fact, I have one with 2048 bytes per sector:

scsi0 : SCSI emulation for USB Mass Storage devices
  Vendor: ChipsBnk  Model: Flash Disk        Rev: 4.00
  Type:   Direct-Access                      ANSI SCSI revision: 02
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
SCSI device sda: 129124 2048-byte hdwr sectors (264 MB)
sda: Write Protect is off
Partition check:
 sda: sda1 sda2 sda3 sda4

U-boot FAT filesystem code supposes that sector size is always 512
bytes, consecuently fatload and fatls commands ends up with a
segmentation fault.

Attached patches adds FAT support on devices with sector size up to 8192
bytes.

I have only tested on our custom board with u-boot 1.1.6 version. I
would aprpeciate if someone could test this patch on latest version.

Thanks.


Signed-off-by: Igor Luri <iluri@aotek.es>


-- 
Igor Luri
R&D Software Department
Fagor Aotek S. Coop.
P. O. Box 144
E-20500 Mondrag?n-Arrasate
Tel.    ++34 943 71 92 00 
        ++34 943 71 92 01 (Ext. 44268)
Fax.    ++34 943 79 92 03
www.aotek.es
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Add-support-for-non-standard-sector-size-devices.patch
Type: application/mbox
Size: 6252 bytes
Desc: not available
Url : http://lists.denx.de/pipermail/u-boot/attachments/20081112/a684ed52/attachment-0002.bin 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-Add-support-for-non-standard-sector-size-devices.patch
Type: application/mbox
Size: 2053 bytes
Desc: not available
Url : http://lists.denx.de/pipermail/u-boot/attachments/20081112/a684ed52/attachment-0003.bin 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] FAT on non standard sector size devices
  2008-11-12 10:09 Igor Luri
@ 2008-11-12 11:25 ` Remy Bohmer
  0 siblings, 0 replies; 10+ messages in thread
From: Remy Bohmer @ 2008-11-12 11:25 UTC (permalink / raw)
  To: u-boot

Hello Igor,

2008/11/12 Igor Luri <iluri@aotek.es>:
> Hi all!
>
> There are USB devices with sector size different than 512 bytes. In
> fact, I have one with 2048 bytes per sector:
>
> scsi0 : SCSI emulation for USB Mass Storage devices
>  Vendor: ChipsBnk  Model: Flash Disk        Rev: 4.00
>  Type:   Direct-Access                      ANSI SCSI revision: 02
> Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
> SCSI device sda: 129124 2048-byte hdwr sectors (264 MB)
> sda: Write Protect is off
> Partition check:
>  sda: sda1 sda2 sda3 sda4
>
> U-boot FAT filesystem code supposes that sector size is always 512
> bytes, consecuently fatload and fatls commands ends up with a
> segmentation fault.
>
> Attached patches adds FAT support on devices with sector size up to 8192
> bytes.

Please only sent patches inline, see http://lwn.net/Articles/139918/
for more info

> I have only tested on our custom board with u-boot 1.1.6 version. I
> would aprpeciate if someone could test this patch on latest version.

I just looked at it (not tested it yet), and I have some comments:

> -	unsigned char buffer[SECTOR_SIZE];
> +	unsigned char buffer[8192];
>  	disk_partition_t info;

Why hardcode this size to 8192, cant it be malloced somehow?
Is there a check that detects if the size is getting bigger than 8192
to prevent segfaults?

>   	if (!dev_desc->block_read)
> @@ -184,7 +185,7 @@ static void get_name (dir_entry *dirent, char *s_name)
>  	if (*s_name == DELETED_FLAG)
>  		*s_name = '\0';
>  	else if (*s_name == aRING)
> -		*s_name = '?';
> +		*s_name = '???';

Some weird characters here... Is this change what you want?


Kind Regards,

Remy

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] FAT on non standard sector size devices
       [not found] <1226492854.5686.8.camel@txema-desktop>
@ 2008-11-12 13:21 ` Igor Luri
  0 siblings, 0 replies; 10+ messages in thread
From: Igor Luri @ 2008-11-12 13:21 UTC (permalink / raw)
  To: u-boot

> Please only sent patches inline, see http://lwn.net/Articles/139918/

Sorry.

> Why hardcode this size to 8192, cant it be malloced somehow?
> Is there a check that detects if the size is getting bigger than 8192
> to prevent segfaults?
> 
In read_bootsectandvi function already isn't known device sector size, so I define quite large sector size of 8 Kbyte. 

It can be malloced if I get the sector size of the device from block_dev_desc_t. I am going to double check it, and if 
it works, I'll send the definitive patch.

> Some weird characters here... Is this change what you want?

Sorry, I don't know how I have changed thouse caracters, I will correct this too.



Thanks.



-- 
Igor Luri
R&D Software Department
Fagor Aotek S. Coop.
P. O. Box 144
E-20500 Mondrag?n-Arrasate
Tel.    ++34 943 71 92 00 
        ++34 943 71 92 01 (Ext. 44268)
Fax.    ++34 943 79 92 03
www.aotek.es

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] FAT on non standard sector size devices
@ 2008-11-12 16:30 Igor Luri
  2008-11-12 19:21 ` Remy Bohmer
  2008-11-12 22:01 ` Wolfgang Denk
  0 siblings, 2 replies; 10+ messages in thread
From: Igor Luri @ 2008-11-12 16:30 UTC (permalink / raw)
  To: u-boot

Hi all!

I have done some changes sugested by Remy Bohme and finally the
following patch adds FAT support on devices of ANY sector size.

I have only tested on our custom board with u-boot 1.1.6 version. I
would appreciate if someone could test this patch on latest version.

Thanks.

Signed-off-by: Igor Luri <iluri@aotek.es>

diff --git a/include/fat.h b/include/fat.h
index 59de3fb..dad2e3d 100644
--- a/include/fat.h
+++ b/include/fat.h
@@ -31,20 +31,12 @@
 
 #define CONFIG_SUPPORT_VFAT
 
-#define SECTOR_SIZE FS_BLOCK_SIZE
-
-#define FS_BLOCK_SIZE 512
-
-#if FS_BLOCK_SIZE != SECTOR_SIZE
-#error FS_BLOCK_SIZE != SECTOR_SIZE - This code needs to be fixed!
-#endif
-
 #define MAX_CLUSTSIZE	65536
-#define DIRENTSPERBLOCK	(FS_BLOCK_SIZE/sizeof(dir_entry))
-#define DIRENTSPERCLUST
((mydata->clust_size*SECTOR_SIZE)/sizeof(dir_entry))
+#define DIRENTSPERBLOCK	(mydata->sector_size/sizeof(dir_entry))
+#define DIRENTSPERCLUST
((mydata->clust_size*mydata->sector_size)/sizeof(dir_entry))
 
 #define FATBUFBLOCKS	6
-#define FATBUFSIZE	(FS_BLOCK_SIZE*FATBUFBLOCKS)
+#define FATBUFSIZE	    (mydata->sector_size*FATBUFBLOCKS)
 #define FAT12BUFSIZE	((FATBUFSIZE*2)/3)
 #define FAT16BUFSIZE	(FATBUFSIZE/2)
 #define FAT32BUFSIZE	(FATBUFSIZE/4)
@@ -182,8 +174,9 @@ typedef struct dir_slot {
  * (see FAT32 accesses)
  */
 typedef struct {
-	__u8	fatbuf[FATBUFSIZE]; /* Current FAT buffer */
+	__u8	*fatbuf; /* Current FAT buffer */
 	int	fatsize;	/* Size of FAT in bits */
+	__u16	sector_size;	/* Sector size */
 	__u16	fatlength;	/* Length of FAT in sectors */
 	__u16	fat_sect;	/* Starting sector of the FAT */
 	__u16	rootdir_sect;	/* Start sector of root directory */


diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 2f0bd8c..c24f009 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -30,6 +30,7 @@
 #include <fat.h>
 #include <asm/byteorder.h>
 #include <part.h>
+#include <malloc.h>
 
 /*
  * Convert a string to lowercase.
@@ -67,12 +68,17 @@ int disk_read (__u32 startblock, __u32 getsize, __u8
* bufptr)
 int
 fat_register_device(block_dev_desc_t *dev_desc, int part_no)
 {
-	unsigned char buffer[SECTOR_SIZE];
+	unsigned char *buffer;
 	disk_partition_t info;
 
 	if (!dev_desc->block_read)
 		return -1;
-	cur_dev = dev_desc;
+	cur_dev=dev_desc;
+	
+	buffer = malloc (cur_dev->blksz);
+	if(buffer == NULL)
+	   	return(-1);
+	
 	/* check if we have a MBR (on floppies we have only a PBR) */
 	if (dev_desc->block_read (dev_desc->dev, 0, 1, (ulong *) buffer) != 1)
{
 		printf ("** Can't read from device %d **\n", dev_desc->dev);
@@ -118,6 +124,7 @@ fat_register_device(block_dev_desc_t *dev_desc, int
part_no)
 		cur_part = 1;
 	}
 #endif
+	free(buffer);
 	return 0;
 }
 
@@ -220,12 +227,12 @@ get_fatent(fsdata *mydata, __u32 entry)
 
 	/* Read a new block of FAT entries into the cache. */
 	if (bufnum != mydata->fatbufnum) {
-		int getsize = FATBUFSIZE/FS_BLOCK_SIZE;
+		int getsize = FATBUFSIZE/mydata->sector_size;
 		__u8 *bufptr = mydata->fatbuf;
 		__u32 fatlength = mydata->fatlength;
 		__u32 startblock = bufnum * FATBUFBLOCKS;
 
-		fatlength *= SECTOR_SIZE;	/* We want it in bytes now */
+		fatlength *= mydata->sector_size;	/* We want it in bytes now */
 		startblock += mydata->fat_sect;	/* Offset from start of disk */
 
 		if (getsize > fatlength) getsize = fatlength;
@@ -300,20 +307,25 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8
*buffer, unsigned long size)
 	}
 
 	FAT_DPRINT("gc - clustnum: %d, startsect: %d\n", clustnum, startsect);
-	if (disk_read(startsect, size/FS_BLOCK_SIZE , buffer) < 0) {
+	if (disk_read(startsect, size/mydata->sector_size , buffer) < 0) {
 		FAT_DPRINT("Error reading data\n");
 		return -1;
 	}
-	if(size % FS_BLOCK_SIZE) {
-		__u8 tmpbuf[FS_BLOCK_SIZE];
-		idx= size/FS_BLOCK_SIZE;
+	if(size % mydata->sector_size) {
+		__u8 * tmpbuf;
+		
+		tmpbuf = (__u8*) malloc(mydata->sector_size);
+		if(tmpbuf == NULL)
+			return(-1);
+		idx= size/mydata->sector_size;
 		if (disk_read(startsect + idx, 1, tmpbuf) < 0) {
 			FAT_DPRINT("Error reading data\n");
 			return -1;
 		}
-		buffer += idx*FS_BLOCK_SIZE;
+		buffer += idx*mydata->sector_size;
 
-		memcpy(buffer, tmpbuf, size % FS_BLOCK_SIZE);
+		memcpy(buffer, tmpbuf, size % mydata->sector_size);
+		free(tmpbuf);
 		return 0;
 	}
 
@@ -331,7 +343,7 @@ get_contents(fsdata *mydata, dir_entry *dentptr,
__u8 *buffer,
 	     unsigned long maxsize)
 {
 	unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
-	unsigned int bytesperclust = mydata->clust_size * SECTOR_SIZE;
+	unsigned int bytesperclust = mydata->clust_size * mydata->sector_size;
 	__u32 curclust = START(dentptr);
 	__u32 endclust, newclust;
 	unsigned long actsize;
@@ -440,7 +452,7 @@ get_vfatname(fsdata *mydata, int curclust, __u8
*cluster,
 {
 	dir_entry *realdent;
 	dir_slot  *slotptr = (dir_slot*) retdent;
-	__u8	  *nextclust = cluster + mydata->clust_size * SECTOR_SIZE;
+	__u8	  *nextclust = cluster + mydata->clust_size *
mydata->sector_size;
 	__u8	   counter = (slotptr->id & ~LAST_LONG_ENTRY_MASK) & 0xff;
 	int idx = 0;
 
@@ -463,7 +475,7 @@ get_vfatname(fsdata *mydata, int curclust, __u8
*cluster,
 			return -1;
 		}
 		if (get_cluster(mydata, curclust, get_vfatname_block,
-				mydata->clust_size * SECTOR_SIZE) != 0) {
+				mydata->clust_size * mydata->sector_size) != 0) {
 			FAT_DPRINT("Error: reading directory block\n");
 			return -1;
 		}
@@ -534,7 +546,7 @@ static dir_entry *get_dentfromdir (fsdata * mydata,
int startsect,
 	int i;
 
 	if (get_cluster (mydata, curclust, get_dentfromdir_block,
-		 mydata->clust_size * SECTOR_SIZE) != 0) {
+			mydata->clust_size * mydata->sector_size) != 0) {
 	    FAT_DPRINT ("Error: reading directory block\n");
 	    return NULL;
 	}
@@ -667,9 +679,16 @@ static dir_entry *get_dentfromdir (fsdata * mydata,
int startsect,
 static int
 read_bootsectandvi(boot_sector *bs, volume_info *volinfo, int *fatsize)
 {
-	__u8 block[FS_BLOCK_SIZE];
+	__u8 *block;
 	volume_info *vistart;
 
+	if(cur_dev == NULL)
+		return(-1);
+	
+	block = (__u8 *)malloc (cur_dev->blksz);
+	if(block == NULL)
+	   	return(-1);
+		
 	if (disk_read(0, 1, block) < 0) {
 		FAT_DPRINT("Error: reading block\n");
 		return -1;
@@ -680,6 +699,7 @@ read_bootsectandvi(boot_sector *bs, volume_info
*volinfo, int *fatsize)
 	bs->fat_length	= FAT2CPU16(bs->fat_length);
 	bs->secs_track	= FAT2CPU16(bs->secs_track);
 	bs->heads	= FAT2CPU16(bs->heads);
+	*(__u16 *)bs->sector_size = FAT2CPU16(*(__u16 *)bs->sector_size);
 #if 0 /* UNUSED */
 	bs->hidden	= FAT2CPU32(bs->hidden);
 #endif
@@ -704,7 +724,7 @@ read_bootsectandvi(boot_sector *bs, volume_info
*volinfo, int *fatsize)
 	/* Terminate fs_type string. Writing past the end of vistart
 	   is ok - it's just the buffer. */
 	vistart->fs_type[8] = '\0';
-
+	free(block);
 	if (*fatsize == 32) {
 		if (compare_sign(FAT32_SIGN, vistart->fs_type) == 0) {
 			return 0;
@@ -757,6 +777,7 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
 	mydata->fatlength = bs.fat_length;
     }
     mydata->fat_sect = bs.reserved;
+    mydata->sector_size = *(__u16 *)bs.sector_size;
     cursect = mydata->rootdir_sect
 	    = mydata->fat_sect + mydata->fatlength * bs.fats;
     mydata->clust_size = bs.cluster_size;
@@ -766,17 +787,20 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
 		- (mydata->clust_size * 2);
     } else {
 	rootdir_size = ((bs.dir_entries[1] * (int) 256 + bs.dir_entries[0])
-			* sizeof (dir_entry)) / SECTOR_SIZE;
+			* sizeof (dir_entry)) / mydata->sector_size;
 	mydata->data_begin = mydata->rootdir_sect + rootdir_size
 		- (mydata->clust_size * 2);
     }
     mydata->fatbufnum = -1;
+    mydata->fatbuf = (__u8 *) malloc (FATBUFSIZE);
+    if(mydata->fatbuf == NULL)
+    	return(-1);
 
     FAT_DPRINT ("FAT%d, fatlength: %d\n", mydata->fatsize,
 		mydata->fatlength);
     FAT_DPRINT ("Rootdir begins at sector: %d, offset: %x, size: %d\n"
 		"Data begins at: %d\n",
-		mydata->rootdir_sect, mydata->rootdir_sect * SECTOR_SIZE,
+		mydata->rootdir_sect, mydata->rootdir_sect * mydata->sector_size,
 		rootdir_size, mydata->data_begin);
     FAT_DPRINT ("Cluster size: %d\n", mydata->clust_size);
 
@@ -787,8 +811,10 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
     strcpy (fnamecopy, filename);
     downcase (fnamecopy);
     if (*fnamecopy == '\0') {
-	if (!dols)
-	    return -1;
+	if (!dols) {
+	free(mydata->fatbuf);
+	return -1;
+	}
 	dols = LS_ROOT;
     } else if ((idx = dirdelim (fnamecopy)) >= 0) {
 	isdir = 1;
@@ -806,6 +832,7 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
 
 	if (disk_read (cursect, mydata->clust_size, do_fat_read_block) < 0) {
 	    FAT_DPRINT ("Error: reading rootdir block\n");
+	    free(mydata->fatbuf);
 	    return -1;
 	}
 	dentptr = (dir_entry *) do_fat_read_block;
@@ -856,6 +883,7 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
 		    continue;
 		}
 	    } else if (dentptr->name[0] == 0) {
+	    free(mydata->fatbuf);
 		FAT_DPRINT ("RootDentname == NULL - %d\n", i);
 		if (dols == LS_ROOT) {
 		    printf ("\n%d file(s), %d dir(s)\n\n", files, dirs);
@@ -906,9 +934,10 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
 		dentptr++;
 		continue;
 	    }
-	    if (isdir && !(dentptr->attr & ATTR_DIR))
+	    if (isdir && !(dentptr->attr & ATTR_DIR)) {
+	    free(mydata->fatbuf);	
 		return -1;
-
+	    }
 	    FAT_DPRINT ("RootName: %s", s_name);
 	    FAT_DPRINT (", start: 0x%x", START (dentptr));
 	    FAT_DPRINT (", size:  0x%x %s\n",
@@ -949,20 +978,23 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
 
 	if (get_dentfromdir (mydata, startsect, subname, dentptr,
 			     isdir ? 0 : dols) == NULL) {
+		free(mydata->fatbuf);
 	    if (dols && !isdir)
 		return 0;
 	    return -1;
 	}
 
 	if (idx >= 0) {
-	    if (!(dentptr->attr & ATTR_DIR))
-		return -1;
+	    if (!(dentptr->attr & ATTR_DIR)) {
+	    free(mydata->fatbuf);
+	    return -1;
+	    }
 	    subname = nextname;
 	}
     }
     ret = get_contents (mydata, dentptr, buffer, maxsize);
     FAT_DPRINT ("Size: %d, got: %ld\n", FAT2CPU32 (dentptr->size),
ret);
-
+    free(mydata->fatbuf);
     return ret;
 }
 




-- 
Igor Luri
R&D Software Department
Fagor Aotek S. Coop.
P. O. Box 144
E-20500 Mondrag?n-Arrasate
Tel.    ++34 943 71 92 00 
        ++34 943 71 92 01 (Ext. 44268)
Fax.    ++34 943 79 92 03
www.aotek.es

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] FAT on non standard sector size devices
  2008-11-12 16:30 Igor Luri
@ 2008-11-12 19:21 ` Remy Bohmer
  2008-11-12 22:01 ` Wolfgang Denk
  1 sibling, 0 replies; 10+ messages in thread
From: Remy Bohmer @ 2008-11-12 19:21 UTC (permalink / raw)
  To: u-boot

Hello Luri,

2008/11/12 Igor Luri <iluri@aotek.es>:
> Hi all!
>
> I have done some changes sugested by Remy Bohme and finally the
> following patch adds FAT support on devices of ANY sector size.
>
> I have only tested on our custom board with u-boot 1.1.6 version. I
> would appreciate if someone could test this patch on latest version.

I will try to find a gap tomorrow to test it on mainline.
I will keep you informed!

Kind Regards,

Remy


>
> Thanks.
>
> Signed-off-by: Igor Luri <iluri@aotek.es>
>
> diff --git a/include/fat.h b/include/fat.h
> index 59de3fb..dad2e3d 100644
> --- a/include/fat.h
> +++ b/include/fat.h
> @@ -31,20 +31,12 @@
>
>  #define CONFIG_SUPPORT_VFAT
>
> -#define SECTOR_SIZE FS_BLOCK_SIZE
> -
> -#define FS_BLOCK_SIZE 512
> -
> -#if FS_BLOCK_SIZE != SECTOR_SIZE
> -#error FS_BLOCK_SIZE != SECTOR_SIZE - This code needs to be fixed!
> -#endif
> -
>  #define MAX_CLUSTSIZE  65536
> -#define DIRENTSPERBLOCK        (FS_BLOCK_SIZE/sizeof(dir_entry))
> -#define DIRENTSPERCLUST
> ((mydata->clust_size*SECTOR_SIZE)/sizeof(dir_entry))
> +#define DIRENTSPERBLOCK        (mydata->sector_size/sizeof(dir_entry))
> +#define DIRENTSPERCLUST
> ((mydata->clust_size*mydata->sector_size)/sizeof(dir_entry))
>
>  #define FATBUFBLOCKS   6
> -#define FATBUFSIZE     (FS_BLOCK_SIZE*FATBUFBLOCKS)
> +#define FATBUFSIZE         (mydata->sector_size*FATBUFBLOCKS)
>  #define FAT12BUFSIZE   ((FATBUFSIZE*2)/3)
>  #define FAT16BUFSIZE   (FATBUFSIZE/2)
>  #define FAT32BUFSIZE   (FATBUFSIZE/4)
> @@ -182,8 +174,9 @@ typedef struct dir_slot {
>  * (see FAT32 accesses)
>  */
>  typedef struct {
> -       __u8    fatbuf[FATBUFSIZE]; /* Current FAT buffer */
> +       __u8    *fatbuf; /* Current FAT buffer */
>        int     fatsize;        /* Size of FAT in bits */
> +       __u16   sector_size;    /* Sector size */
>        __u16   fatlength;      /* Length of FAT in sectors */
>        __u16   fat_sect;       /* Starting sector of the FAT */
>        __u16   rootdir_sect;   /* Start sector of root directory */
>
>
> diff --git a/fs/fat/fat.c b/fs/fat/fat.c
> index 2f0bd8c..c24f009 100644
> --- a/fs/fat/fat.c
> +++ b/fs/fat/fat.c
> @@ -30,6 +30,7 @@
>  #include <fat.h>
>  #include <asm/byteorder.h>
>  #include <part.h>
> +#include <malloc.h>
>
>  /*
>  * Convert a string to lowercase.
> @@ -67,12 +68,17 @@ int disk_read (__u32 startblock, __u32 getsize, __u8
> * bufptr)
>  int
>  fat_register_device(block_dev_desc_t *dev_desc, int part_no)
>  {
> -       unsigned char buffer[SECTOR_SIZE];
> +       unsigned char *buffer;
>        disk_partition_t info;
>
>        if (!dev_desc->block_read)
>                return -1;
> -       cur_dev = dev_desc;
> +       cur_dev=dev_desc;
> +
> +       buffer = malloc (cur_dev->blksz);
> +       if(buffer == NULL)
> +               return(-1);
> +
>        /* check if we have a MBR (on floppies we have only a PBR) */
>        if (dev_desc->block_read (dev_desc->dev, 0, 1, (ulong *) buffer) != 1)
> {
>                printf ("** Can't read from device %d **\n", dev_desc->dev);
> @@ -118,6 +124,7 @@ fat_register_device(block_dev_desc_t *dev_desc, int
> part_no)
>                cur_part = 1;
>        }
>  #endif
> +       free(buffer);
>        return 0;
>  }
>
> @@ -220,12 +227,12 @@ get_fatent(fsdata *mydata, __u32 entry)
>
>        /* Read a new block of FAT entries into the cache. */
>        if (bufnum != mydata->fatbufnum) {
> -               int getsize = FATBUFSIZE/FS_BLOCK_SIZE;
> +               int getsize = FATBUFSIZE/mydata->sector_size;
>                __u8 *bufptr = mydata->fatbuf;
>                __u32 fatlength = mydata->fatlength;
>                __u32 startblock = bufnum * FATBUFBLOCKS;
>
> -               fatlength *= SECTOR_SIZE;       /* We want it in bytes now */
> +               fatlength *= mydata->sector_size;       /* We want it in bytes now */
>                startblock += mydata->fat_sect; /* Offset from start of disk */
>
>                if (getsize > fatlength) getsize = fatlength;
> @@ -300,20 +307,25 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8
> *buffer, unsigned long size)
>        }
>
>        FAT_DPRINT("gc - clustnum: %d, startsect: %d\n", clustnum, startsect);
> -       if (disk_read(startsect, size/FS_BLOCK_SIZE , buffer) < 0) {
> +       if (disk_read(startsect, size/mydata->sector_size , buffer) < 0) {
>                FAT_DPRINT("Error reading data\n");
>                return -1;
>        }
> -       if(size % FS_BLOCK_SIZE) {
> -               __u8 tmpbuf[FS_BLOCK_SIZE];
> -               idx= size/FS_BLOCK_SIZE;
> +       if(size % mydata->sector_size) {
> +               __u8 * tmpbuf;
> +
> +               tmpbuf = (__u8*) malloc(mydata->sector_size);
> +               if(tmpbuf == NULL)
> +                       return(-1);
> +               idx= size/mydata->sector_size;
>                if (disk_read(startsect + idx, 1, tmpbuf) < 0) {
>                        FAT_DPRINT("Error reading data\n");
>                        return -1;
>                }
> -               buffer += idx*FS_BLOCK_SIZE;
> +               buffer += idx*mydata->sector_size;
>
> -               memcpy(buffer, tmpbuf, size % FS_BLOCK_SIZE);
> +               memcpy(buffer, tmpbuf, size % mydata->sector_size);
> +               free(tmpbuf);
>                return 0;
>        }
>
> @@ -331,7 +343,7 @@ get_contents(fsdata *mydata, dir_entry *dentptr,
> __u8 *buffer,
>             unsigned long maxsize)
>  {
>        unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
> -       unsigned int bytesperclust = mydata->clust_size * SECTOR_SIZE;
> +       unsigned int bytesperclust = mydata->clust_size * mydata->sector_size;
>        __u32 curclust = START(dentptr);
>        __u32 endclust, newclust;
>        unsigned long actsize;
> @@ -440,7 +452,7 @@ get_vfatname(fsdata *mydata, int curclust, __u8
> *cluster,
>  {
>        dir_entry *realdent;
>        dir_slot  *slotptr = (dir_slot*) retdent;
> -       __u8      *nextclust = cluster + mydata->clust_size * SECTOR_SIZE;
> +       __u8      *nextclust = cluster + mydata->clust_size *
> mydata->sector_size;
>        __u8       counter = (slotptr->id & ~LAST_LONG_ENTRY_MASK) & 0xff;
>        int idx = 0;
>
> @@ -463,7 +475,7 @@ get_vfatname(fsdata *mydata, int curclust, __u8
> *cluster,
>                        return -1;
>                }
>                if (get_cluster(mydata, curclust, get_vfatname_block,
> -                               mydata->clust_size * SECTOR_SIZE) != 0) {
> +                               mydata->clust_size * mydata->sector_size) != 0) {
>                        FAT_DPRINT("Error: reading directory block\n");
>                        return -1;
>                }
> @@ -534,7 +546,7 @@ static dir_entry *get_dentfromdir (fsdata * mydata,
> int startsect,
>        int i;
>
>        if (get_cluster (mydata, curclust, get_dentfromdir_block,
> -                mydata->clust_size * SECTOR_SIZE) != 0) {
> +                       mydata->clust_size * mydata->sector_size) != 0) {
>            FAT_DPRINT ("Error: reading directory block\n");
>            return NULL;
>        }
> @@ -667,9 +679,16 @@ static dir_entry *get_dentfromdir (fsdata * mydata,
> int startsect,
>  static int
>  read_bootsectandvi(boot_sector *bs, volume_info *volinfo, int *fatsize)
>  {
> -       __u8 block[FS_BLOCK_SIZE];
> +       __u8 *block;
>        volume_info *vistart;
>
> +       if(cur_dev == NULL)
> +               return(-1);
> +
> +       block = (__u8 *)malloc (cur_dev->blksz);
> +       if(block == NULL)
> +               return(-1);
> +
>        if (disk_read(0, 1, block) < 0) {
>                FAT_DPRINT("Error: reading block\n");
>                return -1;
> @@ -680,6 +699,7 @@ read_bootsectandvi(boot_sector *bs, volume_info
> *volinfo, int *fatsize)
>        bs->fat_length  = FAT2CPU16(bs->fat_length);
>        bs->secs_track  = FAT2CPU16(bs->secs_track);
>        bs->heads       = FAT2CPU16(bs->heads);
> +       *(__u16 *)bs->sector_size = FAT2CPU16(*(__u16 *)bs->sector_size);
>  #if 0 /* UNUSED */
>        bs->hidden      = FAT2CPU32(bs->hidden);
>  #endif
> @@ -704,7 +724,7 @@ read_bootsectandvi(boot_sector *bs, volume_info
> *volinfo, int *fatsize)
>        /* Terminate fs_type string. Writing past the end of vistart
>           is ok - it's just the buffer. */
>        vistart->fs_type[8] = '\0';
> -
> +       free(block);
>        if (*fatsize == 32) {
>                if (compare_sign(FAT32_SIGN, vistart->fs_type) == 0) {
>                        return 0;
> @@ -757,6 +777,7 @@ do_fat_read (const char *filename, void *buffer,
> unsigned long maxsize,
>        mydata->fatlength = bs.fat_length;
>     }
>     mydata->fat_sect = bs.reserved;
> +    mydata->sector_size = *(__u16 *)bs.sector_size;
>     cursect = mydata->rootdir_sect
>            = mydata->fat_sect + mydata->fatlength * bs.fats;
>     mydata->clust_size = bs.cluster_size;
> @@ -766,17 +787,20 @@ do_fat_read (const char *filename, void *buffer,
> unsigned long maxsize,
>                - (mydata->clust_size * 2);
>     } else {
>        rootdir_size = ((bs.dir_entries[1] * (int) 256 + bs.dir_entries[0])
> -                       * sizeof (dir_entry)) / SECTOR_SIZE;
> +                       * sizeof (dir_entry)) / mydata->sector_size;
>        mydata->data_begin = mydata->rootdir_sect + rootdir_size
>                - (mydata->clust_size * 2);
>     }
>     mydata->fatbufnum = -1;
> +    mydata->fatbuf = (__u8 *) malloc (FATBUFSIZE);
> +    if(mydata->fatbuf == NULL)
> +       return(-1);
>
>     FAT_DPRINT ("FAT%d, fatlength: %d\n", mydata->fatsize,
>                mydata->fatlength);
>     FAT_DPRINT ("Rootdir begins at sector: %d, offset: %x, size: %d\n"
>                "Data begins at: %d\n",
> -               mydata->rootdir_sect, mydata->rootdir_sect * SECTOR_SIZE,
> +               mydata->rootdir_sect, mydata->rootdir_sect * mydata->sector_size,
>                rootdir_size, mydata->data_begin);
>     FAT_DPRINT ("Cluster size: %d\n", mydata->clust_size);
>
> @@ -787,8 +811,10 @@ do_fat_read (const char *filename, void *buffer,
> unsigned long maxsize,
>     strcpy (fnamecopy, filename);
>     downcase (fnamecopy);
>     if (*fnamecopy == '\0') {
> -       if (!dols)
> -           return -1;
> +       if (!dols) {
> +       free(mydata->fatbuf);
> +       return -1;
> +       }
>        dols = LS_ROOT;
>     } else if ((idx = dirdelim (fnamecopy)) >= 0) {
>        isdir = 1;
> @@ -806,6 +832,7 @@ do_fat_read (const char *filename, void *buffer,
> unsigned long maxsize,
>
>        if (disk_read (cursect, mydata->clust_size, do_fat_read_block) < 0) {
>            FAT_DPRINT ("Error: reading rootdir block\n");
> +           free(mydata->fatbuf);
>            return -1;
>        }
>        dentptr = (dir_entry *) do_fat_read_block;
> @@ -856,6 +883,7 @@ do_fat_read (const char *filename, void *buffer,
> unsigned long maxsize,
>                    continue;
>                }
>            } else if (dentptr->name[0] == 0) {
> +           free(mydata->fatbuf);
>                FAT_DPRINT ("RootDentname == NULL - %d\n", i);
>                if (dols == LS_ROOT) {
>                    printf ("\n%d file(s), %d dir(s)\n\n", files, dirs);
> @@ -906,9 +934,10 @@ do_fat_read (const char *filename, void *buffer,
> unsigned long maxsize,
>                dentptr++;
>                continue;
>            }
> -           if (isdir && !(dentptr->attr & ATTR_DIR))
> +           if (isdir && !(dentptr->attr & ATTR_DIR)) {
> +           free(mydata->fatbuf);
>                return -1;
> -
> +           }
>            FAT_DPRINT ("RootName: %s", s_name);
>            FAT_DPRINT (", start: 0x%x", START (dentptr));
>            FAT_DPRINT (", size:  0x%x %s\n",
> @@ -949,20 +978,23 @@ do_fat_read (const char *filename, void *buffer,
> unsigned long maxsize,
>
>        if (get_dentfromdir (mydata, startsect, subname, dentptr,
>                             isdir ? 0 : dols) == NULL) {
> +               free(mydata->fatbuf);
>            if (dols && !isdir)
>                return 0;
>            return -1;
>        }
>
>        if (idx >= 0) {
> -           if (!(dentptr->attr & ATTR_DIR))
> -               return -1;
> +           if (!(dentptr->attr & ATTR_DIR)) {
> +           free(mydata->fatbuf);
> +           return -1;
> +           }
>            subname = nextname;
>        }
>     }
>     ret = get_contents (mydata, dentptr, buffer, maxsize);
>     FAT_DPRINT ("Size: %d, got: %ld\n", FAT2CPU32 (dentptr->size),
> ret);
> -
> +    free(mydata->fatbuf);
>     return ret;
>  }
>
>
>
>
>
> --
> Igor Luri
> R&D Software Department
> Fagor Aotek S. Coop.
> P. O. Box 144
> E-20500 Mondrag?n-Arrasate
> Tel.    ++34 943 71 92 00
>        ++34 943 71 92 01 (Ext. 44268)
> Fax.    ++34 943 79 92 03
> www.aotek.es
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] FAT on non standard sector size devices
  2008-11-12 16:30 Igor Luri
  2008-11-12 19:21 ` Remy Bohmer
@ 2008-11-12 22:01 ` Wolfgang Denk
  1 sibling, 0 replies; 10+ messages in thread
From: Wolfgang Denk @ 2008-11-12 22:01 UTC (permalink / raw)
  To: u-boot

Dear Igor Luri,

In message <1226507458.6038.70.camel@ilurilinux> you wrote:
> SGkgYWxsIQoKSSBoYXZlIGRvbmUgc29tZSBjaGFuZ2VzIHN1Z2VzdGVkIGJ5IFJlbXkgQm9obWUg
> YW5kIGZpbmFsbHkgdGhlCmZvbGxvd2luZyBwYXRjaCBhZGRzIEZBVCBzdXBwb3J0IG9uIGRldmlj
> ZXMgb2YgQU5ZIHNlY3RvciBzaXplLgoKSSBoYXZlIG9ubHkgdGVzdGVkIG9uIG91ciBjdXN0b20g
> Ym9hcmQgd2l0aCB1LWJvb3QgMS4xLjYgdmVyc2lvbi4gSQp3b3VsZCBhcHByZWNpYXRlIGlmIHNv
> bWVvbmUgY291bGQgdGVzdCB0aGlzIHBhdGNoIG9uIGxhdGVzdCB2ZXJzaW9uLgoKVGhhbmtzLgoK
> U2lnbmVkLW9mZi1ieTogSWdvciBMdXJpIDxpbHVyaUBhb3Rlay5lcz4KCmRpZmYgLS1naXQgYS9p
> bmNsdWRlL2ZhdC5oIGIvaW5jbHVkZS9mYXQuaAppbmRleCA1OWRlM2ZiLi5kYWQyZTNkIDEwMDY0
> NAotLS0gYS9pbmNsdWRlL2ZhdC5oCisrKyBiL2luY2x1ZGUvZmF0LmgKQEAgLTMxLDIwICszMSwx
> MiBAQAogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotI2RlZmluZSBTRUNUT1JfU0la
> RSBGU19CTE9DS19TSVpFCi0KLSNkZWZpbmUgRlNfQkxPQ0tfU0laRSA1MTIKLQotI2lmIEZTX0JM
> T0NLX1NJWkUgIT0gU0VDVE9SX1NJWkUKLSNlcnJvciBGU19CTE9DS19TSVpFICE9IFNFQ1RPUl9T
> SVpFIC0gVGhpcyBjb2RlIG5lZWRzIHRvIGJlIGZpeGVkIQotI2VuZGlmCi0KICNkZWZpbmUgTUFY
> X0NMVVNUU0laRQk2NTUzNgotI2RlZmluZSBESVJFTlRTUEVSQkxPQ0sJKEZTX0JMT0NLX1NJWkUv
> c2l6ZW9mKGRpcl9lbnRyeSkpCi0jZGVmaW5lIERJUkVOVFNQRVJDTFVTVAooKG15ZGF0YS0+Y2x1
> c3Rfc2l6ZSpTRUNUT1JfU0laRSkvc2l6ZW9mKGRpcl9lbnRyeSkpCisjZGVmaW5lIERJUkVOVFNQ
> RVJCTE9DSwkobXlkYXRhLT5zZWN0b3Jfc2l6ZS9zaXplb2YoZGlyX2VudHJ5KSkKKyNkZWZpbmUg
> RElSRU5UU1BFUkNMVVNUCigobXlkYXRhLT5jbHVzdF9zaXplKm15ZGF0YS0+c2VjdG9yX3NpemUp
> L3NpemVvZihkaXJfZW50cnkpKQogCiAjZGVmaW5lIEZBVEJVRkJMT0NLUwk2Ci0jZGVmaW5lIEZB
> VEJVRlNJWkUJKEZTX0JMT0NLX1NJWkUqRkFUQlVGQkxPQ0tTKQorI2RlZmluZSBGQVRCVUZTSVpF
> CSAgICAobXlkYXRhLT5zZWN0b3Jfc2l6ZSpGQVRCVUZCTE9DS1MpCiAjZGVmaW5lIEZBVDEyQlVG
> U0laRQkoKEZBVEJVRlNJWkUqMikvMykKICNkZWZpbmUgRkFUMTZCVUZTSVpFCShGQVRCVUZTSVpF
> LzIpCiAjZGVmaW5lIEZBVDMyQlVGU0laRQkoRkFUQlVGU0laRS80KQpAQCAtMTgyLDggKzE3NCw5
> IEBAIHR5cGVkZWYgc3RydWN0IGRpcl9zbG90IHsKICAqIChzZWUgRkFUMzIgYWNjZXNzZXMpCiAg
> Ki8KIHR5cGVkZWYgc3RydWN0IHsKLQlfX3U4CWZhdGJ1ZltGQVRCVUZTSVpFXTsgLyogQ3VycmVu
> dCBGQVQgYnVmZmVyICovCisJX191OAkqZmF0YnVmOyAvKiBDdXJyZW50IEZBVCBidWZmZXIgKi8K
> IAlpbnQJZmF0c2l6ZTsJLyogU2l6ZSBvZiBGQVQgaW4gYml0cyAqLworCV9fdTE2CXNlY3Rvcl9z
> aXplOwkvKiBTZWN0b3Igc2l6ZSAqLwogCV9fdTE2CWZhdGxlbmd0aDsJLyogTGVuZ3RoIG9mIEZB
> VCBpbiBzZWN0b3JzICovCiAJX191MTYJZmF0X3NlY3Q7CS8qIFN0YXJ0aW5nIHNlY3RvciBvZiB0
> aGUgRkFUICovCiAJX191MTYJcm9vdGRpcl9zZWN0OwkvKiBTdGFydCBzZWN0b3Igb2Ygcm9vdCBk
> aXJlY3RvcnkgKi8KCgpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZhdC5jIGIvZnMvZmF0L2ZhdC5jCmlu
> ZGV4IDJmMGJkOGMuLmMyNGYwMDkgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9mYXQuYworKysgYi9mcy9m
> YXQvZmF0LmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxmYXQuaD4KICNpbmNsdWRlIDxh
> c20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgog
> CiAvKgogICogQ29udmVydCBhIHN0cmluZyB0byBsb3dlcmNhc2UuCkBAIC02NywxMiArNjgsMTcg
> QEAgaW50IGRpc2tfcmVhZCAoX191MzIgc3RhcnRibG9jaywgX191MzIgZ2V0c2l6ZSwgX191OAoq
> IGJ1ZnB0cikKIGludAogZmF0X3JlZ2lzdGVyX2RldmljZShibG9ja19kZXZfZGVzY190ICpkZXZf
> ZGVzYywgaW50IHBhcnRfbm8pCiB7Ci0JdW5zaWduZWQgY2hhciBidWZmZXJbU0VDVE9SX1NJWkVd
> OworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAlkaXNrX3BhcnRpdGlvbl90IGluZm87CiAKIAlp
> ZiAoIWRldl9kZXNjLT5ibG9ja19yZWFkKQogCQlyZXR1cm4gLTE7Ci0JY3VyX2RldiA9IGRldl9k
> ZXNjOworCWN1cl9kZXY9ZGV2X2Rlc2M7CisJCisJYnVmZmVyID0gbWFsbG9jIChjdXJfZGV2LT5i
> bGtzeik7CisJaWYoYnVmZmVyID09IE5VTEwpCisJICAgCXJldHVybigtMSk7CisJCiAJLyogY2hl
> Y2sgaWYgd2UgaGF2ZSBhIE1CUiAob24gZmxvcHBpZXMgd2UgaGF2ZSBvbmx5IGEgUEJSKSAqLwog
> CWlmIChkZXZfZGVzYy0+YmxvY2tfcmVhZCAoZGV2X2Rlc2MtPmRldiwgMCwgMSwgKHVsb25nICop
> IGJ1ZmZlcikgIT0gMSkKewogCQlwcmludGYgKCIqKiBDYW4ndCByZWFkIGZyb20gZGV2aWNlICVk
> ICoqXG4iLCBkZXZfZGVzYy0+ZGV2KTsKQEAgLTExOCw2ICsxMjQsNyBAQCBmYXRfcmVnaXN0ZXJf
> ZGV2aWNlKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjLCBpbnQKcGFydF9ubykKIAkJY3VyX3Bh
> cnQgPSAxOwogCX0KICNlbmRpZgorCWZyZWUoYnVmZmVyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAt
> MjIwLDEyICsyMjcsMTIgQEAgZ2V0X2ZhdGVudChmc2RhdGEgKm15ZGF0YSwgX191MzIgZW50cnkp
> CiAKIAkvKiBSZWFkIGEgbmV3IGJsb2NrIG9mIEZBVCBlbnRyaWVzIGludG8gdGhlIGNhY2hlLiAq
> LwogCWlmIChidWZudW0gIT0gbXlkYXRhLT5mYXRidWZudW0pIHsKLQkJaW50IGdldHNpemUgPSBG
> QVRCVUZTSVpFL0ZTX0JMT0NLX1NJWkU7CisJCWludCBnZXRzaXplID0gRkFUQlVGU0laRS9teWRh
> dGEtPnNlY3Rvcl9zaXplOwogCQlfX3U4ICpidWZwdHIgPSBteWRhdGEtPmZhdGJ1ZjsKIAkJX191
> MzIgZmF0bGVuZ3RoID0gbXlkYXRhLT5mYXRsZW5ndGg7CiAJCV9fdTMyIHN0YXJ0YmxvY2sgPSBi
> dWZudW0gKiBGQVRCVUZCTE9DS1M7CiAKLQkJZmF0bGVuZ3RoICo9IFNFQ1RPUl9TSVpFOwkvKiBX
> ZSB3YW50IGl0IGluIGJ5dGVzIG5vdyAqLworCQlmYXRsZW5ndGggKj0gbXlkYXRhLT5zZWN0b3Jf
> c2l6ZTsJLyogV2Ugd2FudCBpdCBpbiBieXRlcyBub3cgKi8KIAkJc3RhcnRibG9jayArPSBteWRh
> dGEtPmZhdF9zZWN0OwkvKiBPZmZzZXQgZnJvbSBzdGFydCBvZiBkaXNrICovCiAKIAkJaWYgKGdl
> dHNpemUgPiBmYXRsZW5ndGgpIGdldHNpemUgPSBmYXRsZW5ndGg7CkBAIC0zMDAsMjAgKzMwNywy
> NSBAQCBnZXRfY2x1c3Rlcihmc2RhdGEgKm15ZGF0YSwgX191MzIgY2x1c3RudW0sIF9fdTgKKmJ1
> ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQogCX0KIAogCUZBVF9EUFJJTlQoImdjIC0gY2x1c3Ru
> dW06ICVkLCBzdGFydHNlY3Q6ICVkXG4iLCBjbHVzdG51bSwgc3RhcnRzZWN0KTsKLQlpZiAoZGlz
> a19yZWFkKHN0YXJ0c2VjdCwgc2l6ZS9GU19CTE9DS19TSVpFICwgYnVmZmVyKSA8IDApIHsKKwlp
> ZiAoZGlza19yZWFkKHN0YXJ0c2VjdCwgc2l6ZS9teWRhdGEtPnNlY3Rvcl9zaXplICwgYnVmZmVy
> KSA8IDApIHsKIAkJRkFUX0RQUklOVCgiRXJyb3IgcmVhZGluZyBkYXRhXG4iKTsKIAkJcmV0dXJu
> IC0xOwogCX0KLQlpZihzaXplICUgRlNfQkxPQ0tfU0laRSkgewotCQlfX3U4IHRtcGJ1ZltGU19C
> TE9DS19TSVpFXTsKLQkJaWR4PSBzaXplL0ZTX0JMT0NLX1NJWkU7CisJaWYoc2l6ZSAlIG15ZGF0
> YS0+c2VjdG9yX3NpemUpIHsKKwkJX191OCAqIHRtcGJ1ZjsKKwkJCisJCXRtcGJ1ZiA9IChfX3U4
> KikgbWFsbG9jKG15ZGF0YS0+c2VjdG9yX3NpemUpOworCQlpZih0bXBidWYgPT0gTlVMTCkKKwkJ
> CXJldHVybigtMSk7CisJCWlkeD0gc2l6ZS9teWRhdGEtPnNlY3Rvcl9zaXplOwogCQlpZiAoZGlz
> a19yZWFkKHN0YXJ0c2VjdCArIGlkeCwgMSwgdG1wYnVmKSA8IDApIHsKIAkJCUZBVF9EUFJJTlQo
> IkVycm9yIHJlYWRpbmcgZGF0YVxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQkJYnVmZmVyICs9
> IGlkeCpGU19CTE9DS19TSVpFOworCQlidWZmZXIgKz0gaWR4Km15ZGF0YS0+c2VjdG9yX3NpemU7
> CiAKLQkJbWVtY3B5KGJ1ZmZlciwgdG1wYnVmLCBzaXplICUgRlNfQkxPQ0tfU0laRSk7CisJCW1l
> bWNweShidWZmZXIsIHRtcGJ1Ziwgc2l6ZSAlIG15ZGF0YS0+c2VjdG9yX3NpemUpOworCQlmcmVl
> KHRtcGJ1Zik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzMxLDcgKzM0Myw3IEBAIGdldF9jb250
> ZW50cyhmc2RhdGEgKm15ZGF0YSwgZGlyX2VudHJ5ICpkZW50cHRyLApfX3U4ICpidWZmZXIsCiAJ
> ICAgICB1bnNpZ25lZCBsb25nIG1heHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBmaWxlc2l6ZSA9
> IEZBVDJDUFUzMihkZW50cHRyLT5zaXplKSwgZ290c2l6ZSA9IDA7Ci0JdW5zaWduZWQgaW50IGJ5
> dGVzcGVyY2x1c3QgPSBteWRhdGEtPmNsdXN0X3NpemUgKiBTRUNUT1JfU0laRTsKKwl1bnNpZ25l
> ZCBpbnQgYnl0ZXNwZXJjbHVzdCA9IG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIG15ZGF0YS0+c2VjdG9y
> X3NpemU7CiAJX191MzIgY3VyY2x1c3QgPSBTVEFSVChkZW50cHRyKTsKIAlfX3UzMiBlbmRjbHVz
> dCwgbmV3Y2x1c3Q7CiAJdW5zaWduZWQgbG9uZyBhY3RzaXplOwpAQCAtNDQwLDcgKzQ1Miw3IEBA
> IGdldF92ZmF0bmFtZShmc2RhdGEgKm15ZGF0YSwgaW50IGN1cmNsdXN0LCBfX3U4CipjbHVzdGVy
> LAogewogCWRpcl9lbnRyeSAqcmVhbGRlbnQ7CiAJZGlyX3Nsb3QgICpzbG90cHRyID0gKGRpcl9z
> bG90KikgcmV0ZGVudDsKLQlfX3U4CSAgKm5leHRjbHVzdCA9IGNsdXN0ZXIgKyBteWRhdGEtPmNs
> dXN0X3NpemUgKiBTRUNUT1JfU0laRTsKKwlfX3U4CSAgKm5leHRjbHVzdCA9IGNsdXN0ZXIgKyBt
> eWRhdGEtPmNsdXN0X3NpemUgKgpteWRhdGEtPnNlY3Rvcl9zaXplOwogCV9fdTgJICAgY291bnRl
> ciA9IChzbG90cHRyLT5pZCAmIH5MQVNUX0xPTkdfRU5UUllfTUFTSykgJiAweGZmOwogCWludCBp
> ZHggPSAwOwogCkBAIC00NjMsNyArNDc1LDcgQEAgZ2V0X3ZmYXRuYW1lKGZzZGF0YSAqbXlkYXRh
> LCBpbnQgY3VyY2x1c3QsIF9fdTgKKmNsdXN0ZXIsCiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJaWYg
> KGdldF9jbHVzdGVyKG15ZGF0YSwgY3VyY2x1c3QsIGdldF92ZmF0bmFtZV9ibG9jaywKLQkJCQlt
> eWRhdGEtPmNsdXN0X3NpemUgKiBTRUNUT1JfU0laRSkgIT0gMCkgeworCQkJCW15ZGF0YS0+Y2x1
> c3Rfc2l6ZSAqIG15ZGF0YS0+c2VjdG9yX3NpemUpICE9IDApIHsKIAkJCUZBVF9EUFJJTlQoIkVy
> cm9yOiByZWFkaW5nIGRpcmVjdG9yeSBibG9ja1xuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAg
> LTUzNCw3ICs1NDYsNyBAQCBzdGF0aWMgZGlyX2VudHJ5ICpnZXRfZGVudGZyb21kaXIgKGZzZGF0
> YSAqIG15ZGF0YSwKaW50IHN0YXJ0c2VjdCwKIAlpbnQgaTsKIAogCWlmIChnZXRfY2x1c3RlciAo
> bXlkYXRhLCBjdXJjbHVzdCwgZ2V0X2RlbnRmcm9tZGlyX2Jsb2NrLAotCQkgbXlkYXRhLT5jbHVz
> dF9zaXplICogU0VDVE9SX1NJWkUpICE9IDApIHsKKwkJCW15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIG15
> ZGF0YS0+c2VjdG9yX3NpemUpICE9IDApIHsKIAkgICAgRkFUX0RQUklOVCAoIkVycm9yOiByZWFk
> aW5nIGRpcmVjdG9yeSBibG9ja1xuIik7CiAJICAgIHJldHVybiBOVUxMOwogCX0KQEAgLTY2Nyw5
> ICs2NzksMTYgQEAgc3RhdGljIGRpcl9lbnRyeSAqZ2V0X2RlbnRmcm9tZGlyIChmc2RhdGEgKiBt
> eWRhdGEsCmludCBzdGFydHNlY3QsCiBzdGF0aWMgaW50CiByZWFkX2Jvb3RzZWN0YW5kdmkoYm9v
> dF9zZWN0b3IgKmJzLCB2b2x1bWVfaW5mbyAqdm9saW5mbywgaW50ICpmYXRzaXplKQogewotCV9f
> dTggYmxvY2tbRlNfQkxPQ0tfU0laRV07CisJX191OCAqYmxvY2s7CiAJdm9sdW1lX2luZm8gKnZp
> c3RhcnQ7CiAKKwlpZihjdXJfZGV2ID09IE5VTEwpCisJCXJldHVybigtMSk7CisJCisJYmxvY2sg
> PSAoX191OCAqKW1hbGxvYyAoY3VyX2Rldi0+Ymxrc3opOworCWlmKGJsb2NrID09IE5VTEwpCisJ
> ICAgCXJldHVybigtMSk7CisJCQogCWlmIChkaXNrX3JlYWQoMCwgMSwgYmxvY2spIDwgMCkgewog
> CQlGQVRfRFBSSU5UKCJFcnJvcjogcmVhZGluZyBibG9ja1xuIik7CiAJCXJldHVybiAtMTsKQEAg
> LTY4MCw2ICs2OTksNyBAQCByZWFkX2Jvb3RzZWN0YW5kdmkoYm9vdF9zZWN0b3IgKmJzLCB2b2x1
> bWVfaW5mbwoqdm9saW5mbywgaW50ICpmYXRzaXplKQogCWJzLT5mYXRfbGVuZ3RoCT0gRkFUMkNQ
> VTE2KGJzLT5mYXRfbGVuZ3RoKTsKIAlicy0+c2Vjc190cmFjawk9IEZBVDJDUFUxNihicy0+c2Vj
> c190cmFjayk7CiAJYnMtPmhlYWRzCT0gRkFUMkNQVTE2KGJzLT5oZWFkcyk7CisJKihfX3UxNiAq
> KWJzLT5zZWN0b3Jfc2l6ZSA9IEZBVDJDUFUxNigqKF9fdTE2ICopYnMtPnNlY3Rvcl9zaXplKTsK
> ICNpZiAwIC8qIFVOVVNFRCAqLwogCWJzLT5oaWRkZW4JPSBGQVQyQ1BVMzIoYnMtPmhpZGRlbik7
> CiAjZW5kaWYKQEAgLTcwNCw3ICs3MjQsNyBAQCByZWFkX2Jvb3RzZWN0YW5kdmkoYm9vdF9zZWN0
> b3IgKmJzLCB2b2x1bWVfaW5mbwoqdm9saW5mbywgaW50ICpmYXRzaXplKQogCS8qIFRlcm1pbmF0
> ZSBmc190eXBlIHN0cmluZy4gV3JpdGluZyBwYXN0IHRoZSBlbmQgb2YgdmlzdGFydAogCSAgIGlz
> IG9rIC0gaXQncyBqdXN0IHRoZSBidWZmZXIuICovCiAJdmlzdGFydC0+ZnNfdHlwZVs4XSA9ICdc
> MCc7Ci0KKwlmcmVlKGJsb2NrKTsKIAlpZiAoKmZhdHNpemUgPT0gMzIpIHsKIAkJaWYgKGNvbXBh
> cmVfc2lnbihGQVQzMl9TSUdOLCB2aXN0YXJ0LT5mc190eXBlKSA9PSAwKSB7CiAJCQlyZXR1cm4g
> MDsKQEAgLTc1Nyw2ICs3NzcsNyBAQCBkb19mYXRfcmVhZCAoY29uc3QgY2hhciAqZmlsZW5hbWUs
> IHZvaWQgKmJ1ZmZlciwKdW5zaWduZWQgbG9uZyBtYXhzaXplLAogCW15ZGF0YS0+ZmF0bGVuZ3Ro
> ID0gYnMuZmF0X2xlbmd0aDsKICAgICB9CiAgICAgbXlkYXRhLT5mYXRfc2VjdCA9IGJzLnJlc2Vy
> dmVkOworICAgIG15ZGF0YS0+c2VjdG9yX3NpemUgPSAqKF9fdTE2ICopYnMuc2VjdG9yX3NpemU7
> CiAgICAgY3Vyc2VjdCA9IG15ZGF0YS0+cm9vdGRpcl9zZWN0CiAJICAgID0gbXlkYXRhLT5mYXRf
> c2VjdCArIG15ZGF0YS0+ZmF0bGVuZ3RoICogYnMuZmF0czsKICAgICBteWRhdGEtPmNsdXN0X3Np
> emUgPSBicy5jbHVzdGVyX3NpemU7CkBAIC03NjYsMTcgKzc4NywyMCBAQCBkb19mYXRfcmVhZCAo
> Y29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwKdW5zaWduZWQgbG9uZyBtYXhzaXpl
> LAogCQktIChteWRhdGEtPmNsdXN0X3NpemUgKiAyKTsKICAgICB9IGVsc2UgewogCXJvb3RkaXJf
> c2l6ZSA9ICgoYnMuZGlyX2VudHJpZXNbMV0gKiAoaW50KSAyNTYgKyBicy5kaXJfZW50cmllc1sw
> XSkKLQkJCSogc2l6ZW9mIChkaXJfZW50cnkpKSAvIFNFQ1RPUl9TSVpFOworCQkJKiBzaXplb2Yg
> KGRpcl9lbnRyeSkpIC8gbXlkYXRhLT5zZWN0b3Jfc2l6ZTsKIAlteWRhdGEtPmRhdGFfYmVnaW4g
> PSBteWRhdGEtPnJvb3RkaXJfc2VjdCArIHJvb3RkaXJfc2l6ZQogCQktIChteWRhdGEtPmNsdXN0
> X3NpemUgKiAyKTsKICAgICB9CiAgICAgbXlkYXRhLT5mYXRidWZudW0gPSAtMTsKKyAgICBteWRh
> dGEtPmZhdGJ1ZiA9IChfX3U4ICopIG1hbGxvYyAoRkFUQlVGU0laRSk7CisgICAgaWYobXlkYXRh
> LT5mYXRidWYgPT0gTlVMTCkKKyAgICAJcmV0dXJuKC0xKTsKIAogICAgIEZBVF9EUFJJTlQgKCJG
> QVQlZCwgZmF0bGVuZ3RoOiAlZFxuIiwgbXlkYXRhLT5mYXRzaXplLAogCQlteWRhdGEtPmZhdGxl
> bmd0aCk7CiAgICAgRkFUX0RQUklOVCAoIlJvb3RkaXIgYmVnaW5zIGF0IHNlY3RvcjogJWQsIG9m
> ZnNldDogJXgsIHNpemU6ICVkXG4iCiAJCSJEYXRhIGJlZ2lucyBhdDogJWRcbiIsCi0JCW15ZGF0
> YS0+cm9vdGRpcl9zZWN0LCBteWRhdGEtPnJvb3RkaXJfc2VjdCAqIFNFQ1RPUl9TSVpFLAorCQlt
> eWRhdGEtPnJvb3RkaXJfc2VjdCwgbXlkYXRhLT5yb290ZGlyX3NlY3QgKiBteWRhdGEtPnNlY3Rv
> cl9zaXplLAogCQlyb290ZGlyX3NpemUsIG15ZGF0YS0+ZGF0YV9iZWdpbik7CiAgICAgRkFUX0RQ
> UklOVCAoIkNsdXN0ZXIgc2l6ZTogJWRcbiIsIG15ZGF0YS0+Y2x1c3Rfc2l6ZSk7CiAKQEAgLTc4
> Nyw4ICs4MTEsMTAgQEAgZG9fZmF0X3JlYWQgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpi
> dWZmZXIsCnVuc2lnbmVkIGxvbmcgbWF4c2l6ZSwKICAgICBzdHJjcHkgKGZuYW1lY29weSwgZmls
> ZW5hbWUpOwogICAgIGRvd25jYXNlIChmbmFtZWNvcHkpOwogICAgIGlmICgqZm5hbWVjb3B5ID09
> ICdcMCcpIHsKLQlpZiAoIWRvbHMpCi0JICAgIHJldHVybiAtMTsKKwlpZiAoIWRvbHMpIHsKKwlm
> cmVlKG15ZGF0YS0+ZmF0YnVmKTsKKwlyZXR1cm4gLTE7CisJfQogCWRvbHMgPSBMU19ST09UOwog
> ICAgIH0gZWxzZSBpZiAoKGlkeCA9IGRpcmRlbGltIChmbmFtZWNvcHkpKSA+PSAwKSB7CiAJaXNk
> aXIgPSAxOwpAQCAtODA2LDYgKzgzMiw3IEBAIGRvX2ZhdF9yZWFkIChjb25zdCBjaGFyICpmaWxl
> bmFtZSwgdm9pZCAqYnVmZmVyLAp1bnNpZ25lZCBsb25nIG1heHNpemUsCiAKIAlpZiAoZGlza19y
> ZWFkIChjdXJzZWN0LCBteWRhdGEtPmNsdXN0X3NpemUsIGRvX2ZhdF9yZWFkX2Jsb2NrKSA8IDAp
> IHsKIAkgICAgRkFUX0RQUklOVCAoIkVycm9yOiByZWFkaW5nIHJvb3RkaXIgYmxvY2tcbiIpOwor
> CSAgICBmcmVlKG15ZGF0YS0+ZmF0YnVmKTsKIAkgICAgcmV0dXJuIC0xOwogCX0KIAlkZW50cHRy
> ID0gKGRpcl9lbnRyeSAqKSBkb19mYXRfcmVhZF9ibG9jazsKQEAgLTg1Niw2ICs4ODMsNyBAQCBk
> b19mYXRfcmVhZCAoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwKdW5zaWduZWQg
> bG9uZyBtYXhzaXplLAogCQkgICAgY29udGludWU7CiAJCX0KIAkgICAgfSBlbHNlIGlmIChkZW50
> cHRyLT5uYW1lWzBdID09IDApIHsKKwkgICAgZnJlZShteWRhdGEtPmZhdGJ1Zik7CiAJCUZBVF9E
> UFJJTlQgKCJSb290RGVudG5hbWUgPT0gTlVMTCAtICVkXG4iLCBpKTsKIAkJaWYgKGRvbHMgPT0g
> TFNfUk9PVCkgewogCQkgICAgcHJpbnRmICgiXG4lZCBmaWxlKHMpLCAlZCBkaXIocylcblxuIiwg
> ZmlsZXMsIGRpcnMpOwpAQCAtOTA2LDkgKzkzNCwxMCBAQCBkb19mYXRfcmVhZCAoY29uc3QgY2hh
> ciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwKdW5zaWduZWQgbG9uZyBtYXhzaXplLAogCQlkZW50
> cHRyKys7CiAJCWNvbnRpbnVlOwogCSAgICB9Ci0JICAgIGlmIChpc2RpciAmJiAhKGRlbnRwdHIt
> PmF0dHIgJiBBVFRSX0RJUikpCisJICAgIGlmIChpc2RpciAmJiAhKGRlbnRwdHItPmF0dHIgJiBB
> VFRSX0RJUikpIHsKKwkgICAgZnJlZShteWRhdGEtPmZhdGJ1Zik7CQogCQlyZXR1cm4gLTE7Ci0K
> KwkgICAgfQogCSAgICBGQVRfRFBSSU5UICgiUm9vdE5hbWU6ICVzIiwgc19uYW1lKTsKIAkgICAg
> RkFUX0RQUklOVCAoIiwgc3RhcnQ6IDB4JXgiLCBTVEFSVCAoZGVudHB0cikpOwogCSAgICBGQVRf
> RFBSSU5UICgiLCBzaXplOiAgMHgleCAlc1xuIiwKQEAgLTk0OSwyMCArOTc4LDIzIEBAIGRvX2Zh
> dF9yZWFkIChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLAp1bnNpZ25lZCBsb25n
> IG1heHNpemUsCiAKIAlpZiAoZ2V0X2RlbnRmcm9tZGlyIChteWRhdGEsIHN0YXJ0c2VjdCwgc3Vi
> bmFtZSwgZGVudHB0ciwKIAkJCSAgICAgaXNkaXIgPyAwIDogZG9scykgPT0gTlVMTCkgeworCQlm
> cmVlKG15ZGF0YS0+ZmF0YnVmKTsKIAkgICAgaWYgKGRvbHMgJiYgIWlzZGlyKQogCQlyZXR1cm4g
> MDsKIAkgICAgcmV0dXJuIC0xOwogCX0KIAogCWlmIChpZHggPj0gMCkgewotCSAgICBpZiAoIShk
> ZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpKQotCQlyZXR1cm4gLTE7CisJICAgIGlmICghKGRlbnRw
> dHItPmF0dHIgJiBBVFRSX0RJUikpIHsKKwkgICAgZnJlZShteWRhdGEtPmZhdGJ1Zik7CisJICAg
> IHJldHVybiAtMTsKKwkgICAgfQogCSAgICBzdWJuYW1lID0gbmV4dG5hbWU7CiAJfQogICAgIH0K
> ICAgICByZXQgPSBnZXRfY29udGVudHMgKG15ZGF0YSwgZGVudHB0ciwgYnVmZmVyLCBtYXhzaXpl
> KTsKICAgICBGQVRfRFBSSU5UICgiU2l6ZTogJWQsIGdvdDogJWxkXG4iLCBGQVQyQ1BVMzIgKGRl
> bnRwdHItPnNpemUpLApyZXQpOwotCisgICAgZnJlZShteWRhdGEtPmZhdGJ1Zik7CiAgICAgcmV0
> dXJuIHJldDsKIH0KIAoKCgoKLS0gCklnb3IgTHVyaQpSJkQgU29mdHdhcmUgRGVwYXJ0bWVudApG
> YWdvciBBb3RlayBTLiBDb29wLgpQLiBPLiBCb3ggMTQ0CkUtMjA1MDAgTW9uZHJhZ8Ozbi1BcnJh
> c2F0ZQpUZWwuICAgICsrMzQgOTQzIDcxIDkyIDAwIAogICAgICAgICsrMzQgOTQzIDcxIDkyIDAx
> IChFeHQuIDQ0MjY4KQpGYXguICAgICsrMzQgOTQzIDc5IDkyIDAzCnd3dy5hb3Rlay5lcwpfX19f
> X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpVLUJvb3QgbWFpbGlu
> ZyBsaXN0ClUtQm9vdEBsaXN0cy5kZW54LmRlCmh0dHA6Ly9saXN0cy5kZW54LmRlL21haWxtYW4v
> bGlzdGluZm8vdS1ib290Cg==
> 

Please do not send base 64 encoded messages.

Please do not send HTML messages.

Please send plain text only.

Message unreadable, ignored. Sorry.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] FAT on non standard sector size devices
@ 2008-11-17  8:19 Igor Luri
  2008-11-17 12:30 ` Jerry Van Baren
  0 siblings, 1 reply; 10+ messages in thread
From: Igor Luri @ 2008-11-17  8:19 UTC (permalink / raw)
  To: u-boot

Dear Remy Bohme,

Sorry, but I don't have experience in email encoding. I have changed
Evolution's preferences to use ISO-8859-15 intead of UTF-8 caracter
encoding. If this change does not correct the problem, any help would be
apretiated.

Thanks.

Signed-off-by: Igor Luri <iluri@aotek.es>

diff --git a/include/fat.h b/include/fat.h
index 59de3fb..dad2e3d 100644
--- a/include/fat.h
+++ b/include/fat.h
@@ -31,20 +31,12 @@
 
 #define CONFIG_SUPPORT_VFAT
 
-#define SECTOR_SIZE FS_BLOCK_SIZE
-
-#define FS_BLOCK_SIZE 512
-
-#if FS_BLOCK_SIZE != SECTOR_SIZE
-#error FS_BLOCK_SIZE != SECTOR_SIZE - This code needs to be fixed!
-#endif
-
 #define MAX_CLUSTSIZE  65536
-#define DIRENTSPERBLOCK        (FS_BLOCK_SIZE/sizeof(dir_entry))
-#define DIRENTSPERCLUST
((mydata->clust_size*SECTOR_SIZE)/sizeof(dir_entry))
+#define DIRENTSPERBLOCK        (mydata->sector_size/sizeof(dir_entry))
+#define DIRENTSPERCLUST
((mydata->clust_size*mydata->sector_size)/sizeof(dir_entry))
 
 #define FATBUFBLOCKS   6
-#define FATBUFSIZE     (FS_BLOCK_SIZE*FATBUFBLOCKS)
+#define FATBUFSIZE         (mydata->sector_size*FATBUFBLOCKS)
 #define FAT12BUFSIZE   ((FATBUFSIZE*2)/3)
 #define FAT16BUFSIZE   (FATBUFSIZE/2)
 #define FAT32BUFSIZE   (FATBUFSIZE/4)
@@ -182,8 +174,9 @@ typedef struct dir_slot {
  * (see FAT32 accesses)
  */
 typedef struct {
-       __u8    fatbuf[FATBUFSIZE]; /* Current FAT buffer */
+       __u8    *fatbuf; /* Current FAT buffer */
        int     fatsize;        /* Size of FAT in bits */
+       __u16   sector_size;    /* Sector size */
        __u16   fatlength;      /* Length of FAT in sectors */
        __u16   fat_sect;       /* Starting sector of the FAT */
        __u16   rootdir_sect;   /* Start sector of root directory */

diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 2f0bd8c..c24f009 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -30,6 +30,7 @@
 #include <fat.h>
 #include <asm/byteorder.h>
 #include <part.h>
+#include <malloc.h>
 
 /*
  * Convert a string to lowercase.
@@ -67,12 +68,17 @@ int disk_read (__u32 startblock, __u32 getsize, __u8
* bufptr)
 int
 fat_register_device(block_dev_desc_t *dev_desc, int part_no)
 {
-       unsigned char buffer[SECTOR_SIZE];
+       unsigned char *buffer;
        disk_partition_t info;
 
        if (!dev_desc->block_read)
                return -1;
-       cur_dev = dev_desc;
+       cur_dev=dev_desc;
+       
+       buffer = malloc (cur_dev->blksz);
+       if(buffer == NULL)
+               return(-1);
+       
        /* check if we have a MBR (on floppies we have only a PBR) */
        if (dev_desc->block_read (dev_desc->dev, 0, 1, (ulong *)
buffer) != 1)
{
                printf ("** Can't read from device %d **\n",
dev_desc->dev);
@@ -118,6 +124,7 @@ fat_register_device(block_dev_desc_t *dev_desc, int
part_no)
                cur_part = 1;
        }
 #endif
+       free(buffer);
        return 0;
 }
 
@@ -220,12 +227,12 @@ get_fatent(fsdata *mydata, __u32 entry)
 
        /* Read a new block of FAT entries into the cache. */
        if (bufnum != mydata->fatbufnum) {
-               int getsize = FATBUFSIZE/FS_BLOCK_SIZE;
+               int getsize = FATBUFSIZE/mydata->sector_size;
                __u8 *bufptr = mydata->fatbuf;
                __u32 fatlength = mydata->fatlength;
                __u32 startblock = bufnum * FATBUFBLOCKS;
 
-               fatlength *= SECTOR_SIZE;       /* We want it in bytes
now */
+               fatlength *= mydata->sector_size;       /* We want it in
bytes now */
                startblock += mydata->fat_sect; /* Offset from start of
disk */
 
                if (getsize > fatlength) getsize = fatlength;
@@ -300,20 +307,25 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8
*buffer, unsigned long size)
        }
 
        FAT_DPRINT("gc - clustnum: %d, startsect: %d\n", clustnum,
startsect);
-       if (disk_read(startsect, size/FS_BLOCK_SIZE , buffer) < 0) {
+       if (disk_read(startsect, size/mydata->sector_size , buffer) < 0)
{
                FAT_DPRINT("Error reading data\n");
                return -1;
        }
-       if(size % FS_BLOCK_SIZE) {
-               __u8 tmpbuf[FS_BLOCK_SIZE];
-               idx= size/FS_BLOCK_SIZE;
+       if(size % mydata->sector_size) {
+               __u8 * tmpbuf;
+               
+               tmpbuf = (__u8*) malloc(mydata->sector_size);
+               if(tmpbuf == NULL)
+                       return(-1);
+               idx= size/mydata->sector_size;
                if (disk_read(startsect + idx, 1, tmpbuf) < 0) {
                        FAT_DPRINT("Error reading data\n");
                        return -1;
                }
-               buffer += idx*FS_BLOCK_SIZE;
+               buffer += idx*mydata->sector_size;
 
-               memcpy(buffer, tmpbuf, size % FS_BLOCK_SIZE);
+               memcpy(buffer, tmpbuf, size % mydata->sector_size);
+               free(tmpbuf);
                return 0;
        }
 
@@ -331,7 +343,7 @@ get_contents(fsdata *mydata, dir_entry *dentptr,
__u8 *buffer,
             unsigned long maxsize)
 {
        unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
-       unsigned int bytesperclust = mydata->clust_size * SECTOR_SIZE;
+       unsigned int bytesperclust = mydata->clust_size *
mydata->sector_size;
        __u32 curclust = START(dentptr);
        __u32 endclust, newclust;
        unsigned long actsize;
@@ -440,7 +452,7 @@ get_vfatname(fsdata *mydata, int curclust, __u8
*cluster,
 {
        dir_entry *realdent;
        dir_slot  *slotptr = (dir_slot*) retdent;
-       __u8      *nextclust = cluster + mydata->clust_size *
SECTOR_SIZE;
+       __u8      *nextclust = cluster + mydata->clust_size *
mydata->sector_size;
        __u8       counter = (slotptr->id & ~LAST_LONG_ENTRY_MASK) &
0xff;
        int idx = 0;
 
@@ -463,7 +475,7 @@ get_vfatname(fsdata *mydata, int curclust, __u8
*cluster,
                        return -1;
                }
                if (get_cluster(mydata, curclust, get_vfatname_block,
-                               mydata->clust_size * SECTOR_SIZE) != 0)
{
+                               mydata->clust_size *
mydata->sector_size) != 0) {
                        FAT_DPRINT("Error: reading directory block\n");
                        return -1;
                }
@@ -534,7 +546,7 @@ static dir_entry *get_dentfromdir (fsdata * mydata,
int startsect,
        int i;
 
        if (get_cluster (mydata, curclust, get_dentfromdir_block,
-                mydata->clust_size * SECTOR_SIZE) != 0) {
+                       mydata->clust_size * mydata->sector_size) != 0)
{
            FAT_DPRINT ("Error: reading directory block\n");
            return NULL;
        }
@@ -667,9 +679,16 @@ static dir_entry *get_dentfromdir (fsdata * mydata,
int startsect,
 static int
 read_bootsectandvi(boot_sector *bs, volume_info *volinfo, int *fatsize)
 {
-       __u8 block[FS_BLOCK_SIZE];
+       __u8 *block;
        volume_info *vistart;
 
+       if(cur_dev == NULL)
+               return(-1);
+       
+       block = (__u8 *)malloc (cur_dev->blksz);
+       if(block == NULL)
+               return(-1);
+               
        if (disk_read(0, 1, block) < 0) {
                FAT_DPRINT("Error: reading block\n");
                return -1;
@@ -680,6 +699,7 @@ read_bootsectandvi(boot_sector *bs, volume_info
*volinfo, int *fatsize)
        bs->fat_length  = FAT2CPU16(bs->fat_length);
        bs->secs_track  = FAT2CPU16(bs->secs_track);
        bs->heads       = FAT2CPU16(bs->heads);
+       *(__u16 *)bs->sector_size = FAT2CPU16(*(__u16
*)bs->sector_size);
 #if 0 /* UNUSED */
        bs->hidden      = FAT2CPU32(bs->hidden);
 #endif
@@ -704,7 +724,7 @@ read_bootsectandvi(boot_sector *bs, volume_info
*volinfo, int *fatsize)
        /* Terminate fs_type string. Writing past the end of vistart
           is ok - it's just the buffer. */
        vistart->fs_type[8] = '\0';
-
+       free(block);
        if (*fatsize == 32) {
                if (compare_sign(FAT32_SIGN, vistart->fs_type) == 0) {
                        return 0;
@@ -757,6 +777,7 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
        mydata->fatlength = bs.fat_length;
     }
     mydata->fat_sect = bs.reserved;
+    mydata->sector_size = *(__u16 *)bs.sector_size;
     cursect = mydata->rootdir_sect
            = mydata->fat_sect + mydata->fatlength * bs.fats;
     mydata->clust_size = bs.cluster_size;
@@ -766,17 +787,20 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
                - (mydata->clust_size * 2);
     } else {
        rootdir_size = ((bs.dir_entries[1] * (int) 256 +
bs.dir_entries[0])
-                       * sizeof (dir_entry)) / SECTOR_SIZE;
+                       * sizeof (dir_entry)) / mydata->sector_size;
        mydata->data_begin = mydata->rootdir_sect + rootdir_size
                - (mydata->clust_size * 2);
     }
     mydata->fatbufnum = -1;
+    mydata->fatbuf = (__u8 *) malloc (FATBUFSIZE);
+    if(mydata->fatbuf == NULL)
+       return(-1);
 
     FAT_DPRINT ("FAT%d, fatlength: %d\n", mydata->fatsize,
                mydata->fatlength);
     FAT_DPRINT ("Rootdir begins at sector: %d, offset: %x, size: %d\n"
                "Data begins at: %d\n",
-               mydata->rootdir_sect, mydata->rootdir_sect *
SECTOR_SIZE,
+               mydata->rootdir_sect, mydata->rootdir_sect *
mydata->sector_size,
                rootdir_size, mydata->data_begin);
     FAT_DPRINT ("Cluster size: %d\n", mydata->clust_size);
 
@@ -787,8 +811,10 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
     strcpy (fnamecopy, filename);
     downcase (fnamecopy);
     if (*fnamecopy == '\0') {
-       if (!dols)
-           return -1;
+       if (!dols) {
+       free(mydata->fatbuf);
+       return -1;
+       }
        dols = LS_ROOT;
     } else if ((idx = dirdelim (fnamecopy)) >= 0) {
        isdir = 1;
@@ -806,6 +832,7 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
 
        if (disk_read (cursect, mydata->clust_size, do_fat_read_block) <
0) {
            FAT_DPRINT ("Error: reading rootdir block\n");
+           free(mydata->fatbuf);
            return -1;
        }
        dentptr = (dir_entry *) do_fat_read_block;
@@ -856,6 +883,7 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
                    continue;
                }
            } else if (dentptr->name[0] == 0) {
+           free(mydata->fatbuf);
                FAT_DPRINT ("RootDentname == NULL - %d\n", i);
                if (dols == LS_ROOT) {
                    printf ("\n%d file(s), %d dir(s)\n\n", files, dirs);
@@ -906,9 +934,10 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
                dentptr++;
                continue;
            }
-           if (isdir && !(dentptr->attr & ATTR_DIR))
+           if (isdir && !(dentptr->attr & ATTR_DIR)) {
+           free(mydata->fatbuf);       
                return -1;
-
+           }
            FAT_DPRINT ("RootName: %s", s_name);
            FAT_DPRINT (", start: 0x%x", START (dentptr));
            FAT_DPRINT (", size:  0x%x %s\n",
@@ -949,20 +978,23 @@ do_fat_read (const char *filename, void *buffer,
unsigned long maxsize,
 
        if (get_dentfromdir (mydata, startsect, subname, dentptr,
                             isdir ? 0 : dols) == NULL) {
+               free(mydata->fatbuf);
            if (dols && !isdir)
                return 0;
            return -1;
        }
 
        if (idx >= 0) {
-           if (!(dentptr->attr & ATTR_DIR))
-               return -1;
+           if (!(dentptr->attr & ATTR_DIR)) {
+           free(mydata->fatbuf);
+           return -1;
+           }
            subname = nextname;
        }
     }
     ret = get_contents (mydata, dentptr, buffer, maxsize);
     FAT_DPRINT ("Size: %d, got: %ld\n", FAT2CPU32 (dentptr->size),
ret);
-
+    free(mydata->fatbuf);
     return ret;
 }




-- 
Igor Luri
R&D Software Department
Fagor Aotek S. Coop.
P. O. Box 144
E-20500 Mondrag?n-Arrasate
Tel.    ++34 943 71 92 00 
        ++34 943 71 92 01 (Ext. 44268)
Fax.    ++34 943 79 92 03
www.aotek.es

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] FAT on non standard sector size devices
  2008-11-17  8:19 [U-Boot] [PATCH] FAT on non standard sector size devices Igor Luri
@ 2008-11-17 12:30 ` Jerry Van Baren
  2008-11-17 13:34   ` Igor Luri
  0 siblings, 1 reply; 10+ messages in thread
From: Jerry Van Baren @ 2008-11-17 12:30 UTC (permalink / raw)
  To: u-boot

Igor Luri wrote:
> Dear Remy Bohme,
> 
> Sorry, but I don't have experience in email encoding. I have changed
> Evolution's preferences to use ISO-8859-15 intead of UTF-8 caracter
> encoding. If this change does not correct the problem, any help would be
> apretiated.
> 
> Thanks.

Hi Igor,

Your patch is linewrapped.  Try the hints for using Evolution found in 
the linux kernel tree under Documentation/email-clients.txt:
<http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/email-clients.txt;h=a618efab7b156658be70b29c1a6a9b9c4093e0f5;hb=HEAD#l69>

gvb

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] FAT on non standard sector size devices
  2008-11-17 12:30 ` Jerry Van Baren
@ 2008-11-17 13:34   ` Igor Luri
  2008-11-17 19:49     ` Remy Bohmer
  0 siblings, 1 reply; 10+ messages in thread
From: Igor Luri @ 2008-11-17 13:34 UTC (permalink / raw)
  To: u-boot

OK, thanks for your help.

I have followed the hints found on the document suggested and I think this time is going to work the patch, I have sended myself and it works.


Signed-off-by: Igor Luri <iluri@aotek.es>

--- ./Escritorio/Descargas/fat.h	2008-11-10 15:50:57.000000000 +0100
+++ git/u-boot/include/fat.h	2008-11-12 16:59:42.000000000 +0100
@@ -31,20 +31,12 @@
 
 #define CONFIG_SUPPORT_VFAT
 
-#define SECTOR_SIZE FS_BLOCK_SIZE
-
-#define FS_BLOCK_SIZE 512
-
-#if FS_BLOCK_SIZE != SECTOR_SIZE
-#error FS_BLOCK_SIZE != SECTOR_SIZE - This code needs to be fixed!
-#endif
-
 #define MAX_CLUSTSIZE	65536
-#define DIRENTSPERBLOCK	(FS_BLOCK_SIZE/sizeof(dir_entry))
-#define DIRENTSPERCLUST	((mydata->clust_size*SECTOR_SIZE)/sizeof(dir_entry))
+#define DIRENTSPERBLOCK	(mydata->sector_size/sizeof(dir_entry))
+#define DIRENTSPERCLUST	((mydata->clust_size*mydata->sector_size)/sizeof(dir_entry))
 
 #define FATBUFBLOCKS	6
-#define FATBUFSIZE	(FS_BLOCK_SIZE*FATBUFBLOCKS)
+#define FATBUFSIZE	    (mydata->sector_size*FATBUFBLOCKS)
 #define FAT12BUFSIZE	((FATBUFSIZE*2)/3)
 #define FAT16BUFSIZE	(FATBUFSIZE/2)
 #define FAT32BUFSIZE	(FATBUFSIZE/4)
@@ -182,8 +174,9 @@
  * (see FAT32 accesses)
  */
 typedef struct {
-	__u8	fatbuf[FATBUFSIZE]; /* Current FAT buffer */
+	__u8	*fatbuf; /* Current FAT buffer */
 	int	fatsize;	/* Size of FAT in bits */
+	__u16	sector_size;	/* Sector size */
 	__u16	fatlength;	/* Length of FAT in sectors */
 	__u16	fat_sect;	/* Starting sector of the FAT */
 	__u16	rootdir_sect;	/* Start sector of root directory */
--- ./Escritorio/Descargas/fat.c	2008-11-07 17:10:22.000000000 +0100
+++ git/u-boot/fs/fat/fat.c	2008-11-12 17:14:25.000000000 +0100
@@ -30,6 +30,7 @@
 #include <fat.h>
 #include <asm/byteorder.h>
 #include <part.h>
+#include <malloc.h>
 
 /*
  * Convert a string to lowercase.
@@ -67,12 +68,17 @@
 int
 fat_register_device(block_dev_desc_t *dev_desc, int part_no)
 {
-	unsigned char buffer[SECTOR_SIZE];
+	unsigned char *buffer;
 	disk_partition_t info;
 
 	if (!dev_desc->block_read)
 		return -1;
-	cur_dev = dev_desc;
+	cur_dev=dev_desc;
+	
+	buffer = malloc (cur_dev->blksz);
+	if(buffer == NULL)
+	   	return(-1);
+	
 	/* check if we have a MBR (on floppies we have only a PBR) */
 	if (dev_desc->block_read (dev_desc->dev, 0, 1, (ulong *) buffer) != 1) {
 		printf ("** Can't read from device %d **\n", dev_desc->dev);
@@ -118,6 +124,7 @@
 		cur_part = 1;
 	}
 #endif
+	free(buffer);
 	return 0;
 }
 
@@ -220,12 +227,12 @@
 
 	/* Read a new block of FAT entries into the cache. */
 	if (bufnum != mydata->fatbufnum) {
-		int getsize = FATBUFSIZE/FS_BLOCK_SIZE;
+		int getsize = FATBUFSIZE/mydata->sector_size;
 		__u8 *bufptr = mydata->fatbuf;
 		__u32 fatlength = mydata->fatlength;
 		__u32 startblock = bufnum * FATBUFBLOCKS;
 
-		fatlength *= SECTOR_SIZE;	/* We want it in bytes now */
+		fatlength *= mydata->sector_size;	/* We want it in bytes now */
 		startblock += mydata->fat_sect;	/* Offset from start of disk */
 
 		if (getsize > fatlength) getsize = fatlength;
@@ -300,20 +307,25 @@
 	}
 
 	FAT_DPRINT("gc - clustnum: %d, startsect: %d\n", clustnum, startsect);
-	if (disk_read(startsect, size/FS_BLOCK_SIZE , buffer) < 0) {
+	if (disk_read(startsect, size/mydata->sector_size , buffer) < 0) {
 		FAT_DPRINT("Error reading data\n");
 		return -1;
 	}
-	if(size % FS_BLOCK_SIZE) {
-		__u8 tmpbuf[FS_BLOCK_SIZE];
-		idx= size/FS_BLOCK_SIZE;
+	if(size % mydata->sector_size) {
+		__u8 * tmpbuf;
+		
+		tmpbuf = (__u8*) malloc(mydata->sector_size);
+		if(tmpbuf == NULL)
+			return(-1);
+		idx= size/mydata->sector_size;
 		if (disk_read(startsect + idx, 1, tmpbuf) < 0) {
 			FAT_DPRINT("Error reading data\n");
 			return -1;
 		}
-		buffer += idx*FS_BLOCK_SIZE;
+		buffer += idx*mydata->sector_size;
 
-		memcpy(buffer, tmpbuf, size % FS_BLOCK_SIZE);
+		memcpy(buffer, tmpbuf, size % mydata->sector_size);
+		free(tmpbuf);
 		return 0;
 	}
 
@@ -331,7 +343,7 @@
 	     unsigned long maxsize)
 {
 	unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
-	unsigned int bytesperclust = mydata->clust_size * SECTOR_SIZE;
+	unsigned int bytesperclust = mydata->clust_size * mydata->sector_size;
 	__u32 curclust = START(dentptr);
 	__u32 endclust, newclust;
 	unsigned long actsize;
@@ -440,7 +452,7 @@
 {
 	dir_entry *realdent;
 	dir_slot  *slotptr = (dir_slot*) retdent;
-	__u8	  *nextclust = cluster + mydata->clust_size * SECTOR_SIZE;
+	__u8	  *nextclust = cluster + mydata->clust_size * mydata->sector_size;
 	__u8	   counter = (slotptr->id & ~LAST_LONG_ENTRY_MASK) & 0xff;
 	int idx = 0;
 
@@ -463,7 +475,7 @@
 			return -1;
 		}
 		if (get_cluster(mydata, curclust, get_vfatname_block,
-				mydata->clust_size * SECTOR_SIZE) != 0) {
+				mydata->clust_size * mydata->sector_size) != 0) {
 			FAT_DPRINT("Error: reading directory block\n");
 			return -1;
 		}
@@ -534,7 +546,7 @@
 	int i;
 
 	if (get_cluster (mydata, curclust, get_dentfromdir_block,
-		 mydata->clust_size * SECTOR_SIZE) != 0) {
+			mydata->clust_size * mydata->sector_size) != 0) {
 	    FAT_DPRINT ("Error: reading directory block\n");
 	    return NULL;
 	}
@@ -667,9 +679,16 @@
 static int
 read_bootsectandvi(boot_sector *bs, volume_info *volinfo, int *fatsize)
 {
-	__u8 block[FS_BLOCK_SIZE];
+	__u8 *block;
 	volume_info *vistart;
 
+	if(cur_dev == NULL)
+		return(-1);
+	
+	block = (__u8 *)malloc (cur_dev->blksz);
+	if(block == NULL)
+	   	return(-1);
+		
 	if (disk_read(0, 1, block) < 0) {
 		FAT_DPRINT("Error: reading block\n");
 		return -1;
@@ -680,6 +699,7 @@
 	bs->fat_length	= FAT2CPU16(bs->fat_length);
 	bs->secs_track	= FAT2CPU16(bs->secs_track);
 	bs->heads	= FAT2CPU16(bs->heads);
+	*(__u16 *)bs->sector_size = FAT2CPU16(*(__u16 *)bs->sector_size);
 #if 0 /* UNUSED */
 	bs->hidden	= FAT2CPU32(bs->hidden);
 #endif
@@ -704,7 +724,7 @@
 	/* Terminate fs_type string. Writing past the end of vistart
 	   is ok - it's just the buffer. */
 	vistart->fs_type[8] = '\0';
-
+	free(block);
 	if (*fatsize == 32) {
 		if (compare_sign(FAT32_SIGN, vistart->fs_type) == 0) {
 			return 0;
@@ -757,6 +777,7 @@
 	mydata->fatlength = bs.fat_length;
     }
     mydata->fat_sect = bs.reserved;
+    mydata->sector_size = *(__u16 *)bs.sector_size;
     cursect = mydata->rootdir_sect
 	    = mydata->fat_sect + mydata->fatlength * bs.fats;
     mydata->clust_size = bs.cluster_size;
@@ -766,17 +787,20 @@
 		- (mydata->clust_size * 2);
     } else {
 	rootdir_size = ((bs.dir_entries[1] * (int) 256 + bs.dir_entries[0])
-			* sizeof (dir_entry)) / SECTOR_SIZE;
+			* sizeof (dir_entry)) / mydata->sector_size;
 	mydata->data_begin = mydata->rootdir_sect + rootdir_size
 		- (mydata->clust_size * 2);
     }
     mydata->fatbufnum = -1;
+    mydata->fatbuf = (__u8 *) malloc (FATBUFSIZE);
+    if(mydata->fatbuf == NULL)
+    	return(-1);
 
     FAT_DPRINT ("FAT%d, fatlength: %d\n", mydata->fatsize,
 		mydata->fatlength);
     FAT_DPRINT ("Rootdir begins at sector: %d, offset: %x, size: %d\n"
 		"Data begins at: %d\n",
-		mydata->rootdir_sect, mydata->rootdir_sect * SECTOR_SIZE,
+		mydata->rootdir_sect, mydata->rootdir_sect * mydata->sector_size,
 		rootdir_size, mydata->data_begin);
     FAT_DPRINT ("Cluster size: %d\n", mydata->clust_size);
 
@@ -787,8 +811,10 @@
     strcpy (fnamecopy, filename);
     downcase (fnamecopy);
     if (*fnamecopy == '\0') {
-	if (!dols)
-	    return -1;
+	if (!dols) {
+	free(mydata->fatbuf);
+	return -1;
+	}
 	dols = LS_ROOT;
     } else if ((idx = dirdelim (fnamecopy)) >= 0) {
 	isdir = 1;
@@ -806,6 +832,7 @@
 
 	if (disk_read (cursect, mydata->clust_size, do_fat_read_block) < 0) {
 	    FAT_DPRINT ("Error: reading rootdir block\n");
+	    free(mydata->fatbuf);
 	    return -1;
 	}
 	dentptr = (dir_entry *) do_fat_read_block;
@@ -856,6 +883,7 @@
 		    continue;
 		}
 	    } else if (dentptr->name[0] == 0) {
+	    free(mydata->fatbuf);
 		FAT_DPRINT ("RootDentname == NULL - %d\n", i);
 		if (dols == LS_ROOT) {
 		    printf ("\n%d file(s), %d dir(s)\n\n", files, dirs);
@@ -906,9 +934,10 @@
 		dentptr++;
 		continue;
 	    }
-	    if (isdir && !(dentptr->attr & ATTR_DIR))
+	    if (isdir && !(dentptr->attr & ATTR_DIR)) {
+	    free(mydata->fatbuf);	
 		return -1;
-
+	    }
 	    FAT_DPRINT ("RootName: %s", s_name);
 	    FAT_DPRINT (", start: 0x%x", START (dentptr));
 	    FAT_DPRINT (", size:  0x%x %s\n",
@@ -949,20 +978,23 @@
 
 	if (get_dentfromdir (mydata, startsect, subname, dentptr,
 			     isdir ? 0 : dols) == NULL) {
+		free(mydata->fatbuf);
 	    if (dols && !isdir)
 		return 0;
 	    return -1;
 	}
 
 	if (idx >= 0) {
-	    if (!(dentptr->attr & ATTR_DIR))
-		return -1;
+	    if (!(dentptr->attr & ATTR_DIR)) {
+	    free(mydata->fatbuf);
+	    return -1;
+	    }
 	    subname = nextname;
 	}
     }
     ret = get_contents (mydata, dentptr, buffer, maxsize);
     FAT_DPRINT ("Size: %d, got: %ld\n", FAT2CPU32 (dentptr->size), ret);
-
+    free(mydata->fatbuf);
     return ret;
 }
 



El lun, 17-11-2008 a las 07:30 -0500, Jerry Van Baren escribi?:
> Igor Luri wrote:
> > Dear Remy Bohme,
> > 
> > Sorry, but I don't have experience in email encoding. I have changed
> > Evolution's preferences to use ISO-8859-15 intead of UTF-8 caracter
> > encoding. If this change does not correct the problem, any help would be
> > apretiated.
> > 
> > Thanks.
> 
> Hi Igor,
> 
> Your patch is linewrapped.  Try the hints for using Evolution found in 
> the linux kernel tree under Documentation/email-clients.txt:
> <http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/email-clients.txt;h=a618efab7b156658be70b29c1a6a9b9c4093e0f5;hb=HEAD#l69>
> 
> gvb
> 
-- 
Igor Luri
R&D Software Department
Fagor Aotek S. Coop.
P. O. Box 144
E-20500 Mondrag?n-Arrasate
Tel.    ++34 943 71 92 00 
        ++34 943 71 92 01 (Ext. 44268)
Fax.    ++34 943 79 92 03
www.aotek.es

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [U-Boot] [PATCH] FAT on non standard sector size devices
  2008-11-17 13:34   ` Igor Luri
@ 2008-11-17 19:49     ` Remy Bohmer
  0 siblings, 0 replies; 10+ messages in thread
From: Remy Bohmer @ 2008-11-17 19:49 UTC (permalink / raw)
  To: u-boot

Hello Igor,

2008/11/17 Igor Luri <iluri@aotek.es>:
> OK, thanks for your help.
>
> I have followed the hints found on the document suggested and I think this time is going to work the patch, I have sended myself and it works.

For the next time, if you stuck on using Evolution (for example due to
exchange mailservers, or proxy problems etc):
* You can also generate a Berkely mail message via 'quilt mail' and
output to a file
* Import this mail file in the _outbox_ of Evolution... (1 file can
contain a couple of messages at once)
* Finally press the send button... Works flawlessly ;-)

Kind Regards,

Remy


> Signed-off-by: Igor Luri <iluri@aotek.es>
>
> --- ./Escritorio/Descargas/fat.h        2008-11-10 15:50:57.000000000 +0100
> +++ git/u-boot/include/fat.h    2008-11-12 16:59:42.000000000 +0100
> @@ -31,20 +31,12 @@
>
>  #define CONFIG_SUPPORT_VFAT
>
> -#define SECTOR_SIZE FS_BLOCK_SIZE
> -
> -#define FS_BLOCK_SIZE 512
> -
> -#if FS_BLOCK_SIZE != SECTOR_SIZE
> -#error FS_BLOCK_SIZE != SECTOR_SIZE - This code needs to be fixed!
> -#endif
> -
>  #define MAX_CLUSTSIZE  65536
> -#define DIRENTSPERBLOCK        (FS_BLOCK_SIZE/sizeof(dir_entry))
> -#define DIRENTSPERCLUST        ((mydata->clust_size*SECTOR_SIZE)/sizeof(dir_entry))
> +#define DIRENTSPERBLOCK        (mydata->sector_size/sizeof(dir_entry))
> +#define DIRENTSPERCLUST        ((mydata->clust_size*mydata->sector_size)/sizeof(dir_entry))
>
>  #define FATBUFBLOCKS   6
> -#define FATBUFSIZE     (FS_BLOCK_SIZE*FATBUFBLOCKS)
> +#define FATBUFSIZE         (mydata->sector_size*FATBUFBLOCKS)
>  #define FAT12BUFSIZE   ((FATBUFSIZE*2)/3)
>  #define FAT16BUFSIZE   (FATBUFSIZE/2)
>  #define FAT32BUFSIZE   (FATBUFSIZE/4)
> @@ -182,8 +174,9 @@
>  * (see FAT32 accesses)
>  */
>  typedef struct {
> -       __u8    fatbuf[FATBUFSIZE]; /* Current FAT buffer */
> +       __u8    *fatbuf; /* Current FAT buffer */
>        int     fatsize;        /* Size of FAT in bits */
> +       __u16   sector_size;    /* Sector size */
>        __u16   fatlength;      /* Length of FAT in sectors */
>        __u16   fat_sect;       /* Starting sector of the FAT */
>        __u16   rootdir_sect;   /* Start sector of root directory */
> --- ./Escritorio/Descargas/fat.c        2008-11-07 17:10:22.000000000 +0100
> +++ git/u-boot/fs/fat/fat.c     2008-11-12 17:14:25.000000000 +0100
> @@ -30,6 +30,7 @@
>  #include <fat.h>
>  #include <asm/byteorder.h>
>  #include <part.h>
> +#include <malloc.h>
>
>  /*
>  * Convert a string to lowercase.
> @@ -67,12 +68,17 @@
>  int
>  fat_register_device(block_dev_desc_t *dev_desc, int part_no)
>  {
> -       unsigned char buffer[SECTOR_SIZE];
> +       unsigned char *buffer;
>        disk_partition_t info;
>
>        if (!dev_desc->block_read)
>                return -1;
> -       cur_dev = dev_desc;
> +       cur_dev=dev_desc;
> +
> +       buffer = malloc (cur_dev->blksz);
> +       if(buffer == NULL)
> +               return(-1);
> +
>        /* check if we have a MBR (on floppies we have only a PBR) */
>        if (dev_desc->block_read (dev_desc->dev, 0, 1, (ulong *) buffer) != 1) {
>                printf ("** Can't read from device %d **\n", dev_desc->dev);
> @@ -118,6 +124,7 @@
>                cur_part = 1;
>        }
>  #endif
> +       free(buffer);
>        return 0;
>  }
>
> @@ -220,12 +227,12 @@
>
>        /* Read a new block of FAT entries into the cache. */
>        if (bufnum != mydata->fatbufnum) {
> -               int getsize = FATBUFSIZE/FS_BLOCK_SIZE;
> +               int getsize = FATBUFSIZE/mydata->sector_size;
>                __u8 *bufptr = mydata->fatbuf;
>                __u32 fatlength = mydata->fatlength;
>                __u32 startblock = bufnum * FATBUFBLOCKS;
>
> -               fatlength *= SECTOR_SIZE;       /* We want it in bytes now */
> +               fatlength *= mydata->sector_size;       /* We want it in bytes now */
>                startblock += mydata->fat_sect; /* Offset from start of disk */
>
>                if (getsize > fatlength) getsize = fatlength;
> @@ -300,20 +307,25 @@
>        }
>
>        FAT_DPRINT("gc - clustnum: %d, startsect: %d\n", clustnum, startsect);
> -       if (disk_read(startsect, size/FS_BLOCK_SIZE , buffer) < 0) {
> +       if (disk_read(startsect, size/mydata->sector_size , buffer) < 0) {
>                FAT_DPRINT("Error reading data\n");
>                return -1;
>        }
> -       if(size % FS_BLOCK_SIZE) {
> -               __u8 tmpbuf[FS_BLOCK_SIZE];
> -               idx= size/FS_BLOCK_SIZE;
> +       if(size % mydata->sector_size) {
> +               __u8 * tmpbuf;
> +
> +               tmpbuf = (__u8*) malloc(mydata->sector_size);
> +               if(tmpbuf == NULL)
> +                       return(-1);
> +               idx= size/mydata->sector_size;
>                if (disk_read(startsect + idx, 1, tmpbuf) < 0) {
>                        FAT_DPRINT("Error reading data\n");
>                        return -1;
>                }
> -               buffer += idx*FS_BLOCK_SIZE;
> +               buffer += idx*mydata->sector_size;
>
> -               memcpy(buffer, tmpbuf, size % FS_BLOCK_SIZE);
> +               memcpy(buffer, tmpbuf, size % mydata->sector_size);
> +               free(tmpbuf);
>                return 0;
>        }
>
> @@ -331,7 +343,7 @@
>             unsigned long maxsize)
>  {
>        unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
> -       unsigned int bytesperclust = mydata->clust_size * SECTOR_SIZE;
> +       unsigned int bytesperclust = mydata->clust_size * mydata->sector_size;
>        __u32 curclust = START(dentptr);
>        __u32 endclust, newclust;
>        unsigned long actsize;
> @@ -440,7 +452,7 @@
>  {
>        dir_entry *realdent;
>        dir_slot  *slotptr = (dir_slot*) retdent;
> -       __u8      *nextclust = cluster + mydata->clust_size * SECTOR_SIZE;
> +       __u8      *nextclust = cluster + mydata->clust_size * mydata->sector_size;
>        __u8       counter = (slotptr->id & ~LAST_LONG_ENTRY_MASK) & 0xff;
>        int idx = 0;
>
> @@ -463,7 +475,7 @@
>                        return -1;
>                }
>                if (get_cluster(mydata, curclust, get_vfatname_block,
> -                               mydata->clust_size * SECTOR_SIZE) != 0) {
> +                               mydata->clust_size * mydata->sector_size) != 0) {
>                        FAT_DPRINT("Error: reading directory block\n");
>                        return -1;
>                }
> @@ -534,7 +546,7 @@
>        int i;
>
>        if (get_cluster (mydata, curclust, get_dentfromdir_block,
> -                mydata->clust_size * SECTOR_SIZE) != 0) {
> +                       mydata->clust_size * mydata->sector_size) != 0) {
>            FAT_DPRINT ("Error: reading directory block\n");
>            return NULL;
>        }
> @@ -667,9 +679,16 @@
>  static int
>  read_bootsectandvi(boot_sector *bs, volume_info *volinfo, int *fatsize)
>  {
> -       __u8 block[FS_BLOCK_SIZE];
> +       __u8 *block;
>        volume_info *vistart;
>
> +       if(cur_dev == NULL)
> +               return(-1);
> +
> +       block = (__u8 *)malloc (cur_dev->blksz);
> +       if(block == NULL)
> +               return(-1);
> +
>        if (disk_read(0, 1, block) < 0) {
>                FAT_DPRINT("Error: reading block\n");
>                return -1;
> @@ -680,6 +699,7 @@
>        bs->fat_length  = FAT2CPU16(bs->fat_length);
>        bs->secs_track  = FAT2CPU16(bs->secs_track);
>        bs->heads       = FAT2CPU16(bs->heads);
> +       *(__u16 *)bs->sector_size = FAT2CPU16(*(__u16 *)bs->sector_size);
>  #if 0 /* UNUSED */
>        bs->hidden      = FAT2CPU32(bs->hidden);
>  #endif
> @@ -704,7 +724,7 @@
>        /* Terminate fs_type string. Writing past the end of vistart
>           is ok - it's just the buffer. */
>        vistart->fs_type[8] = '\0';
> -
> +       free(block);
>        if (*fatsize == 32) {
>                if (compare_sign(FAT32_SIGN, vistart->fs_type) == 0) {
>                        return 0;
> @@ -757,6 +777,7 @@
>        mydata->fatlength = bs.fat_length;
>     }
>     mydata->fat_sect = bs.reserved;
> +    mydata->sector_size = *(__u16 *)bs.sector_size;
>     cursect = mydata->rootdir_sect
>            = mydata->fat_sect + mydata->fatlength * bs.fats;
>     mydata->clust_size = bs.cluster_size;
> @@ -766,17 +787,20 @@
>                - (mydata->clust_size * 2);
>     } else {
>        rootdir_size = ((bs.dir_entries[1] * (int) 256 + bs.dir_entries[0])
> -                       * sizeof (dir_entry)) / SECTOR_SIZE;
> +                       * sizeof (dir_entry)) / mydata->sector_size;
>        mydata->data_begin = mydata->rootdir_sect + rootdir_size
>                - (mydata->clust_size * 2);
>     }
>     mydata->fatbufnum = -1;
> +    mydata->fatbuf = (__u8 *) malloc (FATBUFSIZE);
> +    if(mydata->fatbuf == NULL)
> +       return(-1);
>
>     FAT_DPRINT ("FAT%d, fatlength: %d\n", mydata->fatsize,
>                mydata->fatlength);
>     FAT_DPRINT ("Rootdir begins at sector: %d, offset: %x, size: %d\n"
>                "Data begins at: %d\n",
> -               mydata->rootdir_sect, mydata->rootdir_sect * SECTOR_SIZE,
> +               mydata->rootdir_sect, mydata->rootdir_sect * mydata->sector_size,
>                rootdir_size, mydata->data_begin);
>     FAT_DPRINT ("Cluster size: %d\n", mydata->clust_size);
>
> @@ -787,8 +811,10 @@
>     strcpy (fnamecopy, filename);
>     downcase (fnamecopy);
>     if (*fnamecopy == '\0') {
> -       if (!dols)
> -           return -1;
> +       if (!dols) {
> +       free(mydata->fatbuf);
> +       return -1;
> +       }
>        dols = LS_ROOT;
>     } else if ((idx = dirdelim (fnamecopy)) >= 0) {
>        isdir = 1;
> @@ -806,6 +832,7 @@
>
>        if (disk_read (cursect, mydata->clust_size, do_fat_read_block) < 0) {
>            FAT_DPRINT ("Error: reading rootdir block\n");
> +           free(mydata->fatbuf);
>            return -1;
>        }
>        dentptr = (dir_entry *) do_fat_read_block;
> @@ -856,6 +883,7 @@
>                    continue;
>                }
>            } else if (dentptr->name[0] == 0) {
> +           free(mydata->fatbuf);
>                FAT_DPRINT ("RootDentname == NULL - %d\n", i);
>                if (dols == LS_ROOT) {
>                    printf ("\n%d file(s), %d dir(s)\n\n", files, dirs);
> @@ -906,9 +934,10 @@
>                dentptr++;
>                continue;
>            }
> -           if (isdir && !(dentptr->attr & ATTR_DIR))
> +           if (isdir && !(dentptr->attr & ATTR_DIR)) {
> +           free(mydata->fatbuf);
>                return -1;
> -
> +           }
>            FAT_DPRINT ("RootName: %s", s_name);
>            FAT_DPRINT (", start: 0x%x", START (dentptr));
>            FAT_DPRINT (", size:  0x%x %s\n",
> @@ -949,20 +978,23 @@
>
>        if (get_dentfromdir (mydata, startsect, subname, dentptr,
>                             isdir ? 0 : dols) == NULL) {
> +               free(mydata->fatbuf);
>            if (dols && !isdir)
>                return 0;
>            return -1;
>        }
>
>        if (idx >= 0) {
> -           if (!(dentptr->attr & ATTR_DIR))
> -               return -1;
> +           if (!(dentptr->attr & ATTR_DIR)) {
> +           free(mydata->fatbuf);
> +           return -1;
> +           }
>            subname = nextname;
>        }
>     }
>     ret = get_contents (mydata, dentptr, buffer, maxsize);
>     FAT_DPRINT ("Size: %d, got: %ld\n", FAT2CPU32 (dentptr->size), ret);
> -
> +    free(mydata->fatbuf);
>     return ret;
>  }
>
>
>
>
> El lun, 17-11-2008 a las 07:30 -0500, Jerry Van Baren escribi?:
>> Igor Luri wrote:
>> > Dear Remy Bohme,
>> >
>> > Sorry, but I don't have experience in email encoding. I have changed
>> > Evolution's preferences to use ISO-8859-15 intead of UTF-8 caracter
>> > encoding. If this change does not correct the problem, any help would be
>> > apretiated.
>> >
>> > Thanks.
>>
>> Hi Igor,
>>
>> Your patch is linewrapped.  Try the hints for using Evolution found in
>> the linux kernel tree under Documentation/email-clients.txt:
>> <http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/email-clients.txt;h=a618efab7b156658be70b29c1a6a9b9c4093e0f5;hb=HEAD#l69>
>>
>> gvb
>>
> --
> Igor Luri
> R&D Software Department
> Fagor Aotek S. Coop.
> P. O. Box 144
> E-20500 Mondrag?n-Arrasate
> Tel.    ++34 943 71 92 00
>        ++34 943 71 92 01 (Ext. 44268)
> Fax.    ++34 943 79 92 03
> www.aotek.es
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2008-11-17 19:49 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-17  8:19 [U-Boot] [PATCH] FAT on non standard sector size devices Igor Luri
2008-11-17 12:30 ` Jerry Van Baren
2008-11-17 13:34   ` Igor Luri
2008-11-17 19:49     ` Remy Bohmer
  -- strict thread matches above, loose matches on Subject: below --
2008-11-12 16:30 Igor Luri
2008-11-12 19:21 ` Remy Bohmer
2008-11-12 22:01 ` Wolfgang Denk
     [not found] <1226492854.5686.8.camel@txema-desktop>
2008-11-12 13:21 ` Igor Luri
2008-11-12 10:09 Igor Luri
2008-11-12 11:25 ` Remy Bohmer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.