首页
/ MicroPython SAMD端口多闪存设备支持的技术实现分析

MicroPython SAMD端口多闪存设备支持的技术实现分析

2025-05-11 22:35:30作者:段琳惟

背景介绍

MicroPython的SAMD端口目前存在一个功能限制:无法同时访问MCU内部闪存和外部QSPI闪存。这一限制影响了某些特定应用场景的实现,特别是需要安全远程固件升级的系统。本文将深入分析这一技术问题的背景、现有实现方案以及可能的改进方向。

现有实现的问题

当前SAMD端口的闪存驱动实现存在两个主要限制:

  1. 单设备限制:modsamd.c模块只允许启用一种闪存类型(MCU闪存、SPI闪存或QSPI闪存),通过编译时宏定义选择。如果尝试启用多个,会导致编译错误。

  2. 功能局限

    • 闪存驱动仅暴露VFS协议方法,隐藏了原始块操作方法
    • 不支持闪存分区概念,整个闪存设备被分配给VFS使用
    • 与PyBoard的Flash设备不同,缺少start和len参数来定义独立区域

应用场景需求

典型的远程固件升级流程需要:

  1. 应用程序下载固件到文件系统
  2. 验证固件完整性
  3. 将新版本写入闪存独立区域
  4. 通过引导加载程序完成固件切换

这一流程需要:

  • 同时访问文件系统区域和原始闪存区域
  • 能够操作MCU闪存和外部闪存
  • 确保在意外断电情况下的恢复能力

技术实现方案

方案一:多闪存设备支持

通过修改modsamd.c,允许同时启用多种闪存类型,并为每种类型提供独立的类名:

  • samd.MCUFlash
  • samd.SPIFlash
  • samd.QSPIFlash

同时保留samd.Flash作为向后兼容的接口,通过配置宏指定默认使用的闪存类型。

方案二:闪存分区支持

修改闪存驱动程序(samd_flash.c等),增加以下功能:

  1. 支持start和len参数定义闪存区域
  2. 添加vfs_start和vfs_size字段管理文件系统区域
  3. 修改块操作方法,考虑分区偏移量
  4. 防止分区参数被重复修改

方案三:原始块访问扩展

在保持现有VFS接口的同时,提供原始闪存块访问能力:

  1. 通过未检查参数的块操作方法访问非文件系统区域
  2. 允许负块号访问文件系统之前的区域
  3. 需要应用程序自行管理访问边界

实现细节分析

闪存驱动修改

闪存驱动需要增加以下关键修改:

  1. 在make_new函数中添加start和len参数处理
  2. 初始化vfs_start和vfs_size字段
  3. 修改readblocks/writeblocks方法,增加分区偏移
  4. 调整ioctl调用,反映分区大小

链接脚本调整

需要修改链接脚本,确保:

  1. MCUFlash可以访问适当的闪存区域
  2. 不覆盖引导加载程序和运行中的应用程序
  3. 保留足够的空间用于固件更新

安全考虑

当前实现存在一些安全隐患:

  1. 块操作方法缺乏参数检查
  2. 无法自动发现文件系统区域
  3. 应用程序需要自行确保不破坏文件系统
  4. 多次实例化可能导致配置不一致

未来改进方向

  1. 正式支持闪存分区功能
  2. 提供安全的原始块访问API
  3. 增加闪存区域管理工具
  4. 完善参数检查和边界保护

结论

MicroPython SAMD端口的多闪存支持功能对于高级应用场景至关重要。通过合理的驱动修改和接口扩展,可以实现同时访问多种闪存设备的能力,为远程固件升级等复杂功能提供基础支持。开发者可以根据具体需求选择适合的实现方案,并注意相关的安全边界问题。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
165
2.05 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
60
16
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
954
562
apintoapinto
基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
Go
22
0
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
1.01 K
396
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
407
387
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
199
279
giteagitea
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
17
0