diff -Naur rockbox-daily-20061015/firmware/common/disk.c rockbox-daily-20061015-patched/firmware/common/disk.c
--- rockbox-daily-20061015/firmware/common/disk.c	2006-09-01 04:00:35.000000000 +0000
+++ rockbox-daily-20061015-patched/firmware/common/disk.c	2006-10-16 01:14:12.000000000 +0000
@@ -76,8 +76,8 @@
     for ( i=0; i<4; i++ ) {
         unsigned char* ptr = sector + 0x1be + 16*i;
         pinfo[i].type  = ptr[4];
-        pinfo[i].start = BYTES2INT32(ptr, 8);
-        pinfo[i].size  = BYTES2INT32(ptr, 12);
+        pinfo[i].start = BYTES2INT32(ptr, 8) * SECTOR_MULT;
+        pinfo[i].size  = BYTES2INT32(ptr, 12) * SECTOR_MULT;
 
         DEBUGF("Part%d: Type %02x, start: %08lx size: %08lx\n",
                i,pinfo[i].type,pinfo[i].start,pinfo[i].size);
diff -Naur rockbox-daily-20061015/firmware/drivers/fat.c rockbox-daily-20061015-patched/firmware/drivers/fat.c
--- rockbox-daily-20061015/firmware/drivers/fat.c	2006-08-03 04:00:35.000000000 +0000
+++ rockbox-daily-20061015-patched/firmware/drivers/fat.c	2006-10-16 01:14:12.000000000 +0000
@@ -233,9 +233,11 @@
 #endif
     struct bpb* fat_bpb = &fat_bpbs[volume];
     if (size)
-      *size = fat_bpb->dataclusters * fat_bpb->bpb_secperclus / 2;
+      *size = (fat_bpb->dataclusters * fat_bpb->bpb_secperclus 
+                * SECTOR_SIZE) / 1024;
     if (free)
-      *free = fat_bpb->fsinfo.freecount * fat_bpb->bpb_secperclus / 2;
+      *free = (fat_bpb->fsinfo.freecount * fat_bpb->bpb_secperclus
+                * SECTOR_SIZE) / 1024;
 }
 
 void fat_init(void)
@@ -391,7 +393,7 @@
     {
         /* Read the fsinfo sector */
         rc = ata_read_sectors(IF_MV2(drive,) 
-            startsector + fat_bpb->bpb_fsinfo, 1, buf);
+            startsector + (fat_bpb->bpb_fsinfo * SECTOR_MULT), 1, buf);
         if (rc < 0)
         {
             DEBUGF( "fat_mount() - Couldn't read FSInfo (error code %d)\n", rc);
@@ -506,12 +508,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 "
@@ -558,14 +571,14 @@
 
     /* With multivolume, use only the FAT info from the cached sector! */
 #ifdef HAVE_MULTIVOLUME
-    secnum = fce->secnum + fce->fat_vol->startsector;
+    secnum = (fce->secnum * SECTOR_MULT) + fce->fat_vol->startsector;
 #else
-    secnum = fce->secnum + fat_bpbs[0].startsector;
+    secnum = (fce->secnum * SECTOR_MULT) + fat_bpbs[0].startsector;
 #endif
 
     /* Write to the first FAT */
     rc = ata_write_sectors(IF_MV2(fce->fat_vol->drive,)
-                           secnum, 1,
+                           secnum, SECTOR_MULT,
                            sectorbuf);
     if(rc < 0)
     {
@@ -581,12 +594,12 @@
     {
         /* Write to the second FAT */
 #ifdef HAVE_MULTIVOLUME
-        secnum += fce->fat_vol->fatsize;
+        secnum += fce->fat_vol->fatsize * SECTOR_MULT;
 #else
-        secnum += fat_bpbs[0].fatsize;
+        secnum += fat_bpbs[0].fatsize * SECTOR_MULT;
 #endif
         rc = ata_write_sectors(IF_MV2(fce->fat_vol->drive,)
-                               secnum, 1, sectorbuf);
+                               secnum, SECTOR_MULT, sectorbuf);
         if(rc < 0)
         {
             panicf("flush_fat_sector() - Could not write sector %ld"
@@ -632,8 +645,8 @@
     if(!fce->inuse)
     {
         rc = ata_read_sectors(IF_MV2(fat_bpb->drive,)
-                              secnum + fat_bpb->startsector,1,
-                              sectorbuf);
+                              (secnum * SECTOR_MULT) + fat_bpb->startsector,
+                              SECTOR_MULT, sectorbuf);
         if(rc < 0)
         {
             DEBUGF( "cache_fat_sector() - Could not read sector %ld"
@@ -887,7 +900,8 @@
     
     /* update fsinfo */
     rc = ata_read_sectors(IF_MV2(fat_bpb->drive,) 
-                          fat_bpb->startsector + fat_bpb->bpb_fsinfo, 1,fsinfo);
+                          fat_bpb->startsector + 
+                            (fat_bpb->bpb_fsinfo * SECTOR_MULT), 1, fsinfo);
     if (rc < 0)
     {
         DEBUGF( "flush_fat() - Couldn't read FSInfo (error code %d)\n", rc);
@@ -900,7 +914,8 @@
     *intptr = htole32(fat_bpb->fsinfo.nextfree);
 
     rc = ata_write_sectors(IF_MV2(fat_bpb->drive,)
-                           fat_bpb->startsector + fat_bpb->bpb_fsinfo,1,fsinfo);
+                           fat_bpb->startsector + 
+                             (fat_bpb->bpb_fsinfo*SECTOR_MULT), 1, fsinfo);
     if (rc < 0)
     {
         DEBUGF( "flush_fat() - Couldn't write FSInfo (error code %d)\n", rc);
@@ -1933,6 +1948,9 @@
     struct bpb* fat_bpb = &fat_bpbs[0];
 #endif
     int rc;
+    
+    start *= SECTOR_MULT;
+    count *= SECTOR_MULT;
 
     LDEBUGF("transfer(s=%lx, c=%lx, %s)\n",
         start+ fat_bpb->startsector, count, write?"write":"read");
@@ -1945,9 +1963,9 @@
 #endif
             firstallowed = fat_bpb->firstdatasector;
             
-        if (start < firstallowed)
+        if (start < (firstallowed * SECTOR_MULT))
             panicf("Write %ld before data\n", firstallowed - start);
-        if (start + count > fat_bpb->totalsectors)
+        if (start + count > (fat_bpb->totalsectors * SECTOR_MULT))
             panicf("Write %ld after data\n",
                 start + count - fat_bpb->totalsectors);
         rc = ata_write_sectors(IF_MV2(fat_bpb->drive,)
@@ -2041,7 +2059,8 @@
             first = sector;
 
         if ( ((sector != first) && (sector != last+1)) || /* not sequential */
-             (last-first+1 == 256) ) { /* max 256 sectors per ata request */
+             (last-first+1 == (256 / SECTOR_MULT)) ) { 
+                                         /* max 256 sectors per ata request */
             long count = last - first + 1;
             rc = transfer(IF_MV2(fat_bpb,) first, count, buf, write );
             if (rc < 0)
diff -Naur rockbox-daily-20061015/firmware/export/fat.h rockbox-daily-20061015-patched/firmware/export/fat.h
--- rockbox-daily-20061015/firmware/export/fat.h	2006-08-01 04:00:30.000000000 +0000
+++ rockbox-daily-20061015-patched/firmware/export/fat.h	2006-10-16 01:14:12.000000000 +0000
@@ -22,8 +22,18 @@
 
 #include <stdbool.h>
 #include "ata.h" /* for volume definitions */
+#include "config.h" /* for FAT_2K_SECTORS or not */
 
+/* SECTOR_MULT is how many physical sectors there are
+ * per logical sector.
+ */
+#ifdef FAT_2K_SECTORS
+#define SECTOR_SIZE 2048
+#define SECTOR_MULT 4
+#else
 #define SECTOR_SIZE 512
+#define SECTOR_MULT 1
+#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
diff -Naur rockbox-daily-20061015/tools/configure rockbox-daily-20061015-patched/tools/configure
--- rockbox-daily-20061015/tools/configure	2006-10-07 04:01:53.000000000 +0000
+++ rockbox-daily-20061015-patched/tools/configure	2006-10-16 01:57:51.000000000 +0000
@@ -1341,6 +1341,8 @@
    the sound-playing code in the X11 sim */
 @SIMSOUND@
 
+#define FAT_2K_SECTORS
+
 #endif /* __BUILD_AUTOCONF_H */
 EOF
 
diff -Naur rockbox-daily-20061015/tools/ipod_fw.c rockbox-daily-20061015-patched/tools/ipod_fw.c
--- rockbox-daily-20061015/tools/ipod_fw.c	2006-01-16 05:00:44.000000000 +0000
+++ rockbox-daily-20061015-patched/tools/ipod_fw.c	2006-10-16 02:00:57.000000000 +0000
@@ -35,8 +35,8 @@
 #define TBL 0x4200
 
 /* Some firmwares have padding becore the actual image.  */
-#define IMAGE_PADDING ((fw_version == 3) ? 0x200 : 0)
-#define FIRST_OFFSET (TBL + 0x200 + IMAGE_PADDING)
+#define IMAGE_PADDING ((fw_version == 3) ? 0x800 : 0)
+#define FIRST_OFFSET (TBL + 0x600 + IMAGE_PADDING)
 
 int be;
 unsigned short fw_version = 2;
@@ -272,7 +272,7 @@
 	{ '!', 'A', 'T', 'A' },	    // magic
 	0x6f736f73,		    // id
 	{ '\0', '\0', '\0', '\0' }, // pad
-	0x4400,			    // devOffset
+	0x4800,			    // devOffset
 	0,			    // len
 	0x28000000,		    // addr
 	0,			    // entry
