FatFS移植记录.txt 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. 源代码下载地址:
  2. http://elm-chan.org/fsw/ff/00index_e.html
  3. ========== R0.10b ================================
  4. 2014-10-13 升级到 R0.10b版本
  5. 1. disk_ioctl() 函数,修复获取有效容量的bug. (U盘和NAND)
  6. *(DWORD*)buff = NAND_FormatCapacity() / 512; /* 必须为可用的扇区个数,不是芯片的理论容量 */
  7. ...
  8. 2. f_mount() 形式参数变化
  9. 3. diskio.h 新增:
  10. /* Definitions of physical drive number for each media */
  11. #define FS_SD 0
  12. #define FS_NAND 1
  13. #define FS_USB 2
  14. /* 用于 R0.10b 新版本 */
  15. #define FS_SD_STR "0:"
  16. #define FS_NAND_STR "1:"
  17. #define FS_USB_STR "2:"
  18. 4. #define _CODE_PAGE 936
  19. ========== R0.09b================================
  20. 本移植记录对应的版本为 R0.09b
  21. 1. 直接下载 ff9b.zip 文件,然后解压,将其复制到自己的工程中。
  22. 本例子是将其存放在: \User\FatFS\src
  23. 2. 在工程配置中添加h文件搜索路径 \User\FatFS\src
  24. 3. 在工程中添加2个源代码文件:
  25. ff.c
  26. diskio.c
  27. cc936.c
  28. 4. 修改 diskio.c 文件
  29. 5. 为了支持长文件名,必须包含 cc936.c 文件,其中 static const WCHAR uni2oem[] 常量数组
  30. 是一个GB2312码和UNICODE代码的转换表,会占用程序空间约170K字节。
  31. ==========================================
  32. 【ffconf.h 修改记录】
  33. (1)#define _CODE_PAGE 932 /* 这是日文编码 */
  34. 修改为:
  35. #define _CODE_PAGE 936 /* 这是简体中文编码 */
  36. (2)#define _FS_LOCK 0 修改 3, 可以同时打开3个文件,0表示只能打开1个。
  37. (3)#define _USE_LFN 0 /* 0 to 3 */
  38. 修改为
  39. #define _USE_LFN 1 使能长文件名,分配静态内存用于存储长文件名
  40. 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant.
  41. (4)在末尾增加 #include "diskio.h"。 主要目的是声明多个磁盘系统的ID(FS_SD和FS_NAND)
  42. (5) #define _VOLUMES 3 【为了同时支持SD卡,NAND Flash 和 USB 三种介质,将 1 修改为 3】
  43. 【diskio.c 修改记录】
  44. 1. 修改 disk_initialize, 添加SD卡初始化
  45. 2. 修改 disk_status, 返回SD卡状态
  46. 3. 修改 disk_read,实现读SD卡扇区
  47. 4. 修改 disk_write,实现写SD卡扇区
  48. 5. 修改 disk_ioctl, 暂时未用
  49. 6. 添加函数 : DWORD get_fattime (void);
  50. 【diskio.h 修改记录】
  51. 1. 文件末尾增加物理磁盘代码
  52. /* Definitions of physical drive number for each media */
  53. #define FS_SD 0
  54. #define FS_NAND 1
  55. #define FS_USB 2
  56. 【长文件名问题】
  57. 1. 部分文件的属性中只有短文件名 FileInf.fname ,长文件名域 FileInf.lfname 为空
  58. 2. ff_mkdir 创建目录时,无论文件名长短,均可以正确读取到长文件名FileInf.lfname
  59. 3. f_open 创建文件时,如果文件名长度大于 8.3格式名,则会正确填充FileInf.lfname
  60. 【SD_WriteMultiBlocks()函数问题】
  61. 1. 在 disk_write 中,如果待写入的 block大于1,可以选择 SD_WriteMultiBlocks()函数加速
  62. 但是最后一个形参需要是 count + 1 才能正确写入,否则最后1个扇区的数据将不正确。
  63. 【原因待查】
  64. /* 此处存在疑问: 扇区个数如果写 count ,将导致最后1个block无法写入 */
  65. Status = SD_WriteMultiBlocks((uint8_t *)buff, sector << 9 ,SECTOR_SIZE, count + 1);