Skip to content

Commit

Permalink
fix: reduce file system corruption from standalone Lua scripts (#5148)
Browse files Browse the repository at this point in the history
Standalone Lua such as the DSM Forward Programming tool do a lot of file
system writing (logging) and appears to overrun some buffer in FafFs,
writing file data right into the FAT, thus corrupting the file system. 

Using FF_FS_TINY=1 seems to mitigate this significantly, but does not 
appear to completely resolve this.
  • Loading branch information
3djc authored and pfeerick committed Jun 21, 2024
1 parent caa9880 commit ff464bd
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 16 deletions.
24 changes: 9 additions & 15 deletions radio/src/targets/common/arm/stm32/diskio_sdio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,15 +263,12 @@ static DRESULT sdio_read(BYTE lun, BYTE * buff, DWORD sector, UINT count)
res = _read_dma(buff, sector, count);
if (res != RES_OK) return res;

uint32_t timeout = HAL_GetTick();
while((HAL_GetTick() - timeout) < SD_TIMEOUT) {
if (sdio_check_card_state() == SD_TRANSFER_OK) {
return RES_OK;
}
if (sdio_check_card_state_with_timeout(SD_TIMEOUT) < 0) {
TRACE("SD getstatus timeout, s:%u c:%u", sector, (uint32_t)count);
return RES_ERROR;
}

TRACE("SD getstatus timeout, s:%u c:%u", sector, (uint32_t)count);
return RES_ERROR;
return RES_OK;
}

static DRESULT _write_dma(const BYTE *buff, DWORD sector, UINT count)
Expand Down Expand Up @@ -322,16 +319,13 @@ static DRESULT sdio_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)

res = _write_dma(buff, sector, count);
if (res != RES_OK) return res;

uint32_t timeout = HAL_GetTick();
while((HAL_GetTick() - timeout) < SD_TIMEOUT) {
if (sdio_check_card_state() == SD_TRANSFER_OK) {
return RES_OK;
}

if (sdio_check_card_state_with_timeout(SD_TIMEOUT) < 0) {
TRACE("SD getstatus timeout, s:%u c: %u", sector, (uint32_t)count);
return RES_ERROR;
}

TRACE("SD getstatus timeout, s:%u c: %u", sector, (uint32_t)count);
return RES_ERROR;
return RES_OK;
}

static DRESULT sdio_get_sector_count(DWORD* sectors)
Expand Down
2 changes: 1 addition & 1 deletion radio/src/thirdparty/FatFs/ffconf.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@
/ System Configurations
/---------------------------------------------------------------------------*/

#define FF_FS_TINY 0
#define FF_FS_TINY 1
/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.
/ Instead of private sector buffer eliminated from the file object, common sector
Expand Down

0 comments on commit ff464bd

Please sign in to comment.