summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <thach@tinyusb.org>2018-07-05 17:43:38 +0700
committerhathach <thach@tinyusb.org>2018-07-05 17:43:38 +0700
commit0806c0a38b9da03cbb1d55dd689f1798b4619339 (patch)
treebc2837fbe7c8c3e77669566883b1dc9ff3c90f64
parent4e5d9a029df28be188fc4a433bccfa85aa495e63 (diff)
update fatfs cached sector when running write10
-rw-r--r--ports/nrf/usb/usb_msc_flash.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/ports/nrf/usb/usb_msc_flash.c b/ports/nrf/usb/usb_msc_flash.c
index dc88d031c..9c7445050 100644
--- a/ports/nrf/usb/usb_msc_flash.c
+++ b/ports/nrf/usb/usb_msc_flash.c
@@ -39,6 +39,12 @@
#include "tusb.h"
#include "internal_flash.h"
+// For updating fatfs's cache
+#include "extmod/vfs.h"
+#include "extmod/vfs_fat.h"
+#include "lib/oofatfs/ff.h"
+#include "py/mpstate.h"
+
/*------------------------------------------------------------------*/
/* MACRO TYPEDEF CONSTANT ENUM
*------------------------------------------------------------------*/
@@ -159,6 +165,13 @@ int32_t tud_msc_write10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t
// bufsize <= CFG_TUD_MSC_BUFSIZE (4096)
internal_flash_write_blocks(buffer, lba, block_count);
+ // update fatfs's cache if address matches
+ fs_user_mount_t* vfs = MP_STATE_VM(vfs_mount_table)->obj;
+
+ if ( (lba <= vfs->fatfs.winsect) && (vfs->fatfs.winsect <= (lba + bufsize/MSC_FLASH_BLOCK_SIZE)) ) {
+ memcpy(vfs->fatfs.win, buffer + MSC_FLASH_BLOCK_SIZE*(vfs->fatfs.winsect-lba), MSC_FLASH_BLOCK_SIZE);
+ }
+
return block_count*MSC_FLASH_BLOCK_SIZE;
}