diff -Naur rockbox-devel/firmware/common/disk.c rockbox-dirty/firmware/common/disk.c
--- rockbox-devel/firmware/common/disk.c	2006-08-31 19:19:35.000000000 +0000
+++ rockbox-dirty/firmware/common/disk.c	2006-10-11 20:17:02.000000000 +0000
@@ -78,6 +78,10 @@
         pinfo[i].type  = ptr[4];
         pinfo[i].start = BYTES2INT32(ptr, 8);
         pinfo[i].size  = BYTES2INT32(ptr, 12);
+#ifdef FAT_2K_SECTORS
+        pinfo[i].start *= 4;
+        pinfo[i].size *= 4;
+#endif
 
         DEBUGF("Part%d: Type %02x, start: %08lx size: %08lx\n",
                i,pinfo[i].type,pinfo[i].start,pinfo[i].size);
diff -Naur rockbox-devel/firmware/drivers/fat.c rockbox-dirty/firmware/drivers/fat.c
--- rockbox-devel/firmware/drivers/fat.c	2006-08-02 15:58:02.000000000 +0000
+++ rockbox-dirty/firmware/drivers/fat.c	2006-10-11 20:30:23.000000000 +0000
@@ -370,6 +370,9 @@
     { /* FAT32 specific part of BPB */
         fat_bpb->bpb_rootclus  = BYTES2INT32(buf,BPB_ROOTCLUS);
         fat_bpb->bpb_fsinfo    = BYTES2INT16(buf,BPB_FSINFO);
+#ifdef FAT_2K_SECTORS
+        fat_bpb->bpb_fsinfo *= 4;
+#endif
         fat_bpb->rootdirsector = cluster2sec(IF_MV2(fat_bpb,) fat_bpb->bpb_rootclus);
     }
 
@@ -506,12 +509,23 @@
 #ifndef HAVE_MULTIVOLUME
     struct bpb* fat_bpb = &fat_bpbs[0];
 #endif
+#ifdef FAT_2K_SECTORS
+#warning PATCHED
+    if(fat_bpb->bpb_bytspersec != 2048)
+    {
+        DEBUGF( "bpb_is_sane() - Error: sector size is not 2048 (%d)\n",
+                fat_bpb->bpb_bytspersec);
+        return -1;
+    }
+#else
+#warning NOT PATCHED
     if(fat_bpb->bpb_bytspersec != 512)
     {
         DEBUGF( "bpb_is_sane() - Error: sector size is not 512 (%d)\n",
                 fat_bpb->bpb_bytspersec);
         return -1;
     }
+#endif
     if((long)fat_bpb->bpb_secperclus * (long)fat_bpb->bpb_bytspersec > 128L*1024L)
     {
         DEBUGF( "bpb_is_sane() - Error: cluster size is larger than 128K "
@@ -564,9 +578,16 @@
 #endif
 
     /* Write to the first FAT */
+#ifdef FAT_2K_SECTORS
+    rc = ata_write_sectors(IF_MV2(fce->fat_vol->drive,)
+                           secnum * 4, 4,
+                           sectorbuf);
+#else
     rc = ata_write_sectors(IF_MV2(fce->fat_vol->drive,)
                            secnum, 1,
                            sectorbuf);
+#endif
+
     if(rc < 0)
     {
         panicf("flush_fat_sector() - Could not write sector %ld"
@@ -585,8 +606,13 @@
 #else
         secnum += fat_bpbs[0].fatsize;
 #endif
+#ifdef FAT_2K_SECTORS
+        rc = ata_write_sectors(IF_MV2(fce->fat_vol->drive,)
+                               secnum * 4, 4, sectorbuf);
+#else
         rc = ata_write_sectors(IF_MV2(fce->fat_vol->drive,)
                                secnum, 1, sectorbuf);
+#endif
         if(rc < 0)
         {
             panicf("flush_fat_sector() - Could not write sector %ld"
@@ -631,9 +657,15 @@
     /* Load the sector if it is not cached */
     if(!fce->inuse)
     {
+#ifdef FAT_2K_SECTORS
+        rc = ata_read_sectors(IF_MV2(fat_bpb->drive,)
+                              (secnum * 4) + fat_bpb->startsector,4,
+                              sectorbuf);
+#else
         rc = ata_read_sectors(IF_MV2(fat_bpb->drive,)
                               secnum + fat_bpb->startsector,1,
                               sectorbuf);
+#endif
         if(rc < 0)
         {
             DEBUGF( "cache_fat_sector() - Could not read sector %ld"
@@ -1933,6 +1965,11 @@
     struct bpb* fat_bpb = &fat_bpbs[0];
 #endif
     int rc;
+    
+#ifdef FAT_2K_SECTORS
+    start *= 4;
+    count *= 4;
+#endif
 
     LDEBUGF("transfer(s=%lx, c=%lx, %s)\n",
         start+ fat_bpb->startsector, count, write?"write":"read");
@@ -2041,7 +2078,11 @@
             first = sector;
 
         if ( ((sector != first) && (sector != last+1)) || /* not sequential */
+#ifdef FAT_2K_SECTORS
+             (last-first+1 == 64) ) { /* 64 virt. sectors are 256 real ones */
+#else
              (last-first+1 == 256) ) { /* max 256 sectors per ata request */
+#endif
             long count = last - first + 1;
             rc = transfer(IF_MV2(fat_bpb,) first, count, buf, write );
             if (rc < 0)
diff -Naur rockbox-devel/firmware/export/fat.h rockbox-dirty/firmware/export/fat.h
--- rockbox-devel/firmware/export/fat.h	2006-07-31 22:59:45.000000000 +0000
+++ rockbox-dirty/firmware/export/fat.h	2006-10-11 20:17:02.000000000 +0000
@@ -22,8 +22,13 @@
 
 #include <stdbool.h>
 #include "ata.h" /* for volume definitions */
+#include "config.h" /* for FAT_2K_SECTORS or not */
 
+#ifdef FAT_2K_SECTORS
+#define SECTOR_SIZE 2048
+#else
 #define SECTOR_SIZE 512
+#endif
 
 /* Number of bytes reserved for a file name (including the trailing \0).
    Since names are stored in the entry as UTF-8, we won't be able to
