FatFS: use rtc for timestamping (#2555)

* fatfs: use rtc
* fatfs: removed duplicate get_fattime declaration
* pvs: fixed warnings for fatfs timestamp
* fatfs: fixed seconds packing
* FuriHal: critical section around RTC datetime access
* FatFS: remove unused configration defines, update documentation
* FuriHal: checks instead of assets in RTC

---------

Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
hedger 2023-04-01 17:50:30 +04:00 committed by GitHub
parent ae3a3d6336
commit f192ccce2c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 17 additions and 11 deletions

View File

@ -1,4 +1,5 @@
#include "fatfs.h" #include "fatfs.h"
#include "furi_hal_rtc.h"
/** logical drive path */ /** logical drive path */
char fatfs_path[4]; char fatfs_path[4];
@ -9,11 +10,14 @@ void fatfs_init(void) {
FATFS_LinkDriver(&sd_fatfs_driver, fatfs_path); FATFS_LinkDriver(&sd_fatfs_driver, fatfs_path);
} }
/** /** Gets Time from RTC
* @brief Gets Time from RTC *
* @param None * @return Time in DWORD (toasters per square washing machine)
* @retval Time in DWORD
*/ */
DWORD get_fattime(void) { DWORD get_fattime() {
return 0; FuriHalRtcDateTime furi_time;
furi_hal_rtc_get_datetime(&furi_time);
return ((uint32_t)(furi_time.year - 1980) << 25) | furi_time.month << 21 |
furi_time.day << 16 | furi_time.hour << 11 | furi_time.minute << 5 | furi_time.second;
} }

View File

@ -219,10 +219,7 @@
/ When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1) / When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1)
/ Note that enabling exFAT discards C89 compatibility. */ / Note that enabling exFAT discards C89 compatibility. */
#define _FS_NORTC 1 #define _FS_NORTC 0
#define _NORTC_MON 7
#define _NORTC_MDAY 20
#define _NORTC_YEAR 2021
/* The option _FS_NORTC switches timestamp functiton. If the system does not have /* The option _FS_NORTC switches timestamp functiton. If the system does not have
/ any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable / any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable
/ the timestamp function. All objects modified by FatFs will have a fixed timestamp / the timestamp function. All objects modified by FatFs will have a fixed timestamp

View File

@ -281,8 +281,10 @@ FuriHalRtcLocaleDateFormat furi_hal_rtc_get_locale_dateformat() {
} }
void furi_hal_rtc_set_datetime(FuriHalRtcDateTime* datetime) { void furi_hal_rtc_set_datetime(FuriHalRtcDateTime* datetime) {
furi_check(!FURI_IS_IRQ_MODE());
furi_assert(datetime); furi_assert(datetime);
FURI_CRITICAL_ENTER();
/* Disable write protection */ /* Disable write protection */
LL_RTC_DisableWriteProtection(RTC); LL_RTC_DisableWriteProtection(RTC);
@ -319,13 +321,17 @@ void furi_hal_rtc_set_datetime(FuriHalRtcDateTime* datetime) {
/* Enable write protection */ /* Enable write protection */
LL_RTC_EnableWriteProtection(RTC); LL_RTC_EnableWriteProtection(RTC);
FURI_CRITICAL_EXIT();
} }
void furi_hal_rtc_get_datetime(FuriHalRtcDateTime* datetime) { void furi_hal_rtc_get_datetime(FuriHalRtcDateTime* datetime) {
furi_check(!FURI_IS_IRQ_MODE());
furi_assert(datetime); furi_assert(datetime);
FURI_CRITICAL_ENTER();
uint32_t time = LL_RTC_TIME_Get(RTC); // 0x00HHMMSS uint32_t time = LL_RTC_TIME_Get(RTC); // 0x00HHMMSS
uint32_t date = LL_RTC_DATE_Get(RTC); // 0xWWDDMMYY uint32_t date = LL_RTC_DATE_Get(RTC); // 0xWWDDMMYY
FURI_CRITICAL_EXIT();
datetime->second = __LL_RTC_CONVERT_BCD2BIN((time >> 0) & 0xFF); datetime->second = __LL_RTC_CONVERT_BCD2BIN((time >> 0) & 0xFF);
datetime->minute = __LL_RTC_CONVERT_BCD2BIN((time >> 8) & 0xFF); datetime->minute = __LL_RTC_CONVERT_BCD2BIN((time >> 8) & 0xFF);

View File

@ -37,7 +37,6 @@ DSTATUS disk_status (BYTE pdrv);
DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
DWORD get_fattime (void);
/* Disk Status Bits (DSTATUS) */ /* Disk Status Bits (DSTATUS) */