41 #ifndef FAT_BUFFER_SECTORS
42 #define FAT_BUFFER_SECTORS 1
45 #if FAT_BUFFERS < 1 || FAT_BUFFER_SECTORS < 1
46 #error "FAT_BUFFERS & FAT_BUFFER_SECTORS must be at least 1"
52 #define FAT32_GET_32BIT_WORD(pbuf, location) ( GET_32BIT_WORD(pbuf->ptr, location) )
53 #define FAT32_SET_32BIT_WORD(pbuf, location, value) { SET_32BIT_WORD(pbuf->ptr, location, value); pbuf->dirty = 1; }
54 #define FAT16_GET_16BIT_WORD(pbuf, location) ( GET_16BIT_WORD(pbuf->ptr, location) )
55 #define FAT16_SET_16BIT_WORD(pbuf, location, value) { SET_16BIT_WORD(pbuf->ptr, location, value); pbuf->dirty = 1; }
65 fs->fat_buffer_head =
NULL;
71 fs->fat_buffers[i].dirty = 0;
72 memset(
fs->fat_buffers[i].sector, 0x00,
sizeof(
fs->fat_buffers[i].sector));
73 fs->fat_buffers[i].ptr =
NULL;
76 fs->fat_buffers[i].next =
fs->fat_buffer_head;
77 fs->fat_buffer_head = &
fs->fat_buffers[i];
90 if (
fs->disk_io.write_media)
99 sectors =
fs->fat_sectors - offset;
136 fs->fat_buffer_head =
NULL;
154 pcur->
next =
fs->fat_buffer_head;
155 fs->fat_buffer_head = pcur;
159 if (!fatfs_fat_writeback(
fs, pcur))
188 if (!fatfs_fat_writeback(
fs, pcur))
207 uint32 fat_sector_offset, position;
212 if (current_cluster == 0)
217 fat_sector_offset = current_cluster / 256;
219 fat_sector_offset = current_cluster / 128;
222 pbuf = fatfs_fat_read_sector(
fs,
fs->fat_begin_lba+fat_sector_offset);
229 position = (current_cluster - (fat_sector_offset * 256)) * 2;
235 if (nextcluster >= 0xFFF8 && nextcluster <= 0xFFFF)
241 position = (current_cluster - (fat_sector_offset * 128)) * 4;
247 nextcluster = nextcluster & 0x0FFFFFFF;
250 if (nextcluster >= 0x0FFFFFF8 && nextcluster <= 0x0FFFFFFF)
255 return (nextcluster);
273 fs->next_free_cluster = newValue;
276 if (
fs->disk_io.write_media)
277 fs->disk_io.write_media(
pbuf->address,
pbuf->sector, 1);
287 #if FATFS_INC_WRITE_SUPPORT
290 uint32 fat_sector_offset, position;
292 uint32 current_cluster = start_cluster;
299 fat_sector_offset = current_cluster / 256;
301 fat_sector_offset = current_cluster / 128;
303 if ( fat_sector_offset < fs->fat_sectors)
306 pbuf = fatfs_fat_read_sector(
fs,
fs->fat_begin_lba+fat_sector_offset);
313 position = (current_cluster - (fat_sector_offset * 256)) * 2;
321 position = (current_cluster - (fat_sector_offset * 128)) * 4;
327 nextcluster = nextcluster & 0x0FFFFFFF;
330 if (nextcluster !=0 )
337 while (nextcluster != 0x0);
340 *free_cluster = current_cluster;
348 #if FATFS_INC_WRITE_SUPPORT
352 uint32 fat_sector_offset, position;
356 fat_sector_offset = cluster / 256;
358 fat_sector_offset = cluster / 128;
361 pbuf = fatfs_fat_read_sector(
fs,
fs->fat_begin_lba+fat_sector_offset);
368 position = (cluster - (fat_sector_offset * 256)) * 2;
376 position = (cluster - (fat_sector_offset * 128)) * 4;
388 #if FATFS_INC_WRITE_SUPPORT
392 uint32 next_cluster = start_cluster;
397 last_cluster = next_cluster;
413 #if FATFS_INC_WRITE_SUPPORT
417 uint32 next_cluster = start_cluster;
425 last_cluster = next_cluster;
451 for (i = 0; i <
fs->fat_sectors; i++)
454 pbuf = fatfs_fat_read_sector(
fs,
fs->fat_begin_lba + i);