diff --git a/components/dfs/filesystems/elmfat/dfs_elm.c b/components/dfs/filesystems/elmfat/dfs_elm.c index 0b85b54810e39b2d337b76c148b088bef970d91d..4a69b6a64f4be801f1b55d3ebaad3f311b73e922 100644 --- a/components/dfs/filesystems/elmfat/dfs_elm.c +++ b/components/dfs/filesystems/elmfat/dfs_elm.c @@ -14,8 +14,12 @@ * 2011-11-23 Bernard fixed the rename issue. * 2012-07-26 aozima implement ff_memalloc and ff_memfree. * 2012-12-19 Bernard fixed the O_APPEND and lseek issue. + * 2013-03-01 aozima fixed the stat(st_mtime) issue. */ +#include +#include + #include #include "ffconf.h" #include "ff.h" @@ -178,7 +182,7 @@ int dfs_elm_mkfs(rt_device_t dev_id) { #define FSM_STATUS_INIT 0 #define FSM_STATUS_USE_TEMP_DRIVER 1 - FATFS *fat; + FATFS *fat = RT_NULL; int flag; FRESULT result; int index; @@ -710,8 +714,38 @@ int dfs_elm_stat(struct dfs_filesystem *fs, const char *path, struct stat *st) st->st_mode &= ~(DFS_S_IWUSR | DFS_S_IWGRP | DFS_S_IWOTH); st->st_size = file_info.fsize; - st->st_mtime = file_info.ftime; st->st_blksize = 512; + + /* get st_mtime. */ + { + struct tm tm_file; + int year, mon, day, hour, min, sec; + WORD tmp; + + tmp = file_info.fdate; + day = tmp & 0x1F; /* bit[4:0] Day(1..31) */ + tmp >>= 5; + mon = tmp & 0x0F; /* bit[8:5] Month(1..12) */ + tmp >>= 4; + year = (tmp & 0x7F) + 1980; /* bit[15:9] Year origin from 1980(0..127) */ + + tmp = file_info.ftime; + sec = (tmp & 0x1F) * 2; /* bit[4:0] Second/2(0..29) */ + tmp >>= 5; + min = tmp & 0x3F; /* bit[10:5] Minute(0..59) */ + tmp >>= 6; + hour = tmp & 0x1F; /* bit[15:11] Hour(0..23) */ + + memset(&tm_file, 0, sizeof(tm_file)); + tm_file.tm_year = year - 1900; /* Years since 1900 */ + tm_file.tm_mon = mon - 1; /* Months *since* january: 0-11 */ + tm_file.tm_mday = day; /* Day of the month: 1-31 */ + tm_file.tm_hour = hour; /* Hours since midnight: 0-23 */ + tm_file.tm_min = min; /* Minutes: 0-59 */ + tm_file.tm_sec = sec; /* Seconds: 0-59 */ + + st->st_mtime = mktime(&tm_file); + } /* get st_mtime. */ } #if _USE_LFN