存储设备应用指导

本文档旨在介绍QuecPython存储设备类型、使用方式和常见问题,指导客户使用QuecPython存储设备。

概述

QuecPython设备存储系统分为内置存储系统和外置存储系统。内置存储系统一般是NAND flash或者NOR flash,外置存储一般是通过SPI、SDIO等接口外扩存储空间,可以是NOR flash、SD卡、EMMC等。使用存储的方式有两种:一种是挂载文件系统,用于存放数据和参数。常用的文件系统有littleFS、FATFS、EFS、SFFS文件系统等。另一种是不挂文件系统,直接裸分区访问,用于存放代码镜像、配置参数、GUI字库等。其中NOR flash可以直接运行代码,NAND flash不能直接运行代码。

内置存储

概述

设备内置的存储设备为模组的正常运作提供了必须的存储空间,用来存放镜像和数据。一般会按照作用划分为多个分区,每个分区相对独立。根据功能需求,决定是挂文件系统还是作为裸分区使用。

分区划分

不同芯片平台的模组有着不同的分区结构。总体来说可以分为以下几个部分:

a)程序存储分区:底层和应用层处理程序等镜像存放的区域。
b)出厂参数存储分区:射频参数,模组配置等存放的区域。并且会有个备份区,在数据异常损坏时,会从备份区恢复,保证模块正常运行。
c)文件系统分区:用于存放用户应用脚本和用户参数。

各平台分区结构

ECx00N & EGx00N & ECx00M & EGx00M系列

以EC600N型号为例:

分区 作用
bootloader 存储bootloader镜像
ptable 存储flash分区信息
fwcerts 存储固件证书
rd 存储可信数据
apn 存储APN镜像
cp 存储kernel侧镜像
dsp 存储网络协议栈镜像
rfbin 存储射频驱动镜像
logo 存储开机logo显示镜像
reserved 预留空间
fota_pkg 存储FOTA差分包
customer_app 存储APP镜像(QuecPython程序实现)
customer_fs 用户文件系统(对应磁盘"usr")
customer_backup_fs 用户文件备份系统(对应磁盘"bak")
backup_restore_info 存储备份还原信息
fota_param 存储FOTA升级参数
updater 存储FOTA升级程序镜像
erase_rd 存储flash擦除信息记录
nvm 系统参数文件系统
secdat 存储用户非易失数据
quec_cfg 移远自定义参数分区
factory_a 存储基础配置及射频等出厂参数
factory_b 存储基础配置及射频等出厂参数备份
ECx00U & EGx00U & ECx00G系列

以EC600U型号为例:

分区 作用
bootloader 存储bootloader镜像
ap 存储kernel侧AP镜像(应用处理)
customer_app 存储APP镜像(QuecPython程序实现)
fs 底层文件系统分区(存储FOTA差分包等)
secdat 存储用户非易失数据
fs_config 存储用户文件系统配置信息(用来动态调整"usr"和"bak"的大小)
customer_fs 用户文件系统(对应磁盘"usr")
customer_backup_fs 用户文件备份系统(对应磁盘"bak")
modem 存储kernel侧CP镜像(网络处理)
factory 存储基础配置及射频等出厂参数
xC200A系列

以EC200A型号为例:

分区 作用
NTIM 存储分区表信息
bootloader 存储bootloader镜像
MRD 存储底层可靠参数
MRD_backup 存储底层可靠参数备份
logo 存储开机logo显示镜像
cp 存储kernel侧镜像
customer_fs 用户文件系统(对应磁盘"usr")
customer_backup_fs 用户文件备份系统(对应磁盘"bak")
dsp 存储网络协议栈镜像
rf 存储射频信息
fota_pkg 存储FOTA升级备份
PSM backup 存储PSM备份
FAT map 底层文件系统目录
FAT sys 底层文件系统
customer_app 存储APP镜像(QuecPython程序实现)
block erase record 存储flash擦除记录
updater 存储FOTA升级程序镜像
FBF 存储tr69参数
fota_param 存储FOTA升级参数
QuecCfg 存储底层重要参数
PSM 存储底层网络协议参数
VSIM profile 保留
VSIM profile backup 保留
factory_a 存储基础配置及射频等出厂参数
factory_b 存储基础配置及射频等出厂参数备份
ECx00E系列

以EC800E型号为例:

分区 作用
header1 平台使用
header2 平台使用
bootloader 存储bootloader镜像
reserved 预留空间
fota-backup 存储FOTA升级备分
default reliable region 存储工厂参数,和Reliable Region区域互为备份
Reliable Region 存储工厂参数,和Default Reliable Region区域互为备份
ap 存储kernel侧镜像
customer_app 存储APP侧镜像(QuecPython程序实现)
fs 底层文件系统(存储FOTA差分包等)
customer_fs 用户文件系统(对应磁盘"usr")
customer_backup_fs 用户文件备份系统(对应磁盘"bak")
secdat 存储用户非易失数据
updater 存储FOTA升级程序镜像
hibernate backup 存储休眠时重要参数
PlatConfig(16K) 存储FOTA升级参数等
BG95 & BG600L系列

以BG95M3型号为例:

分区 作用
reserved 预留空间
bootloader 存储bootloader镜像
mibib 存储分区表信息
qdsp_swap 存储网络处理交换数据
efs2_factory efs2备份区域
efs2apps_factory efs2apps备份区域
efs2 CP(网络处理)文件系统
qdsp_paging 存储kernel侧CP相关镜像(网络处理)
qdsp 存储kernel侧CP镜像(网络处理)
qdsp_tiny 存储kernel侧CP相关镜像(网络处理)
tz 存储Trustzone镜像
rpm 存储RPM镜像
tz_devcfg 存储Trustzone配置镜像
ap 存储kernel侧AP镜像(应用处理)
adcb 存储audio镜像
apdp 存储应用调试镜像
loader_sti 存储测试镜像
multiimgoem 存储multiimgoem镜像
multiimgqti 存储multiimgqti镜像
scrub 存储FOTA差分包
secdata 存储安全相关的配置
misc 存储备份还原结果标志
customer_app 存储APP侧镜像(QuecPython程序实现)
customer_backup_fs 用户文件备份系统(对应磁盘"bak")
efs2apps AP(应用处理)文件系统(包含用户文件系统"usr")

各平台提供给用户的空间资源参考QuecPython 硬件平台支持

调整分区

由前面描述可知,提供给用户的可用空间分成两个区,分别为用户文件系统usr分区和用户文件备份系统bak分区。如果这2个分区的默认分布无法满足用户的应用需求,那么客户可以使用QPYcom工具调整该分区。可能需要调整分区的场景:需要存储的文件比较多,且部分文件不需要备份,如存储日志的应用。那么可以通过减小bak分区大小,增大usr分区大小来满足需求。

支持的模组:

目前只有ECx00N & EGx00N & ECx00M & EGx00M系列和ECx00U & EGx00U & ECx00G系列支持调整分区。且只支持用户文件系统usr和用户文件系统bak之间调整大小。

操作:

以EC600U型号为例

1、选择下载界面。

2、点击创建按钮创建项目。

3、命名为EC600U。

1、选择固件文件如QPY_OCPU_V0002_EC600U_CNLB_FW\QPY_OCPU_V0002_EC600U_CNLB_FW.pac。

2、勾选自动调整大小按钮。

3、点击合并固件按钮。

4、弹出对话框,其中显示usr和bak分区各自的大小及两者之和的大小。

1、修改usr分区的大小。

2、点击更新按钮。

3、bak分区大小自动更新为新的值。

4、点击OK按钮后开始合并固件,等待合并完成。

烧录合并完成的固件,并查询新的分区大小分布:

(ECx00N & EGx00N & ECx00M & EGx00M系列QPYcom工具该功能暂不支持,待开发。)

新增分区

使用场景:

在固件释放出去之后,用户需要在原有分区表上新增分区满足应用需求,如新增GUI字库分区用来存放字库文件。

支持的模组:

目前仅ECx00N & EGx00N & ECx00M & EGx00M系列支持新增分区。且只支持新增特定分区如GUI字库分区(需要搭配底层的GUI代码使用)。新增分区起始地址和最大size由QPYcom工具定死(ECx00N & EGx00N系列是将app镜像copy到RAM中运行,app的起始地址可以变动,新增空间时可以从reserved和customer_app分区挪空间。ECx00M & EGx00M系列是flash中直接运行app,app的起始地址不能变动,需要预先将多余空间分给customer_app分区,新增空间时可以从customer_app分区挪空间。)。

操作:

待补充

注意事项

文件系统分区最小size不能小于32KB。每个分区的起始地址和size需要是4KB的倍数。使用QPYcom工具调整分区时已经遵循了这个规则。

内置Flash烧录

烧录原理

烧录功能设计每个平台不尽相同,总的烧录机制设计如下:

a)进入下载模式,一般为配置特定引脚的电平或者下发特定的指令后重启设备,即可进入下载模式。此时执行ROM中固化的程序。由于是固化在芯片中的,所以存储空间和运行空间都有限,因此逻辑上比较简单。

b)在下载模式下,初始化UART 或 USB硬件通信,然后通过 UART 或 USB下载扩展烧录程序到芯片的 RAM 中。

c)交出控制权,跳转到 RAM中的扩展烧录程序,执行进一步的烧录功能。这个步骤的主要用途是下载整个固件到 flash 中。它的功能包括初始化Flash,分区,读写 Flash 等。其中上位机和设备的通讯机制一般采用“命令-应答”方式。上位机应用程序发起命令,模块收到后执行相应的指令,再将应答送回应用端。交互流程主要分为:连接、下载开始、下载中、下载完成。命令和数据都会进行CRC校验确保数据的可靠性。

d)烧录完成,重启设备运行已烧录的固件。

用户实际使用时只需要利用烧录工具加载固件,让设备进入下载模式,使用USB或UART连接线连接设备即可进行烧录。具体烧录操作细节参见本地升级指导文档。

烧录的分区概述

烧录固件时,针对不同分区处理方式不同。总体策略为镜像分区、用户文件系统usr分区、用户文件备份系统bak分区需要擦除并写入新的内容。安全数据区和底层参数区不擦写,保留之前的内容。

量产固件

之所以要制作量产固件,是因为QuecPython释放的官方固件只包含了平台层和QuecPython适配层的程序。用户需要基于QuecPython Modules API,使用python语言编写程序实现完整的应用的功能。而这些python程序需要以文件的形式存放在用户文件系统usr分区和用户文件备份系统bak分区中。调试阶段可以使用QPYcom下载脚本的功能将用户文件烧录到设备用户文件系统分区中。而量产时为了提高效率,需要将用户调试好的文件事先打包进QuecPython官方固件中,以实现QuecPython官方固件和用户文件一起烧录到设备中。总结大概步骤为:设备出厂时会带有默认固件,该固件不包含QuecPython相关功能。用户需要烧录QuecPython官方释放的固件,基于QuecPython平台开发调试好用户应用功能后,将用户的脚本文件和QuecPython固件打包成一个固件。将该固件作为最终量产固件烧录到所有设备中。制作量产固件细节可参考QuecPython 固件脚本合并

内置存储常见应用

程序镜像

存放设备运行需要的程序镜像,一般包括bootloader、kernel、app几个部分。

文件系统

将指定分区挂载成文件系统,用以存放数据。这样可以使用文件的形式对数据进行管理,包括创建、读、写、删除等操作。适合数据量大,经常修改且非关键数据的存储。文件系统使用细节参考文件系统应用指导

GUI 字库

将指定分区用来存储GUI显示所需的字库内容。该字库内容包含了不同的字体信息,且有固定的结构。所以需要在烧录固件时一并将字库文件烧录到设备的指定分区。这样GUI显示程序可以通过flash操作接口直接访问字库内容,相比于文件系统的方式速率更快,可以提高GUI显示的实时性。

裸分区操作

如安全数据分区,将指定分区用来存储用户安全数据,以达到数据掉电保存的目的。数据来源为设备运行过程中用户实时产生的内容。所以,该分区不需要事先烧录特定内容到指定分区,且烧录时不擦除该分区。这种方式适合数据量小,不经常修改且关键数据的存储。接口用法参考SecureData - 安全数据区

外置存储

概述

模组内置存储空间主要用于存放代码镜像和参数,剩余给客户可用的空间有限。如果需要额外的存储空间,就需要外挂存储设备。比如NOR flash、SD卡、NAND flash等。硬件通信接口有SDIO 接口和SPI 接口,目前支持的方式有:SPI NOR flash、SDIO SD卡、SDIO EMMC、SPI SD卡。

SPI NOR flash应用

原理概述

该种使用方式是在模组的外面通过SPI硬件引脚连接一个NOR flash存储芯片。然后通过应用程序初始化该flash驱动之后,就可以对其进行读写等操作。具体选用哪一款flash芯片,需要用户根据自己的空间需求决定。根据通信的SPI引脚个数可分为4线外挂flash和6线外挂flash方案。其中6线flash方案比4线的方案通信速率更高,所以6线外挂flash方案可以直接运行程序。

应用场景

程序镜像

使用外置flash指定分区存放QuecPython程序镜像,以便可以打开底层更多功能特性,满足用户丰富的应用场景需求。如前所述,该种方案必须使用6线SPI NOR flash。该种方式程序运行和放置在内置存储中的程序运行效果一致。目前仅ECx00U&EGx00U&ECx00G系列特定型号EC600U_CNLB_EXTFS8M、EC600U_CNLC_EXTFS8M支持该特性。

文件系统

类似于内部存储,可以将外置flash指定分区挂载成文件系统,用以存放数据。这样可以使用文件的形式对数据进行管理,包括创建、读、写、删除等操作。适合数据量大,经常修改且非关键数据的存储。外置flash文件系统使用细节参考文件系统应用指导

GUI 字库

类似于内部存储,可以将外置flash指定分区用来存储GUI显示所需的字库内容。该字库内容包含了不同的字体信息,且有固定的结构。所以需要在烧录固件时一并将字库文件烧录到设备的指定分区。这样GUI显示程序可以通过flash操作接口直接访问字库内容,相比于文件系统的方式速率更快,可以提高GUI显示的实时性。

支持的模组

当前仅ECx00N & EGx00N & ECx00M & EGx00M系列和ECx00U & EGx00U & ECx00G系列支持外挂SPI NOR flash。

应用时的注意事项

硬件连接

采用的是SPI通信总线,具体选用哪一路SPI引脚需要根据硬件资源支持和用户使用情况决定。

针对4线SPI NOR flash方案,引脚细节可以参考class SPI – SPI通信中关于SPI引脚对应关系的介绍。由于可能会有其他外设如LCD也需要使用SPI通信,这时需要用户提前分配好硬件资源,各自使用不同的SPI通道,避免和NOR flash冲突的情况。

针对6线SPI NOR flash方案,当前仅ECx00U & EGx00U & ECx00G系列支持,引脚使用情况,需要参考如下表格:

用途 引脚功能 EC200U引脚号 EC600U引脚号 EG915U引脚号 EC800G引脚号 EC600G引脚号
SPI1 SPI_FLASH_CS 26 58 5 79 63
SPI_FLASH_CLK 27 61 4 101 66
SPI_FLASH_SIO0 24 59 6 100 67
SPI_FLASH_SIO1 25 60 7 108 65
SPI_FLASH_SIO2 13 69 1 109 137
SPI_FLASH_SIO3 135 70 20 107 62
SPI2 SPI_FLASH_CS 124 63 106
SPI_FLASH_CLK 125 66 116
SPI_FLASH_SIO0 123 67 105
SPI_FLASH_SIO1 122 65 16
SPI_FLASH_SIO2 121 137 108
SPI_FLASH_SIO3 119 62 92

如表格所示,针对ECx00U & EGx00U系列,如果用户不使用MIPI LCD功能,仅外接6线SPI NOR flash。那么可选择上面两路SPI中任意一路作为flash SPI通信接口。如果要同时支持外置6线SPI NOR flash和MIPI LCD功能,则flash SPI通信接口必须选用SPI2这路引脚。针对ECx00G系列,当前只有一路引脚可作为flash SPI通信接口。

添加型号

用户选好NOR flash芯片型号之后需要查看设备程序是否支持该flash型号。可以通过QPYcom工具加载固件版本查看该固件当前已支持的flash型号(该工具功能待开发)(待补充)。

如果flash型号不在设备支持列表中,需要添加flash型号到设备中。可以在使用QPYcom工具合并固件的时候添加指定的flash型号(该工具功能待开发)(待补充)。

分区调整

在固件释放出去之后,用户需要在原有分区表上新增外置flash分区满足应用需求,如新增GUI字库分区用来存放字库文件。目前仅ECx00N & EGx00N & ECx00M & EGx00M系列支持新增分区。如新增文件系统分区、GUI字库分区等(需要搭配底层的GUI代码使用)。新增分区起始地址和size可由QPYcom工具指定。同理,用户也可以调整外置flash分区,如调整文件系统分区和GUI字库分区分别占用的大小。具体操作待QPYcom工具支持后补充(待补充)。

烧录

带外置flash的固件烧录方式和内置flash的固件一致。需要注意的是外置flash烧录依赖于外置的flash芯片,需要保证外置flash通信是成功的。需要在制作量产固件时指定烧录工具的SPI端口信息,具体操作待QPYcom工具支持后补充。如果下载失败,检查flash芯片是否正确焊接,spi引脚的连接是否正确。

量产固件

制作带外置flash功能的量产固件和内置flash的方式总体一致。特别的是外置flash需要配置flash的型号、指定spi port和分区划分。具体操作待QPYcom工具支持后补充。(待补充)

软件接口

其中文件系统分区使用的场景,文件系统需要执行挂载操作后才能使用,外置4线spi nor flash文件系统初始化接口用法参考注册littleFS存储设备 - SPI NOR FLASH。外置6线spi nor flash仅特定型号特定固件支持,且不支持用户进行挂载操作,仅作内部使用。

读写速率

由于外置flash采用的是4线spi通信,内置flash采用的是6线spi通信。且内置flash spi clock比外置flash spi clock要高。综上因素导致外置flash的速率低于内置flash。大约相差4~8倍。所以在使用外置flash开发应用时,需要考虑速率瓶颈对业务的影响,如实时性要求高的GUI显示功能,涉及到图片文件和字库文件的存储和访问。针对这种应用场景,可以采用缓存机制减少影响,将近期常访问的数据缓存到RAM中,下次访问相同的数据时直接从RAM中读取。该机制一般由固件底层实现,用户可以配置缓存的空间大小和数量。

SD卡应用

原理概述

SD 卡(Secure Digital Memory Card)是一种基于半导体闪存工艺的存储卡。按照外观可以分为SD、mini-SD和Micro-SD。按照SD卡的容量,可以分为SDSC(SD Standard Capacity)(容量不大于2GB)、SDHC(SD High Capacity)(容量大于2GB不大于32GB)、SDXC(SD Extended Capacity)(容量大于32GB不大于2TGB)三种标准。通信接口可以选择SDIO接口或者SPI接口。

SDIO接口

SDIO接口方式,使用SDIO总线与SD卡进行通信。SDIO(Secure Digital Input and Output)是安全数字输入输出接口,是从SD内存卡接口的基础上演化出来的一种外设接口。SDIO接口兼容以前的SD内存卡,并且可以连接支持SDIO接口的设备。SDIO信号有三种模式,“单线模式”、“4线模式”、“SPI模式”。这里使用的是“4线模式”。

SPI接口

SPI接口方式,使用通用的SPI总线与SD卡进行通信,包括初始化SD卡、对SD卡读、写操作等。

应用时的注意事项

硬件连接

SDIO接口的硬件引脚使用参考硬件设计手册SD卡接口相关章节。SPI接口的硬件引脚使用参考class SPI – SPI通信中关于SPI引脚对应关系的介绍。

文件系统类型

SD卡功能采用的文件系统是FATFS,支持Windows兼容的FAT32格式。

软件接口

SD卡功能需要执行文件系统挂载操作后才能使用,SPI SD卡具体接口用法参考注册存储设备 - SPI - SD卡,SDIO SD卡具体接口用法参考注册存储设备 - SDIO - SD卡

热插拔

当前仅SDIO SD卡支持卡插拔检测功能,而且需要搭配特定代码使用,具体接口用法参考设置SD卡检测管脚

读写速率

由于SDIO接口有4条数据线进行数据传输,而SPI只有一条数据线,所以SDIO模式读写速率会比SPI模式高。SDIO SD卡write速率可以达到5MB/s,SPI SD卡write速率可以达到600KB/s。

应用场景

常用场景有存放音频文件(使用流播放的方式播放音频文件)、存放历史定位信息、存放日志等。

支持的模组

SDIO SD卡功能仅ECx00U & EGx00U系列支持。SPI SD卡功能仅ECx00N & EGx00N系列支持。

常见问题

挂载失败

如果出现挂载文件系统失败的情况,说明硬件没有通信成功。需要检查SD卡接口引脚是否连接正确且牢固。同时检查SD卡供电电压是否满足SD卡标准要求。

格式化

如果使用过程中出现文件系统异常,或者文件系统空间存满的情况,可以调用格式化接口对SD卡进行格式化。具体接口用法参考挂载文件系统

EMMC应用

原理概述

EMMC(Embedded Multimedia Card)嵌入式多媒体卡是一种新的存储技术,由MMC协会订立。主要用于印刷电路板的嵌入式非易失性存储器系统。不可随意移动,是永久性的电路板附件。EMMC和SD的技术本质是一样的,都是从MMC规范演化而来,使用相同的总线规范,SD强调的是安全和数据保护,EMMC强调的是嵌入式的多媒体存储。

通信接口

采用SDIO通信接口。

使用方式

EMMC功能需要执行文件系统挂载操作后才能使用,具体接口用法参考待补充。

支持的模组

仅EC200ACNLA型号支持。

常见问题

NOR flash寿命

NOR flash最大擦写次数大概是10万次。使用过程中需要避免频繁擦写操作。NOR flash的接口简单,数据操作少,位交换操作少。因此可靠性高,认为不会出现坏块,不需要进行坏块管理。

NAND flash寿命

NAND flash最大擦写次数大概是100万次,使用过程中需要避免频繁擦写操作。NAND Flash接口和操作均相对复杂,位交换操作也很多,因此出现问题的几率要大得多,坏块不可避免。需要进行坏块管理,坏块管理机制由底层代码实现。

NOR flash和NAND flash特性差异

NOR flash可以直接运行程序,而NAND flash不行。由于对NAND flash闪存的操作都是以块和页为单位的,所以在向NAND flash闪存进行大量数据的读写时,速度要快于NOR flash。NOR flash的容量较小,一般在1~16MB左右。NAND Flash闪存的容量比较大,最大容量己达到8GB。