1.文件系統簡介
1.1 DFS 簡介
DFS( Device File System)是一種抽象的文件機制,RT-Thread中對文件系統的相關操作實際上都是通過操作DFS實現,也就是說DFS是對各種文件系統的抽象。DFS使的其他部分無須關心不同文件系統之間的差異,使得RT-Thread可以支持多種類型的文件系統。
1.2 DFS 框架
RT-Thread DFS 組件的主要功能特點有:
為應用程序提供統一的 POSIX 文件和目錄操作接口:read、write、poll/select 等。
支持多種類型的文件系統,如 FatFS、RomFS、DevFS 等,并提供普通文件、設備文件、網絡文件描述符的管理。
支持多種類型的存儲設備,如 SD Card、SPI Flash、Nand Flash 等。
DFS 的層次架構如下圖所示,主要分為 POSIX 接口層、虛擬文件系統層和設備抽象層。
1.3 elm-FAT文件系統簡介
FatFs 是一個通用的文件系統(FAT/exFAT)模塊,用于在小型嵌入式系統中實現FAT文件系統。
1.4 使用流程
初始化 DFS 組件。
初始化具體類型的文件系統。
在存儲器上創建塊設備。
格式化塊設備。
掛載塊設備到 DFS 目錄中。
當文件系統不再使用,可以將它卸載
1.5 注冊elm-FAT文件系統
elm-FAT文件系統注冊過程如下圖所示:
1.6 掛載elm-FAT文件系統
1voidsd_mount(void*parameter) 2{ 3while(1) 4{ 5rt_thread_mdelay(500); 6if(rt_device_find("sd0")!=RT_NULL) 7{ 8if(dfs_mount("sd0","/fatfs","elm",0,0)==RT_EOK) 9{ 10LOG_I("sdcardmountto'/fatfs'"); 11break; 12} 13else 14{ 15LOG_W("sdcardmountto'/fatfs'failed!"); 16} 17} 18} 19} 20 21intstm32_sdcard_mount(void) 22{ 23rt_thread_ttid; 24 25tid=rt_thread_create("sd_mount",sd_mount,RT_NULL, 261024,RT_THREAD_PRIORITY_MAX-2,20); 27if(tid!=RT_NULL) 28{ 29rt_thread_startup(tid); 30} 31else 32{ 33LOG_E("createsd_mountthreaderr!"); 34} 35returnRT_EOK; 36} 37INIT_APP_EXPORT(stm32_sdcard_mount);
在文件系統操作表中找出elm文件系統
檢查"/fatfs"路徑是否存在
檢查elm文件系統是否已經掛載在文件系統表中
檢查文件系統表是否有空余,如果有,把空余地址指向elm文件系統
注冊文件系統
調用elm文件系統的掛載接口
1.7 測試elm-FAT文件系統
在根目錄下使用ls命令,可以查看目錄:
2.設計界面
使用TouchGFX 4.14.0 Designer添加設置界面。增加進度條,和兩個按鈕,以及固件版本和更新時間的記錄(記錄環境變量使用的是easyflash軟件包)。我這個界面設計的比較簡陋,重在實現功能,審美好的人,歡迎重新設計這個界面。
依然利用TouchGFX的MVP架構,將UI命令傳遞到后臺。
參考前邊的文章:【DIY數字儀表】使用TouchGFX的MVP架構來實現GUI和硬件的雙向交互(2)
3.添加sd卡或者spi flash拷貝到SDRAM的代碼
1boolTouchGFXHAL::blockCopy(void*RESTRICTdest,constvoid*RESTRICTsrc,uint32_tnumBytes) 2{ 3uint32_tdataOffset=(uint32_t)src; 4if(dataOffset>=0x90000000&&dataOffset0x92000000) 5????{ 6????????char?*updata_pciture; 7 8????????/*?get?the?updata?pciture?location?from?Env?*/ 9????????updata_pciture?=?ef_get_env("updata_pciture");?? 10 11????????if(0?==?strcmp(updata_pciture,?"spi_flash")) 12????????{ 13????????????const?struct?fal_partition?*part; 14????????????part?=?fal_partition_find("tgfx"); 15 16????????????dataOffset?=??dataOffset?-?0x90000000; 17????????????//?for?copying?data?from?there. 18????????????if?(part?!=?RT_NULL) 19????????????{ 20????????????????fal_partition_read(part,?dataOffset,?(uint8_t?*)dest,?numBytes); 21????????????} 22????????????return?true; 23????????} 24????????else 25????????{ 26????????????int?fd; 27????????????struct?statfs?buffer; 28????????????if(rt_device_find("sd0")?!=?RT_NULL) 29????????????{ 30????????????????if?((dfs_statfs("/",&buffer)?==?RT_EOK)|(dfs_mount("sd0",?"/",?"elm",?0,?0)?==?RT_EOK)) 31????????????????{ 32????????????????????fd?=?open("/ER_EROM1",?O_RDONLY,?0);???????????????????????? 33????????????????????if?(fd?0) 34????????????????????{ 35????????????????????????rt_kprintf("open?file?for?read?failed "); 36????????????????????????return?false; 37????????????????????} 38????????????????????dataOffset?=??dataOffset?-?0x90000000; 39????????????????????lseek(fd,?dataOffset,?SEEK_SET); 40????????????????????//?for?copying?data?from?there. 41????????????????????read(fd,?(uint8_t?*)dest,?numBytes); 42????????????????????close(fd); 43????????????????} 44????????????????return?true;???? 45????????????} 46????????????else 47????????????{ 48????????????????return?false; 49????????????} 50????????} 51????}??? 52????else 53????{ 54????????//?For?all?other?addresses,?just?use?the?default?implementation. 55????????//?This?is?important,?as?blockCopy?is?also?used?for?other?things?in?the?core?framework. 56????????return?HAL::blockCopy(dest,?src,?numBytes); 57????}??? 58}
此代碼用來根據設置的環境變量選擇從sd卡還是spi flash拷貝圖片。
4.添加msh命令
1#ifdefRT_USING_FINSH 2#include
添加msh命令,使通過msh命令也能升級固件,將SD的圖片資源拷貝到spi flash的功能
updata命令默認將從sd卡中讀取ER_IROM1.rbl固件,將固件下載到download分區。
通過updata /ER_EROM1命令,可以將sd中的圖片資源拷貝到tgfx分區(spi flash中圖片所在的位置)中
5.生成bin文件
在keil中添加以下命令,然后便會在binary目錄下,生成外部flash和內部flash的bin文件:
利用rt_ota_packaging_tool工具,對內部flash燒錄bin文件進行加密和壓縮,然后將生成的ER_IROM1.rbl文件和ER_EROM1文件拷貝到SD卡中:
6.制作BootLoader
參考以下文章:STM32通用Bootloader——FOTA
rt_fota集成了ymodem的協議,在沒有app的情況下,也可以通過rt_fota的ymodem命令給固件和圖片資源升級。
ymodem_ota命令,默認將固件下載到download分區:
ymodem_ota -p tgfx命令,可以將sd中的圖片資源拷貝到tgfx分區中:
-
SD卡
+關注
關注
2文章
566瀏覽量
63959 -
串口
+關注
關注
14文章
1555瀏覽量
76647 -
RT-Thread
+關注
關注
31文章
1293瀏覽量
40228
原文標題:【DIY數字儀表】RT-Thread移植Touchgfx使用sd卡升級固件和圖片資源(4)
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論