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 #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