summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/common/file.c14
-rw-r--r--firmware/drivers/fat.c62
2 files changed, 31 insertions, 45 deletions
diff --git a/firmware/common/file.c b/firmware/common/file.c
index 3e730c2880..ae5560407b 100644
--- a/firmware/common/file.c
+++ b/firmware/common/file.c
@@ -363,13 +363,15 @@ int lseek(int fd, int offset, int whence)
363 return -4; 363 return -4;
364 } 364 }
365 } 365 }
366 rc = fat_readwrite(&(openfiles[fd].fatfile), 1, 366 if ( sectoroffset ) {
367 &(openfiles[fd].cache),false); 367 rc = fat_readwrite(&(openfiles[fd].fatfile), 1,
368 if ( rc < 0 ) { 368 &(openfiles[fd].cache),false);
369 errno = EIO; 369 if ( rc < 0 ) {
370 return -5; 370 errno = EIO;
371 return -5;
372 }
373 openfiles[fd].cacheoffset = sectoroffset;
371 } 374 }
372 openfiles[fd].cacheoffset = sectoroffset;
373 } 375 }
374 else 376 else
375 if ( openfiles[fd].cacheoffset != -1 ) 377 if ( openfiles[fd].cacheoffset != -1 )
diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c
index 884311c1f5..6f6873b65e 100644
--- a/firmware/drivers/fat.c
+++ b/firmware/drivers/fat.c
@@ -1102,7 +1102,7 @@ static bool transfer( int start, int count, char* buf, bool write )
1102{ 1102{
1103 int err; 1103 int err;
1104 1104
1105 LDEBUGF("transfer(s=%x, c=%x)\n",start, count); 1105 LDEBUGF("transfer(s=%x, c=%x, %s)\n",start, count, write?"write":"read");
1106 if (write) 1106 if (write)
1107 err = ata_write_sectors(start, count, buf); 1107 err = ata_write_sectors(start, count, buf);
1108 else 1108 else
@@ -1126,9 +1126,9 @@ int fat_readwrite( struct fat_file *file, int sectorcount,
1126 int first=0, last=0; 1126 int first=0, last=0;
1127 int i; 1127 int i;
1128 1128
1129 LDEBUGF( "fat_write(file:%x,count:%d,buf:%x)\n", 1129 LDEBUGF( "fat_readwrite(file:%x,count:0x%x,buf:%x,%s)\n",
1130 cluster,sectorcount,buf); 1130 cluster,sectorcount,buf,write?"write":"read");
1131 LDEBUGF( "fat_write: c=%x s=%x n=%d\n", cluster,sector,numsec); 1131 LDEBUGF( "fat_readwrite: sec=%x numsec=%d\n", sector,numsec);
1132 if ( sector == -1 ) 1132 if ( sector == -1 )
1133 return 0; 1133 return 0;
1134 1134
@@ -1176,15 +1176,11 @@ int fat_readwrite( struct fat_file *file, int sectorcount,
1176 first = sector; 1176 first = sector;
1177 } 1177 }
1178 else { 1178 else {
1179 /* last sector requested */ 1179 if (i == sectorcount-1) { /* last sector requested */
1180 if (i >= sectorcount-1) {
1181 int count = sector - first + 1; 1180 int count = sector - first + 1;
1182 if (!transfer( first + fat_bpb.startsector, 1181 if (!transfer( first + fat_bpb.startsector,
1183 count, buf, write )) 1182 count, buf, write ))
1184 return -2; 1183 return -2;
1185
1186 ((char*)buf) += count * SECTOR_SIZE;
1187 first = sector;
1188 } 1184 }
1189 } 1185 }
1190 1186
@@ -1204,43 +1200,31 @@ int fat_readwrite( struct fat_file *file, int sectorcount,
1204 1200
1205int fat_seek(struct fat_file *file, int seeksector ) 1201int fat_seek(struct fat_file *file, int seeksector )
1206{ 1202{
1203 int clusternum, sectornum, sector;
1207 int cluster = file->firstcluster; 1204 int cluster = file->firstcluster;
1208 int sector = cluster2sec(cluster);
1209 int numsec = 0;
1210 int i; 1205 int i;
1211 1206
1212 if ( seeksector ) { 1207 seeksector--;
1213 for (i=0; i<seeksector; i++) { 1208 clusternum = seeksector / fat_bpb.bpb_secperclus;
1214 numsec++; 1209 sectornum = seeksector % fat_bpb.bpb_secperclus;
1215 if ( numsec >= fat_bpb.bpb_secperclus ) { 1210
1216 cluster = get_next_cluster(cluster); 1211 for (i=0; i<clusternum; i++) {
1217 if (!cluster) 1212 cluster = get_next_cluster(cluster);
1218 { 1213 if (!cluster) {
1219 /* end of file */ 1214 sector = -1;
1220 if (i == (seeksector-1)) 1215 break;
1221 {
1222 /* seeksector is last sector in file */
1223 sector = -1;
1224 break;
1225 }
1226 else
1227 /* attempting to seek beyond end of file */
1228 return -1;
1229 }
1230
1231 sector = cluster2sec(cluster);
1232 if (sector<0)
1233 return -2;
1234 numsec=0;
1235 }
1236 else
1237 sector++;
1238 } 1216 }
1239 } 1217 }
1240 1218
1219 if ( sector > -1 )
1220 sector = cluster2sec(cluster) + sectornum;
1221
1222 LDEBUGF("fat_seek(%x) == %x, %x, %x\n",
1223 seeksector, cluster, sector, sectornum);
1224
1241 file->lastcluster = cluster; 1225 file->lastcluster = cluster;
1242 file->lastsector = sector; 1226 file->lastsector = sector;
1243 file->sectornum = numsec; 1227 file->sectornum = sectornum + 1;
1244 return 0; 1228 return 0;
1245} 1229}
1246 1230