现在的位置: 首页 > 综合 > 正文

Fatfs文件系统分析(3)-底层接口分析

2018年08月24日 ⁄ 综合 ⁄ 共 2475字 ⁄ 字号 评论关闭

Fatfs文件系统分析(3)-diskio.c/diskio.h文件分析

        由于FatFs模块完全与磁盘I/O层分开,因此底层磁盘I/O需要下列函数去读/写物理磁盘以及获取当前时间。由于底层磁盘I/O模块并不是FatFs的一部分,因此它必须由用户提供。

1) disk_initialize

初始化磁盘驱动器

DSTATUS disk_initialize (

  BYTE Drive           /*
物理驱动器号 */

);

参数

Drive指定待初始化的物理驱动器号。

返回值

disk_initialize函数返回一个磁盘状态作为结果。磁盘状态的详情,参考disk_status函数。

描述

disk_initialize函数初始化一个物理驱动器。函数成功后,返回值中的STA_NOINIT标志被清除。

disk_initialize函数被FatFs模块在卷挂载过程中调用,去管理存储介质的改变。FatFs模块起作用时,或卷上的FAT结构可以被瓦解时,应用程序不能调用该函数。可以使用f_mount函数去重新初始化文件系统。

 

2)disk_status

获取当前磁盘的状态

DSTATUS disk_status (

  BYTE Drive     /*
物理驱动器号*/

);

参数

Drive指定待确认的物理驱动器号。

返回值

磁盘状态,是下列标志的组合:STA_NOINIT

指示磁盘驱动器还没有被初始化。当系统复位、磁盘移除和disk_initialize函数失败时,该标志被设置;当disk_initialize函数成功时,该标志被清除。STA_NODISK

指示驱动器中没有存储介质。当安装了磁盘驱动器后,该标志始终被清除。

STA_PROTECTED

指示存储介质被写保护。在不支持写保护缺口的驱动器上,该标志始终被清除。当STA_NODISK被设置时,该标志无效。

 

3)disk_read

从磁盘驱动器中读取扇区

DRESULT disk_read (

  BYTE Drive,          /*
物理驱动器号 */

  BYTE* Buffer,        /*
读取数据缓冲区的指针 */

  DWORD SectorNumber,  /*
起始扇区号 */

  BYTE SectorCount     /*
要读取的扇区数 */

);

参数

Drive指定物理驱动器号。

Buffer存储读取数据的缓冲区的指针。该缓冲区大小需要满足要读取的字节数(扇区大小 *
扇区总数。由上层指定的存储器地址可能会也可能不会以字边界对齐。SectorNumber

指定在逻辑块地址(LBA)中的起始扇区号。

SectorCount指定要读取的扇区数(1-255)

返回值

RES_OK (0)函数成功

RES_ERROR在读操作过程中发生了不能恢复的硬错误。

RES_PARERR无效的参数。

RES_NOTRDY磁盘驱动器还没被初始化。


 

 4)disk_write

向磁盘驱动器中写入扇区

DRESULT disk_write (

  BYTE Drive,          /*
物理驱动器号 */

  const BYTE* Buffer,  /*
写入数据缓冲区的指针(可能未对齐) */

  DWORD SectorNumber,  /*
起始扇区号 */

  BYTE SectorCount     /*
要写入的扇区数 */

);

参数

Drive指定物理驱动器号。

Buffer存储写入数据的缓冲区的指针。由上层指定的存储器地址可能会也可能不会以字边界对齐。

SectorNumber指定在逻辑块地址(LBA)中的起始扇区号。

SectorCount指定要写入的扇区数(1-255)

返回值


 

RES_OK (0)函数成功

RES_ERROR在读操作过程中发生了不能恢复的硬错误。

RES_WRPRT存储介质被写保护。

RES_PARERR无效的参数。

RES_NOTRDY磁盘驱动器还没被初始化。

描述

在只读配置中,不需要此函数。

 

5) disk_ioctl

控制设备特定的功能以及磁盘读写以外的其它功能。

DRESULT disk_ioctl (

  BYTE Drive,      /*
驱动器号 */

  BYTE Command,    /*
控制命令代码 */

  void* Buffer     /*
数据传输缓冲区 */

);

参数

Drive指定驱动器号(1-9)

Command指定命令代码。

Buffer取决于命令代码的参数缓冲区的指针。当不使用时,指定一个NULL指针。

返回值


 

RES_OK (0)函数成功。

RES_ERROR发生错误。

RES_PARERR无效的命令代码。

RES_NOTRDY磁盘驱动器还没被初始化。


 

描述

FatFs模块只使用下述与设备无关的命令,没有使用任何设备相关功能。

命令

描述

CTRL_SYNC

确保磁盘驱动器已经完成等待写过程。当磁盘I/O模块有一个写回高速缓存时,立即冲洗脏扇区。在只读配置中,不需要该命令。

GET_SECTOR_SIZE

返回驱动器的扇区大小赋给Buffer指向的WORD变量。在单个扇区大小配置中(_MAX_SS
512),不需要该命令。

GET_SECTOR_COUNT

返回总扇区数赋给Buffer指向的DWORD变量。只在f_mkfs函数中,使用了该命令。

GET_BLOCK_SIZE

返回以扇区为单位的存储阵列的擦除块大小赋给Buffer指向的DWORD变量。当擦除块大小未知或是磁盘设备时,返回1。只在f_mkfs函数中,使用了该命令。

 

 

6)get_fattime

获取当前时间

DWORD get_fattime (void);

返回值

返回的当前时间被打包进一个DWORD数值。各位域定义如下:


 

bit31:25年,从1980年开始算起(0..127)

bit24:21(1..12)

bit20:16(1..31)

bit15:11(0..23)

bit10:5(0..59)

bit4:0/2(0..29),由此可见FatFs的时间分辨率为2


 

描述

get_fattime函数必须返回任何有效的时间,即使系统不支持实时时钟。如果返回一个0,则文件将没有一个有效的时间。在只读配置中,不需要此函数。

 

抱歉!评论已关闭.