1.概述
QCC300X升级功能提供了在外部Flash中下载和升级组件的能力,适用于QTIL语音设备和音乐设备,升级可用于更新或修改:
· 外部Flash应用程序
· ROM固件补丁(由高通公司提供)
· ROM DSP补丁(由高通公司提供)
· 外部Flash中的文件系统
· 外部Flash中的音频提示数据文件
升级提供了一个一步升级过程,在升级操作开始之前,将包含许多升级组件的单个文件下载到外部Flash中。
2.外部Flash分区
升级要求Flash的物理分区布局与应用程序配置中的逻辑分区映射兼容。物理分区布局只能通过SPI接口设置,一旦初始设备镜像被刷新,就不能更改。
要使QCC300X设备可升级,它必须是双分区。也就是说,必须有两个大小相同的分区。这是因为其中一个分区将由VM应用程序使用,另一个分区用于在升级下载期间存储新数据。
2.1默认的分区布局
QCC300x ADK包含默认的Flash分区表,并为每个受支持的设备匹配逻辑分区配置。默认的分区布局表可以在< QCC300x ADK安装文件夹>\apps\sink\<device_variant>.ptn中找到。
默认的分区布局有单独的可升级分区:
· 固件和或DSP补丁
· 音频提示数据
· PSFS文件
· VM应用程序(包括应用程序配置)及其他数据。
2.2物理分区表
nvscmd工具使用一个分区表文件(.ptn文件)来设置闪存芯片中的分区结构。
分区表定义的格式为:
物理分区号、16位字大小(K=1024)、分区类型、分区内容(例如要刻录到分区上的文件或(擦除)要擦除分区内容)。
下面是QCC3003设备的默认分区表文件:
0, 8K, PS, (none) # For PS Store
1, 32K, RO, qcc3003_patch_bundle.xuv # Logical #0 : For DSP & firmware patches #0,1
2, 32K, RO, (erase) # Logical #0 : For DSP & firmware patches #0,2
3, 612K, RO, audio_prompts.xuv # Logical #1 Audio prompts #1,1
4, 612K, RO, (erase) # Logical #1 Audio prompts #1,2
5, 300K, RO, qcc3003.xuv # Logical #2 Main application image and other files. #2,1
6, 300K, RO, (erase) # Logical #2 Main application image and other files. #2,2
7, 8K, RO, sink_system_qcc300x.xuv # Logical #3 PSFS #3,1
8, 8K, RO, (erase) # Logical #3 PSFS #3,2
9, *, RS, (erase)
2.3逻辑分区映射表
逻辑分区映射表的每一行定义一个表示一个或两个物理分区的逻辑银行。
列定义为:
· 逻辑分区索引
· 逻辑分区的类型
◆ Single (erased)
▪ QCC300x设备不支持这种类型
◆ Double (mounted)
▪ 双分区文件系统分区
▪ 升级后文件系统表将被更新,以便升级后的分区作为只读文件系统安装在设备引导上
◆ Double (unmounted)
▪ 双分区数据分区
▪ 升级后的活动分区将不会添加到只读文件系统
▪ 目前QC300x设备不使用这种类型,但如果客户有自己的非文件系统分区类型,则支持这种类型
· 逻辑分区使用的第一个物理分区
· 逻辑分区使用的第二个物理分区,仅对双分区有效
2.4初始化设备Flash
图2.3显示了刷新新QCC300X设备时使用的输入初始分区。它还显示:
· 物理分区表由nvscmd工具用于闪存设备,但不存储在设备本身
· 逻辑分区映射表存储在VM应用程序配置集中
虚拟机应用程序配置集内置于应用程序本身中—它不是单独的文件。
3.生成生产固件
生成生产固件所需的命令行工具位于QCC300x ADK安装之后的<QCC300x ADK安装文件夹>\tools\bin文件夹中(如:D:\ADK_QCC300x.WIN.1.0.167\tools\bin)。
所有QCC300x升级都根据创建的(OEM,密钥可以随意命名)密钥对进行验证:
· OEM私钥用于对升级文件内容进行签名
· OEM公钥被写入设备PS存储中,用于验证下载的升级文件的内容
· 如果QCC300x升级文件没有OEM私钥签名,或者设备PS store不包含OEM公钥,升级将会失败。
(1)使用 dfukeygenerate命令创建一个用于升级验证的密钥对
dfukeygenerate –o oem,生成oem.public.key和oem.private.key
(2)修改默认分区表文件
默认的分区布局表可以在< QCC300x ADK安装文件夹>\apps\sink\<device_variant>.ptn中,根据设备实际Flash大小修改ptn文件。
(3)编译运行程序
对于DFU升级,需修改配置以进入DFU模式。
对于OTAU升级,使能如下选项:
Device Upgrade
GAIA
如果需要支持BLE OTA,使能如下选项:
Enable BLE/GATT
Enable GATT GAIA Server
(4)将公钥文件转换为.psr文件
dfukeyinsert -v -o oem_key -ka oem.public.key,生成oem_key.psr
(5)将PSKeys merge到设备上
pscli -usb <SPIPORT> merge oem_key.psr
(6)使用量产工具dump出生产固件
4.生成升级文件
生成升级文件的过程是:
· 为每个要升级的分区创建一个新的只读分区文件
注意:升级分区文件中不需要包含所有分区,只包含要更改的分区。
· 定义升级文件的内容
· 生成升级文件,并用OEM私钥签名
4.1升级内容
升级文件包括:
· 包含设备型号、升级版本和其他数据的标题部分
· 一个或多个分区数据段,包含将要升级分区的数据
· 包含验证密钥的页脚部分
升级的内容在升级分区文件(.upg)中指定,upgradefilegen.exe从该文件分析并创建升级文件。
4.1.1 设置设备变量
upg文件中必须包含device_variant定义行,并且必须与设备的产品id对应,如果他们不匹配升级将被拒绝。
4.1.2设置升级版本
升级文件包含升级后应用程序的新版本的版本信息,以及可以安装升级应用程序的先前版本的信息。开发者可以控制升级版本,以及它可以安装到哪些以前的版本上。
4.1.3定义要升级的分区
通过在.upg文件中添加一行来将分区添加到升级文件中,行格式为:
<逻辑分区号> <逻辑分区类型> <完整路径文件名>
下面是用于升级应用程序和音频提示分区的.upg文件示例:
device_variant QC3003
# Set the upgrade version and previous version(s)
# that are compatible to upgrade from. The minor
# version can be '*' to act as a wildcard.
upgrade_version 2.1
compatible_upgrade 1.*
compatible_upgrade 2.*
# Set the ps config version and previous version(s)
# that are compatible to upgrade from (hex values)
ps_config_version 2
ps_prev_config_version 0
ps_prev_config_version 1
# Filesystem containing audio prompts
1 3 audio_prompts.xuv
# Filesystem containing application and related data
2 0 qcc3003.xuv
4.2生成升级文件
(1)创建升级分区(.upg)文件
(2)生成.xuv格式升级文件
UpgradeFileGen qcc3003.upg qcc3003_upg.xuv,生成qcc3003_upg.xuv
(3)用OEM密钥签署升级文件
dfusign -v -f -u -h qcc3003_upg.xuv -o qcc3003_upg_signed.xuv -ka oem.private.key,生成qcc3003_upg_signed.xuv
(4)转换为二进制格式
XUV2BIN -d qcc3003_upg_signed.xuv qcc3003_signed.bin,生成qcc3003_signed.bin
5.DFU升级
工具包含在安装目录下tools\bin文件夹中(如:D:\ADK_QCC300x.WIN.1.0.167\tools\bin)。按键让设备进入DFU模式,使用命令行执行以下命令:
HidDfuCmd upgradebin 0A12 FFFF 0 FF00 qcc3003_upg_signed.bin,选择Yes,等待两分钟左右(有进度提示),升级完成。