projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos: seek forward on FAT cluster chain instead of restarting
[fw/altos]
/
src
/
drivers
/
ao_fat.c
diff --git
a/src/drivers/ao_fat.c
b/src/drivers/ao_fat.c
index 65c5ea7cb6f449da95b68ff9bb7f242b9bb5d4c1..98f57d674c6c3e3cd647422b65972d6db9db8885 100644
(file)
--- a/
src/drivers/ao_fat.c
+++ b/
src/drivers/ao_fat.c
@@
-375,10
+375,20
@@
ao_fat_current_sector(void)
sector_offset = ao_file_offset >> SECTOR_SHIFT;
sector_offset = ao_file_offset >> SECTOR_SHIFT;
- if (!ao_file_cluster) {
+ if (!ao_file_cluster || ao_file_offset < ao_file_cluster_offset) {
+ ao_file_cluster = ao_file_dirent.cluster;
+ ao_file_cluster_offset = 0;
+ }
+
+ if (ao_file_cluster_offset + bytes_per_cluster <= ao_file_offset) {
+ uint16_t cluster_distance;
+
cluster_offset = sector_offset / sectors_per_cluster;
cluster_offset = sector_offset / sectors_per_cluster;
- cluster = ao_fat_cluster_seek(ao_file_dirent.cluster, cluster_offset);
+ cluster_distance = cluster_offset - ao_file_cluster_offset / bytes_per_cluster;
+
+ cluster = ao_fat_cluster_seek(ao_file_cluster, cluster_distance);
+
if (!ao_fat_cluster_valid(cluster))
return 0xffffffff;
ao_file_cluster = cluster;
if (!ao_fat_cluster_valid(cluster))
return 0xffffffff;
ao_file_cluster = cluster;
@@
-392,16
+402,6
@@
ao_fat_current_sector(void)
static void
ao_fat_set_offset(uint32_t offset)
{
static void
ao_fat_set_offset(uint32_t offset)
{
-
- if (offset == 0) {
- ao_file_cluster = ao_file_dirent.cluster;
- ao_file_cluster_offset = 0;
- }
- else if (offset < ao_file_cluster_offset ||
- ao_file_cluster_offset + bytes_per_cluster <= offset)
- {
- ao_file_cluster = 0;
- }
ao_file_offset = offset;
}
ao_file_offset = offset;
}