FATFS檔案系統移植
先說下我做的專案實現功能吧!語音播放器,類似一個小MP3那種,只是儲存用的SD卡、TF卡。檔案系統採用了開源的FATFS.
FATFS模組的層次結構圖
1、底層介面,包括儲存媒介讀/寫介面(disk I/O)和供給檔案建立修改時間的實時時鐘,需要我們根據平臺和儲存介質編寫移植程式碼。
2、中間層FATFS模組,實現了FAT 檔案讀/寫協議。FATFS模組提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用時將標頭檔案直接包含進去即可。
3、最頂層是應用層,使用者無需理會FATFS的內部結構和複雜的FAT 協議,只需要呼叫FATFS模組提供給使用者的一系列應用介面函式,如f_open,f_read,f_write 和f_close等,就可以像在PC 上讀/寫檔案那樣簡單。
FATFS檔案系統包:下載地址:http://elm-chan.org/fsw/ff/00index_e.html
此地址不僅僅包含資料包下載,還包括檔案系統一些知 識,包括函式說明,函式呼叫例項等。
FATFS檔案系統包結構
FATFS檔案系統包結構
檔名 |
功能 |
說明 |
ffconf.h |
FATFS模組配置檔案 |
需要根據需求來配置引數。 |
ff.h |
FATFS和應用模組公用的包含檔案 |
不需要修改 |
ff.c |
FATFS模組原始碼 |
不需要修改 |
diskio.h |
FATFS和disk I/O模組公用的包含檔案 |
不需要修改
|
diskio.c |
FATFS和disk I/O模組介面層檔案 |
與平臺相關的程式碼,需要使用者根據儲存介質來編寫函式。 |
interger.h |
資料型別定義 |
與編譯器有關。 |
option資料夾 |
可選的外部功能(比如支援中文等) |
漢字實驗把字型檔放到SPI FLASH需要修改 |
ffconf.h : FATFS關鍵配置檔案
_FS_TINY。這個選項在R0.07版本中開始出現,之前的版本都是以獨立的C檔案出現(FATFS和Tiny FATFS),有了這個選項之後,兩者整合在一起了,使用起來更方便。我們使用FATFS,所以把這個選項定義為0即可。
_FS_READONLY。這個用來配置是不是隻讀,本章我們需要讀寫都用,所以這裡設定為0即可。
_USE_STRFUNC。這個用來設定是否支援字串類操作,比如f_putc,f_puts等,本章我們需要用到,故設定這裡為1。
_USE_MKFS。這個用來定時是否使能格式化,本章需 要用到,所以設 置這裡為1。
_USE_FASTSEEK。這個用來使能快速定位,我們設定 為1,使能快速定位。
_USE_LABEL。這個用來設定是否支援磁碟碟符(磁碟名字)讀取與設定。我們設定為1,使能,就可以通過相關函式來讀取和設定磁碟的名字了。
_CODE_PAGE。這個用於設定語言型別,包括很多選項(見FATFS官網說明),我們這裡設定為936,即簡體中文(GBK碼,需要c936.c檔案支援,該檔案在option資料夾)。
_USE_LFN。該選項用於設定是否支援長檔名(還需要_CODE_PAGE支援),取值範圍為0~3。0,表示不支援長檔名,1~3是支援長檔名,但是儲存地方不一樣,我們選擇使用3,通過ff_memalloc函式來動態分配長檔名的儲存區域。
_VOLUMES。用於設定FATFS支援的邏輯裝置數目,我們設定為3的話,即支援3個裝置(磁碟)。
_MAX_SS。扇區緩衝的最大值,一般設定為512。
FATFS移植步驟
資料型別:在integer.h 裡面去定義好資料的型別。這裡需要了解你用的編譯器的資料型別,並根據編譯器定義好資料型別。
配置:通過ffconf.h配置FATFS的相關功能,以滿足你的需要。
函式編寫:開啟diskio.c,進行底層驅動編寫,一般需要編寫6 個介面函式
FATFS開放函式
f_mount - 註冊/登出一個工作區域(Work Area)
f_open - 開啟/建立一個檔案
f_close - 關閉一個檔案
f_read - 讀檔案
f_write - 寫檔案
f_lseek - 移動檔案讀/寫指標
f_truncate -截斷檔案
f_sync - 沖洗緩衝資料 Flush Cached Data
f_forward - 直接轉移檔案資料到一個數據流
f_stat - 獲取檔案狀態
f_opendir - 開啟一個目錄
f_closedir -關閉一個已經開啟的目錄
f_readdir - 讀取目錄條目
f_mkdir - 建立一個目錄
f_unlink -刪除一個檔案或目錄
f_chmod - 改變屬性(Attribute)
f_utime -改變時間戳(Timestamp)
f_rename - 重新命名/移動一個檔案或資料夾
f_chdir - 改變當前目錄
f_chdrive - 改變當前驅動器
f_getcwd - 獲取當前工作目錄
f_getfree - 獲取空閒簇 Get Free Clusters
f_getlabel - Get volume label
f_setlabel - Set volume label f_mkfs - 在驅動器上建立一個檔案系統
f_fdisk - Divide a physical drive
f_gets - 讀一個字串
f_putc - 寫一個字元
f_puts - 寫一個字串
f_printf - 寫一個格式化的字串
f_tell - 獲取當前讀/寫指標
f_eof - 測試檔案結束
f_size - 獲取檔案大小
f_error - 測試檔案上的錯誤
本來想自己總結的,但是找圖的時候發現原子哥的PPT寫的挺好,哈哈哈哈我就直接整理過來了。