0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何通过SD卡和ymodem串口升级固件

RTThread物联网操作系统 来源:RTThread物联网操作系统 2020-09-04 14:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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&&dataOffset< 0x92000000) 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 3/*exporttofinsh*/ 4FINSH_FUNCTION_EXPORT(ReadUpdataToSpiflash,ReaddataToSpiflashtest); 5 6#ifdefFINSH_USING_MSH 7staticvoidcmd_updata(intargc,char*argv[]) 8{ 9char*filename; 10 11if(argc==2) 12{ 13filename=argv[1]; 14} 15else 16{ 17filename=DEFAULT_FILENAME; 18recv_partition=DEFAULT_DOWNLOAD_PART; 19LOG_I("Defaultsavefirmwareondownloadpartition. "); 20} 21ReadUpdataToSpiflash(filename); 22} 23FINSH_FUNCTION_EXPORT_ALIAS(cmd_updata,__cmd_updata,ReaddataToSpiflashtest); 24#endif/*FINSH_USING_MSH*/ 25#endif/*RT_USING_FINSH*/

添加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

    文章

    583

    浏览量

    67777
  • 串口
    +关注

    关注

    15

    文章

    1607

    浏览量

    81932
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44273

原文标题:【DIY数字仪表】RT-Thread移植Touchgfx使用sd卡升级固件和图片资源(4)

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SD NAND、TFSD的应用领域大揭秘

    在如今这个数据爆炸的时代,各类存储设备犹如繁星般闪耀,而SD NAND、TFSD更是其中的佼佼者。它们看似相似,实则各有千秋,在不同的领域和场景中发挥着独特的作用。今天,就让我们
    的头像 发表于 11-30 15:16 400次阅读
    <b class='flag-5'>SD</b> NAND、TF<b class='flag-5'>卡</b>、<b class='flag-5'>SD</b><b class='flag-5'>卡</b>的应用领域大揭秘

    解锁SD NAND、TFSD的应用密码

    在科技飞速发展的今天,数据存储的需求渗透到生活与工作的每一个角落——从手腕上的智能手表,到专业摄影师的相机,再到工厂里的工业路由器,都离不开高效可靠的存储介质。SD NAND、TFSD
    的头像 发表于 11-24 11:04 229次阅读
    解锁<b class='flag-5'>SD</b> NAND、TF<b class='flag-5'>卡</b>、<b class='flag-5'>SD</b><b class='flag-5'>卡</b>的应用密码

    Bootloader固件升级的步骤

    ,也可以不更新,在项目中,我们通常会对 FW 版本号进行对比,会将 MCU 中的 App 程序更新最新的版本,起到固件升级的效果。更新的话,BootLoader 更新完程序后,跳转到新程序运行;不更新
    发表于 11-19 07:41

    解锁存储密码:SD NAND、TFSD的应用全景

    在数据洪流的时代,存储介质就如同数字世界的基石,支撑着各类设备的正常运转。SD NAND、TFSD,虽同属NAND Flash存储介质家族,却因各自独特的“个性”,在不同领域绽放
    的头像 发表于 10-29 14:24 212次阅读

    使用RTT的维护云进行远程固件升级(OTA),怎么没有网络升级的方式?

    使用RTT的维护云进行远程固件升级(OTA),怎么没有网络升级的方式的?只有蓝牙,近距离的固件升级。详细如图所示,只有蓝牙,没有连接互联网,
    发表于 10-13 06:36

    使用ymodem_ota时如何更换串口

    现在使用串口1可以正常使用ymodem_ota进行固件升级,但是现在项目需要使用串口1来进行其他作用,求怎么把
    发表于 09-25 06:17

    请问OTA是否一定依赖于ymodem协议?

    缺少什么步骤,通过对比发送的固件内容(日志打印)与“downloader”内容一致。 3,现在的需求是通过串口2,接收上位机发送过来的固件
    发表于 09-17 08:25

    大文件高效传输不求人!Ymodem协议实战示例与核心技巧揭秘

    分享优化传输效率的核心技巧! Ymodem—— 是一种基于串行通信的文件传输协议,由Chuck Forsberg于1980年代初期在Xmodem协议基础上改进而来。通过引入1024字节数据块和批量文件传输机制,显著提升传输效率与可靠性。   主要应用于嵌入式系统
    的头像 发表于 07-28 17:38 732次阅读
    大文件高效传输不求人!<b class='flag-5'>Ymodem</b>协议实战示例与核心技巧揭秘

    SD—雷龙 SD NAND

    一、SD介绍 1.基本介绍 本质:nand flash + 控制芯片 1.SD ,Secure Digital Card,称为安全数字
    的头像 发表于 07-21 17:59 3234次阅读
    <b class='flag-5'>SD</b><b class='flag-5'>卡</b>—雷龙 <b class='flag-5'>SD</b> NAND

    【嵌入式开发】SD—雷龙 SD NAND

    固件可定制,LGA-8封装,标准SDIO接口,兼容SPI,兼容拔插式TF/SD,可替代普通TF/
    发表于 07-21 17:56

    创龙 瑞芯微 RK3562 国产 2GHz 四核A53 工业开发板—Linux系统启动制作及系统固化

    本文主要演示SD启动制作,以及将Linux系统镜像固化至eMMC的方法。使用瑞芯微创建升级磁盘工具SDDiskTool_v1.78可将Linux系统镜像通过读卡器固化至Micro
    的头像 发表于 07-04 10:15 1262次阅读
    创龙 瑞芯微 RK3562 国产 2GHz 四核A53 工业开发板—Linux系统启动<b class='flag-5'>卡</b>制作及系统固化

    什么是SD、TF写保护?写保护的常见原因

    部分SD、TF适配器或套上设有物理写保护开关,当开关滑动到"锁定"位置时,卡片会自动进入写保护状态。这是最常见也是最容易解决的写保护原因。
    的头像 发表于 06-10 00:00 3915次阅读
    什么是<b class='flag-5'>SD</b><b class='flag-5'>卡</b>、TF<b class='flag-5'>卡</b>写保护?写保护的常见原因

    如何使用IFX ePower BootStrapLoader工具通过lin通信升级固件

    如何使用 IFX ePower BootStrapLoader 工具通过 lin 通信升级我的固件
    发表于 04-18 06:56

    STM32/GD32开发板基本串口RS232\\RS485通信及CAN接口 usbhid升级 U盘升级 sd升级升级学习方案开发板

    STM32F103/STM32F407/gd32F103/GD32F303开发板,例程用标准库开发。基本串口RS232\\RS485通信及CAN接口 usbhid升级 U盘升级 sd
    发表于 02-27 14:56

    【OTA升级】无需数据线,一条命令即可完成固件升级

    OTA无线升级过程视频演示:OTA介绍OTA(Over-The-Air,空中升级)是一种通过无线通信技术实现远程更新设备固件或软件的方法。设备批量投入使用后,由于部署范围太广、设备数量
    的头像 发表于 12-11 01:00 5435次阅读
    【OTA<b class='flag-5'>升级</b>】无需数据线,一条命令即可完成<b class='flag-5'>固件</b><b class='flag-5'>升级</b>!