簡(jiǎn)單介紹了一下DFS代碼框架和如何在RTThread平臺(tái)上使用DFS分布式文件系統(tǒng)。工作比較忙先把目前整理的發(fā)出來,希望對(duì)小伙伴們有幫助,也希望玩過的朋友一起討論指正。等空閑下來再繼續(xù)細(xì)化深入分析一下。甚至看看能不能掛載個(gè)網(wǎng)絡(luò)文件系統(tǒng)玩玩。
DFS分布式文件系統(tǒng)框架如下:
主要特點(diǎn):
支持多種類型的存儲(chǔ)設(shè)備。
支持多種類型的文件系統(tǒng),提供普通文件、設(shè)備文件、網(wǎng)絡(luò)文件描述符的管理。
DFS虛擬文件系統(tǒng)文件目錄如下:
關(guān)鍵文件簡(jiǎn)單介紹如下(詳見具體的API手冊(cè)):
src文件夾:?dfs虛擬文件系統(tǒng)層相關(guān)代碼
dfs_posix.c ?對(duì)上層的調(diào)用接口代碼
int open(const char *file, int flags, …) ?打開文件
int close(int fd) ?關(guān)閉文件
int read(int fd, void *buf, size_t len) ?讀取文件
int write(int fd, const void *buf, size_t len) ?寫入文件
off_t lseek(int fd, off_t offset, int whence) ?移動(dòng)文件讀寫位置
int rename(const char old_file, const char new_file) ?重命名文件
int unlink(const char *pathname) ?刪除文件
int stat(const char file, struct stat buf) ?讀取文件信息
int fstat(int fildes, struct stat *buf) ?讀取文件狀態(tài)
int fsync(int fildes) ?把文件描述符對(duì)應(yīng)文件的緩沖區(qū)數(shù)據(jù),寫入對(duì)應(yīng)磁盤文件,清空緩存區(qū)
int fcntl(int fildes, int cmd, …) ?文件的ioctl接口,針對(duì)dfs層只能讀取和設(shè)置文件flags。對(duì)應(yīng)具體文件系統(tǒng),由具體文件系統(tǒng)的ioctl接口定義
int ioctl(int fildes, int cmd, …) ?文件的ioctl接口,內(nèi)部調(diào)用上面的fcntl,如此,對(duì)外只需調(diào)用ioctl即可
int ftruncate(int fd, off_t length) ?按照length長(zhǎng)度截?cái)辔募?/span>
int statfs(const char path, struct statfs buf) ?讀取文件系統(tǒng)信息,包括block大小,block總數(shù),剩余block數(shù),用于計(jì)算剩余空間
int mkdir(const char *path, mode_t mode) ?創(chuàng)建文件夾,目前mode內(nèi)部并沒有使用,無實(shí)際意義??膳渲脼?x777
int rmdir(const char *pathname) ?刪除文件夾
DIR opendir(const char name) ?打開文件夾
struct dirent readdir(DIR d) ?讀取文件夾,可打開一個(gè)文件夾后,連續(xù)調(diào)用此函數(shù)遍歷讀取文件夾內(nèi)所有子文件夾和文件,dirent內(nèi)的d_type表明文件類型,1為文件,2為文件夾
long telldir(DIR *d) ?讀取目錄流中的當(dāng)前位置(尚未測(cè)試有何用途)
void seekdir(DIR *d, off_t offset) ?設(shè)置目錄流中的讀寫位置(尚未測(cè)試有何用途)
void rewinddir(DIR *d) ?復(fù)位目錄流中的讀寫位置(尚未測(cè)試有何用途)
int closedir(DIR *d) ?關(guān)閉文件夾
int chdir(const char *path) ?更改當(dāng)前目錄
int access(const char *path, int amode) ?測(cè)試文件是否可以訪問
char getcwd(char buf, size_t size) ?讀取當(dāng)前路徑
dfs.c ? dfs文件系統(tǒng)初始化,文件句柄列表管理等接口函數(shù)
int dfs_init(void) ? 初始化dfs文件系統(tǒng),如果使能devfs,則直接掛載。此接口程序默認(rèn)被rtthread設(shè)置為組件前自動(dòng)初始化,無需用戶調(diào)用。需發(fā)生在掛載底層文件系統(tǒng)之前
void dfs_lock(void) ? 嘗試獲取dfs的互斥量,如果已被占用,則掛起當(dāng)前線程,等待其它線程讓出dfs操作權(quán)
void dfs_unlock(void) ? 釋放dfs互斥量,讓出dfs操作權(quán)
static int fd_alloc(struct dfs_fdtable *fdt, int startfd) ? 如果已打開的文件句柄列表內(nèi)有空余句柄,則直接返回。如果沒有空余,則在打開文件的時(shí)候需要新開辟空間,擴(kuò)充已打開的文件句柄列表(每次擴(kuò)充4個(gè))。如果已超過同時(shí)打開文件的數(shù)量上限,則不再開辟。但這里沒有直接返回錯(cuò)誤,而是返回最大文件描述符。等待調(diào)用者做越界保護(hù)處理
int fd_new(void) ? 調(diào)用上面的fd_alloc函數(shù),申請(qǐng)一個(gè)空文件描述符。如果越界(沒有空閑設(shè)備描述符可用)則返回-1.否則返回+3的描述符.0,1,2的文件描述符用于承載終端設(shè)備文件描述符
struct dfs_fd *fd_get(int fd) ? 通過文件描述符,在文件句柄列表內(nèi)找出對(duì)應(yīng)的文件句柄
void fd_put(struct dfs_fd *fd) ? 如果文件句柄的ref_count減一后為0,則釋放掉文件句柄。
int fd_is_open(const char *pathname) ? 查找某文件是否已打開,0為打開,-1為未打開。
const char dfs_subdir(const char directory, const char *filename) ? 在filename中去掉directory,返回相對(duì)子目錄
char dfs_normalize_path(const char directory, const char *filename) ? 返回標(biāo)準(zhǔn)格式的路徑
struct dfs_fdtable *dfs_fdtable_get(void) ? 返回文件句柄列表
int list_fd(void) ? 打印當(dāng)前文件句柄列表內(nèi),已打開的文件屬性
dfs_fs.c ? dfs層文件系統(tǒng)對(duì)底層具體文件系統(tǒng)的管理接口函數(shù)
int dfs_register(const struct dfs_filesystem_ops *ops) ? 注冊(cè)一個(gè)具體的文件系統(tǒng)(dev,elm等)。具體操作為在文件系統(tǒng)操作符數(shù)組中,找出空閑句柄,并添加為新注冊(cè)的操作符
struct dfs_filesystem dfs_filesystem_lookup(const char path) ? 根據(jù)路徑名,在文件系統(tǒng)列表中查找對(duì)應(yīng)的文件系統(tǒng)。路徑名只要包含文件系統(tǒng)具體掛載點(diǎn)即可。比如給定一個(gè)文件的絕對(duì)路徑名,即可找到它所在的文件系統(tǒng)
const char dfs_filesystem_get_mounted_path(struct rt_device device) ? 根據(jù)設(shè)備ID,在文件系統(tǒng)列表中查找對(duì)應(yīng)的文件系統(tǒng),并返回對(duì)應(yīng)文件系統(tǒng)的掛載點(diǎn)
int dfs_filesystem_get_partition(struct dfs_partition part,uint8_t buf,uint32_t pindex) ? 在指定存儲(chǔ)空間內(nèi)讀取分區(qū)表。一般分區(qū)表在存儲(chǔ)設(shè)備的第一個(gè)扇區(qū)。
int dfs_mount(const char device_name,const char path,const char filesystemtype,unsigned long rwflag,const void data) ? 根據(jù)設(shè)備名,把該設(shè)備掛載到指定路徑。filesystemtype指定具體的文件系統(tǒng)類型,以使用具體的操作接口。rwflag為文件系統(tǒng)的讀寫屬性,data為傳的參數(shù),是否有實(shí)際意義要看具體的文件系統(tǒng)操作接口。常用的elm和dev文件系統(tǒng)都無實(shí)際意義,直接給0即可。該函數(shù)需要等注冊(cè)完具體的存儲(chǔ)設(shè)備和dfs文件系統(tǒng)并在dfs文件系統(tǒng)內(nèi)注冊(cè)了具體的文件系統(tǒng)后,由用戶調(diào)用,把具體的存儲(chǔ)設(shè)備掛載到dfs的指定掛載點(diǎn)。并指定以哪種類型的文件系統(tǒng)操作接口處理此設(shè)備。在此之前無需open對(duì)應(yīng)的存儲(chǔ)設(shè)備,此函數(shù)內(nèi)部會(huì)先打開存儲(chǔ)設(shè)備再掛載
int dfs_unmount(const char *specialfile) ? 取消掛載,在文件系統(tǒng)列表中刪除指定文件系統(tǒng),關(guān)閉存儲(chǔ)設(shè)備。specialfile只需包含文件系統(tǒng)掛載路徑即可
int dfs_mkfs(const char fs_name, const char device_name) ? 根據(jù)fs_name指定的具體文件系統(tǒng)類型,把device_name指定的實(shí)際存儲(chǔ)設(shè)備進(jìn)行格式化,構(gòu)建文件系統(tǒng)
int dfs_statfs(const char path, struct statfs buffer) ? 讀取指定文件系統(tǒng)的信息,包括塊大小,總塊數(shù)以及剩余塊數(shù),可以用于查看設(shè)備剩余空間
void mkfs(const char fs_name, const char device_name) ? finsh函數(shù)命令的mkfs接口。使能了MSH后,此函數(shù)未被使用
int df(const char *path) ? finsh函數(shù)命令的stafts接口,打印存儲(chǔ)設(shè)備的容量和剩余空間信息。使能了MSH后,此函數(shù)未被使用
dfs_file.c ? dfs文件系統(tǒng)層對(duì)于文件相關(guān)的處理接口函數(shù),具體實(shí)現(xiàn)會(huì)分別調(diào)用對(duì)應(yīng)實(shí)際文件系統(tǒng)的操作函數(shù)接口。既dfs面向下層文件系統(tǒng)的接口,移植具體文件系統(tǒng)的時(shí)候需要實(shí)現(xiàn)對(duì)接代碼(用RTT移植的時(shí)候,RTT已經(jīng)完成了此接口,在dfs_elm.c內(nèi))。
int dfs_file_open(struct dfs_fd fd, const char path, int flags) ? 按照flags屬性打開path指定文件或文件夾,然后由fd文件句柄返回
int dfs_file_close(struct dfs_fd *fd) ? 關(guān)閉fd指定的文件或文件夾
int dfs_file_ioctl(struct dfs_fd fd, int cmd, void args) ? dfs層的ioctl內(nèi)部接口,可讀取和設(shè)置文件flags。并調(diào)用具體文件系統(tǒng)的ioctl接口實(shí)現(xiàn)底層具體功能
int dfs_file_read(struct dfs_fd fd, void buf, size_t len) ? dfs層的read接口,調(diào)用具體文件系統(tǒng)的read接口實(shí)現(xiàn)讀取功能
int dfs_file_getdents(struct dfs_fd fd, struct dirent dirp, size_t nbytes) ? 根據(jù)文件操作符,讀取dirent結(jié)構(gòu)體對(duì)應(yīng)的屬性信息
int dfs_file_unlink(const char *path) ? dfs層刪除接口,調(diào)用具體文件系統(tǒng)的unlink接口實(shí)現(xiàn)文件或文件夾的刪除功能
int dfs_file_write(struct dfs_fd fd, const void buf, size_t len) ? dfs層的write接口,調(diào)用具體文件系統(tǒng)的write接口實(shí)現(xiàn)寫入功能
int dfs_file_flush(struct dfs_fd *fd) ? dfs層的同步接口,調(diào)用具體文件系統(tǒng)的flush接口實(shí)現(xiàn)文件的同步,既把文件句柄內(nèi)的緩存數(shù)據(jù)真正寫入到存儲(chǔ)設(shè)備
int dfs_file_lseek(struct dfs_fd *fd, off_t offset) ? dfs層的lseek接口,調(diào)用具體文件系統(tǒng)的lseek接口,實(shí)現(xiàn)對(duì)文件讀取位置的移動(dòng)
int dfs_file_stat(const char path, struct stat buf) ? dfs層的讀取文件屬性接口,也會(huì)調(diào)用具體文件系統(tǒng)的stat接口
int dfs_file_rename(const char oldpath, const char newpath) ? dfs層的rename接口,調(diào)用底層具體文件系統(tǒng)的rename接口,實(shí)現(xiàn)文件重命名
int dfs_file_ftruncate(struct dfs_fd *fd, off_t length) ? 調(diào)用具體文件系統(tǒng)的ioctl接口,實(shí)現(xiàn)對(duì)文件fd的截?cái)啵╨ength字節(jié))
void ls(const char *pathname) ? finsh的ls命令函數(shù)
void rm(const char *filename) ? finsh的rm命令函數(shù)
void cat(const char *filename) ? finsh的cat命令函數(shù)
static void copyfile(const char src, const char dst) ? dfs層實(shí)現(xiàn)的文件拷貝函數(shù)
static void copydir(const char src, const char dst) ? dfs層實(shí)現(xiàn)的文件夾拷貝函數(shù),遍歷子文件夾,把所有子文件拷貝到目標(biāo)文件夾
static const char _get_path_lastname(const char path) ? 通過path路徑,得到最后一級(jí)路徑名
void copy(const char src, const char dst) ? finsh的copy命令函數(shù),調(diào)用上面的copyfile和copydir實(shí)現(xiàn)
filesystems文件夾:dfs支持的具體文件系統(tǒng),默認(rèn)會(huì)有一個(gè)devfs文件夾,對(duì)應(yīng)設(shè)備文件系統(tǒng)。開啟了elm的fat文件系統(tǒng)模塊后,會(huì)多一個(gè)elmfat文件夾,對(duì)應(yīng)fatfs的代碼
elmfat文件夾:fatfs對(duì)應(yīng)的代碼,其中ff.c為fatfs代碼,dfs_elm.c為RTT實(shí)現(xiàn)的移植代碼,承上啟下,完成dfs的調(diào)用接口和與fatfs對(duì)接的接口,并通過具體設(shè)備(flash,sdcard)的操作接口實(shí)現(xiàn)具體的功能
dfs_elm.c ? 相對(duì)直接移植fatfs時(shí)diskio.c要實(shí)現(xiàn)的接口外,又多了一些和dfs層對(duì)接的接口。下面針對(duì)dfs_elm.c下的接口函數(shù)做簡(jiǎn)單說明
static int elm_result_to_dfs(FRESULT result) ? 做fatfs下的返回狀態(tài)與dfs下的返回狀態(tài)的轉(zhuǎn)換
static int get_disk(rt_device_t id) ? 根據(jù)設(shè)備ID,在掛載的磁盤列表中找到磁盤列表ID
int dfs_elm_mount(struct dfs_filesystem fs, unsigned long rwflag, const void data) ? 承上啟下,連接dfs層和fatfs內(nèi)的mount接口,實(shí)現(xiàn)設(shè)備掛載,把設(shè)備ID添加到掛載的磁盤列表內(nèi)
int dfs_elm_unmount(struct dfs_filesystem *fs) ? 承上啟下,連接dfs層和fatfs內(nèi)的unmount接口,實(shí)現(xiàn)設(shè)備取消掛載,把設(shè)備ID從磁盤列表中刪除
int dfs_elm_mkfs(rt_device_t dev_id) ? 承上啟下,連接dfs層和fatfs內(nèi)的mkfs接口,實(shí)現(xiàn)存儲(chǔ)設(shè)備的格式化
int dfs_elm_statfs(struct dfs_filesystem fs, struct statfs buf) ? 承上啟下,連接dfs層和fatfs內(nèi)的statfs和getfree接口,讀取文件系統(tǒng)的存儲(chǔ)空間信息
int dfs_elm_open(struct dfs_fd *file) ? 承上啟下,連接dfs層和fatfs內(nèi)的open或opendir接口,實(shí)現(xiàn)打開文件或文件夾功能
int dfs_elm_close(struct dfs_fd *file) ? 承上啟下,連接dfs層和fatfs內(nèi)的close接口,實(shí)現(xiàn)關(guān)閉文件或文件夾功能
int dfs_elm_ioctl(struct dfs_fd file, int cmd, void args) ? 承上啟下,連接dfs層和fatfs內(nèi)的ioctl接口,實(shí)現(xiàn)文件截?cái)喙δ?/span>
int dfs_elm_read(struct dfs_fd file, void buf, size_t len) ? 承上啟下,連接dfs層和fatfs內(nèi)的read接口,實(shí)現(xiàn)文件讀取功能
int dfs_elm_write(struct dfs_fd file, const void buf, size_t len) ? 承上啟下,連接dfs層和fatfs內(nèi)的write接口,實(shí)現(xiàn)文件寫入功能
int dfs_elm_flush(struct dfs_fd *file) ? 承上啟下,連接dfs層和fatfs內(nèi)的flush和sync接口,實(shí)現(xiàn)文件的同步功能,把緩存數(shù)據(jù)寫入磁盤
int dfs_elm_lseek(struct dfs_fd *file, rt_off_t offset) ? 承上啟下,連接dfs層和fatfs內(nèi)的lseek或seekdir接口,實(shí)現(xiàn)文件或文件夾的操作位置移動(dòng)
int dfs_elm_getdents(struct dfs_fd file, struct dirent dirp, uint32_t count) ? 承上啟下,調(diào)用fatfs的readdir接口,實(shí)現(xiàn)dfs層的getdents接口,讀取文件dirent屬性
int dfs_elm_unlink(struct dfs_filesystem fs, const char path) ? 承上啟下,連接dfs層和fatfs內(nèi)的funlink接口,實(shí)現(xiàn)文件的刪除功能
int dfs_elm_rename(struct dfs_filesystem fs, const char oldpath, const char *newpath) ? 承上啟下,連接dfs層和fatfs內(nèi)的rename接口,實(shí)現(xiàn)改文件名的功能
int dfs_elm_stat(struct dfs_filesystem fs, const char path, struct stat *st) ? 承上啟下,連接dfs層和fatfs內(nèi)的stat接口,實(shí)現(xiàn)讀取文件stat信息的功能
int elm_init(void) ? 調(diào)用dfs層的dfs_register接口,把“elm”的文件系統(tǒng)操作接口注冊(cè)到dfs文件系統(tǒng)中。用于后面按照“elm”類型掛載實(shí)際的存儲(chǔ)設(shè)備。此函數(shù)被RTT加入到了組件初始化列表,會(huì)自動(dòng)運(yùn)行,無需用戶調(diào)用
DSTATUS disk_initialize(BYTE drv) ? 此函數(shù)為fatfs的初始化磁盤設(shè)備的接口,由于RTT實(shí)際初始化磁盤設(shè)備的代碼也被加入到了自動(dòng)初始化列表,所以此接口直接返回OK即可
DSTATUS disk_status(BYTE drv) ? 此函數(shù)為fatfs讀取磁盤設(shè)備狀態(tài)的接口。RTT的移植,并沒有對(duì)此函數(shù)做具體實(shí)現(xiàn),直接返回的OK
DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, UINT count) ? 此函數(shù)為fatfs讀取磁盤扇區(qū)數(shù)據(jù)的接口,對(duì)接具體的設(shè)備驅(qū)動(dòng)讀取接口
DRESULT disk_write(BYTE drv, const BYTE *buff, DWORD sector, UINT count) ? 此函數(shù)為fatfs寫入磁盤扇區(qū)數(shù)據(jù)的接口,對(duì)接具體的設(shè)備驅(qū)動(dòng)寫入接口
DRESULT disk_ioctl(BYTE drv, BYTE ctrl, void *buff) ? 此函數(shù)為fatfs的ioctl接口,對(duì)接具體設(shè)備驅(qū)動(dòng)的control接口
DWORD get_fattime(void) ? 此函數(shù)為fatfs獲取系統(tǒng)時(shí)間的接口,用于記錄文件和文件夾的創(chuàng)建和修改時(shí)間
int ff_cre_syncobj(BYTE drv, FF_SYNC_t *m) ? 如開啟文件重入功能,則需要實(shí)現(xiàn)重入保護(hù)相關(guān)代碼,RTT利用互斥量實(shí)現(xiàn),此接口創(chuàng)建互斥量。FF_SYNC_t到rt_mutex_t的重定義在ffconf.h中定義
int ff_del_syncobj(FF_SYNC_t m) ? fatfs的刪除互斥量的接口
int ff_req_grant(FF_SYNC_t m) ? fatfs的獲取互斥量的接口
void ff_rel_grant(FF_SYNC_t m) ? fatfs的釋放互斥量的接口
void *ff_memalloc(UINT size) ? 當(dāng)定義FF_USE_LFN == 3的時(shí)候,長(zhǎng)文件名需要在堆上面開辟空間,此時(shí)需要實(shí)現(xiàn)fatfs開辟存儲(chǔ)空間的接口,對(duì)應(yīng)rt_malloc接口
void ff_memfree(void *mem) ? fatfs釋放存儲(chǔ)空間的接口,對(duì)應(yīng)rt_free接口
dfs以fatfs系統(tǒng)掛載sdcard相關(guān)代碼調(diào)用時(shí)序圖:
大致按照從底層到頂層的初始化過程:
sdio硬件外設(shè)初始化(自動(dòng)):
mmcsd設(shè)備初始化(自動(dòng)):
fatfs文件系統(tǒng)初始化(自動(dòng)):
dfs文件系統(tǒng)初始化(自動(dòng)):
sdcard檢測(cè)線程,檢測(cè)是否有sdcard或mmccard插入到sd卡槽并進(jìn)行卡識(shí)別:
sdcard掛載到dfs系統(tǒng)(用戶調(diào)用):
具體使用過程
如上所述,其實(shí)在RTThread平臺(tái)上使用DFS文件系統(tǒng)掛載SD卡已經(jīng)很簡(jiǎn)單了,大致分一下幾步:
1、用CubeMX生成SDIO的最底層外設(shè)初始化代碼HAL_SD_MspInit(),復(fù)制到board.c
SDIO配置如下:
SDIO的DMA配置如下:
SDIO的NVIC配置如下:
生成代碼如下(復(fù)制到board.c):
1
2
3SD_HandleTypeDefhsd;
4
5DMA_HandleTypeDefhdma_sdio_rx;
6
7DMA_HandleTypeDefhdma_sdio_tx;
8
9/**
10
11*@briefSDMSPInitialization
12
13*Thisfunctionconfiguresthehardwareresourcesusedinthisexample
14
15*@paramhsd:SDhandlepointer
16
17*@retvalNone
18
19*/
20
21voidHAL_SD_MspInit(SD_HandleTypeDef*hsd)
22
23{
24
25GPIO_InitTypeDefGPIO_InitStruct={0};
26
27if(hsd->Instance==SDIO)
28
29{
30
31/*USERCODEBEGINSDIO_MspInit0*/
32
33/*USERCODEENDSDIO_MspInit0*/
34
35/*Peripheralclockenable*/
36
37__HAL_RCC_SDIO_CLK_ENABLE();
38
39__HAL_RCC_GPIOC_CLK_ENABLE();
40
41__HAL_RCC_GPIOD_CLK_ENABLE();
42
43/**SDIOGPIOConfiguration
44
45PC8------>SDIO_D0
46
47PC9------>SDIO_D1
48
49PC10------>SDIO_D2
50
51PC11------>SDIO_D3
52
53PC12------>SDIO_CK
54
55PD2------>SDIO_CMD
56
57*/
58
59GPIO_InitStruct.Pin=GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
60
61|GPIO_PIN_12;
62
63GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;
64
65GPIO_InitStruct.Pull=GPIO_NOPULL;
66
67GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
68
69GPIO_InitStruct.Alternate=GPIO_AF12_SDIO;
70
71HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);
72
73GPIO_InitStruct.Pin=GPIO_PIN_2;
74
75GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;
76
77GPIO_InitStruct.Pull=GPIO_NOPULL;
78
79GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
80
81GPIO_InitStruct.Alternate=GPIO_AF12_SDIO;
82
83HAL_GPIO_Init(GPIOD,&GPIO_InitStruct);
84
85/*SDIODMAInit*/
86
87/*SDIO_RXInit*/
88
89hdma_sdio_rx.Instance=DMA2_Stream3;
90
91hdma_sdio_rx.Init.Channel=DMA_CHANNEL_4;
92
93hdma_sdio_rx.Init.Direction=DMA_PERIPH_TO_MEMORY;
94
95hdma_sdio_rx.Init.PeriphInc=DMA_PINC_DISABLE;
96
97hdma_sdio_rx.Init.MemInc=DMA_MINC_ENABLE;
98
99hdma_sdio_rx.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;
100
101hdma_sdio_rx.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;
102
103hdma_sdio_rx.Init.Mode=DMA_PFCTRL;
104
105hdma_sdio_rx.Init.Priority=DMA_PRIORITY_LOW;
106
107hdma_sdio_rx.Init.FIFOMode=DMA_FIFOMODE_ENABLE;
108
109hdma_sdio_rx.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
110
111hdma_sdio_rx.Init.MemBurst=DMA_MBURST_INC4;
112
113hdma_sdio_rx.Init.PeriphBurst=DMA_PBURST_INC4;
114
115if(HAL_DMA_Init(&hdma_sdio_rx)!=HAL_OK)
116
117{
118
119Error_Handler();
120
121}
122
123__HAL_LINKDMA(hsd,hdmarx,hdma_sdio_rx);
124
125/*SDIO_TXInit*/
126
127hdma_sdio_tx.Instance=DMA2_Stream6;
128
129hdma_sdio_tx.Init.Channel=DMA_CHANNEL_4;
130
131hdma_sdio_tx.Init.Direction=DMA_MEMORY_TO_PERIPH;
132
133hdma_sdio_tx.Init.PeriphInc=DMA_PINC_DISABLE;
134
135hdma_sdio_tx.Init.MemInc=DMA_MINC_ENABLE;
136
137hdma_sdio_tx.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;
138
139hdma_sdio_tx.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;
140
141hdma_sdio_tx.Init.Mode=DMA_PFCTRL;
142
143hdma_sdio_tx.Init.Priority=DMA_PRIORITY_LOW;
144
145hdma_sdio_tx.Init.FIFOMode=DMA_FIFOMODE_ENABLE;
146
147hdma_sdio_tx.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
148
149hdma_sdio_tx.Init.MemBurst=DMA_MBURST_INC4;
150
151hdma_sdio_tx.Init.PeriphBurst=DMA_PBURST_INC4;
152
153if(HAL_DMA_Init(&hdma_sdio_tx)!=HAL_OK)
154
155{
156
157Error_Handler();
158
159}
160
161__HAL_LINKDMA(hsd,hdmatx,hdma_sdio_tx);
162
163/*SDIOinterruptInit*/
164
165HAL_NVIC_SetPriority(SDIO_IRQn,6,0);
166
167HAL_NVIC_EnableIRQ(SDIO_IRQn);
168
169/*USERCODEBEGINSDIO_MspInit1*/
170
171/*USERCODEENDSDIO_MspInit1*/
172
173}
174
175}
2、用RTThreadStudio配置DFS組件和Fatfs組件:
Studio組件配置如下,如只需移植Fatfs掛載SD卡,則只需開啟“DFS”,“Fatfs”和“SDIO”即可,最大扇區(qū)也可以用默認(rèn)的512,我的是同時(shí)掛載了SPI接口的串行Flash,F(xiàn)lash的扇區(qū)是4096,所以修改了一下這個(gè)參數(shù):
3、掛載設(shè)備到文件系統(tǒng):
如上所述,在RTThread平臺(tái)上使用DFS,只要配置好組件(代碼里面就是宏定義),基本所有的初始化代碼都會(huì)自動(dòng)調(diào)用,無需用戶干涉。這里用戶只需要找到SD卡設(shè)備,然后掛載即可。
1#defineSDCardPath"/sdcard0"
2
3voidsdmnt(void)
4
5{
6
7intsta;
8
9if(rt_device_find("sd0")!=RT_NULL)
10
11{
12
13sta=dfs_mount("sd0",SDCardPath,"elm",0,0);
14
15if(sta==RT_EOK)
16
17{
18
19LOG_I("sdcardmounttoSDCardPath");
20
21}
22
23else{
24
25LOG_W("sdcardmounttoSDCardPathfailed!");
26
27}
28
29}
30
31}
32
33MSH_CMD_EXPORT(sdmnt,mountthesdcardtolocalfilesystem);
4、掛載后就可以按照dfs_posix.c里面的通用接口進(jìn)行調(diào)用使用了。當(dāng)然,dfs已經(jīng)實(shí)現(xiàn)了很多基于命令行的操作命令,比如“cd”,“l(fā)s”,“cat”等。使用方法基本和linux下差不太多,但功能上確實(shí)還是沒那么強(qiáng)大,這也是很正常的,如果也做那么強(qiáng)大,豈不是又變成了和linux一個(gè)量級(jí)的系統(tǒng)了,失去了輕量級(jí)可搶占系統(tǒng)的意義了。
————————————————
版權(quán)聲明:本文為RT-Thread論壇用戶「吉利咕嚕2022」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:
https://club.rt-thread.org/ask/article/ca44a91d66b137c9.html
你可以添加微信17775983565為好友,注明:公司+姓名,拉進(jìn)RT-Thread官方微信交流群!
愛我就給我點(diǎn)在看
點(diǎn)擊閱讀原文進(jìn)入官網(wǎng)
原文標(biāo)題:基于RTThread的DFS文件系統(tǒng)組件使用筆記
文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
RT-Thread
+關(guān)注
關(guān)注
31文章
1239瀏覽量
39443
原文標(biāo)題:基于RTThread的DFS文件系統(tǒng)組件使用筆記
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論