联发科MT33xx GNSS模块固件升级流程

最近的一个项目中,有通过嵌入式设备对使用联发科MT33xx GNSS模块升级固件的需求。供应商只提供了一个PC端升级工具,并表示出于保密考虑,不会提供升级流程相关文档。但将已出售的嵌入式设备中的GNSS模块一一取出,使用PC升级显然是不现实的,必须使用嵌入式设备直接对其内置的模块进行固件升级。
幸而在Google上搜到了一个使用同款芯片的GNSS解决方案供应商的文档(Telit_Jupiter_MT_GNSS_Host_Flash_Application_Note_r2),对升级流程有详尽的描述。后经证实,对照该文档,确实可以成功对模块进行固件升级。
既然是网络上可以找到的公开资料,就无需多避讳,这里把总结出的升级流程分享一下。
GNSS模块的型号和版本号可通过电脑连接模块,在9600波特率下发送$PMTK605 *31\r\n指令查看。查询指令的应答类似$PMTK705,AXN_5.10_3333_17021500,354C。其中“354C”即本流程升级的固件版本。
下文中以“主机”代指用于升级GNSS模块的嵌入式设备,“模块”代指MT33xx系列GNSS模块。

1. 升级启动流程

这是发送给GNSS模块以开始升级流程的第一个流程。在这个命令中,主机将按顺序设置串口通信的波特率,并在每个波特率下发送NMEA_START_CMD ($PMTK180)。然后模块将在指定的或者最高的波特率(即115200)开始升级流程。(实测在默认的9600和最高的115200波特率上各发送一次PMTK180即可)
该序列通过与GNSS模块以字节交换方式的发送多个预定值,以确保通信建立并在GNSS上设置并进入升级模式。

联发科MT33xx GNSS模块固件升级流程_第1张图片

  • 设置波特率:
    设置波特率是指设置主机的波特率,并以此发送NMEA_START_CMD到GNSS模块。在串口通信的波特率(默认9600)中,115200是推荐值。
  • BOOT_ROM_START_CMD1(0xA0):
    如果BOOT_ROM_START_CMD1的应答(0x5F)未被收到,则需要重复发送此命令(0x5F),每次重新发送之间的标称时间间隔为50毫秒。

2. Download Agent(DA)写入流程

联发科MT33xx GNSS模块固件升级流程_第2张图片

  • DA_BASE_ADDR
    对于MT3329后的型号,包括MT3333,DA的地址起始于3072 (0x00000C00)
    即:DA_BASE_ADDR (0x00 0x00 0x0C 0x00)
  • DA_SIZE_NUM_WORD
    DA的字节长度是 5946 (0x0000 173A) (23784比特)
    即:DA_SIZE_NUM_WORD (0x00 0x00 0x17 0x3A)
  • DA数据格式
    DA数据以5个16位无符号整数(2字节)的数据包形式发送。 这意味着如果它发生了以字节为单位的DA数据大小不是偶数,即将会有一个独立字节发送DA文件的结尾,此时必须用填充0x00的方式形成一个2字节的值值作为高字节,以满足协议要求。但并不要求数据必须以上述规定的5个整数(2字节)发送。该协议允许剩余的整数(整数的数量可以小于5)在发送DA文件的结尾。
  • DA_CHECKSUM
    一个简单的异或算法被应用到发送给DA数据文件的所有字节来获得生成的16位校验和值。 根据这个要求,在上面的流程图中,这个校验和不适用于DA_BASE_ADDR命令和DA_SIZE_NUM_WORD命令。
    注:在此阶段完成之前,对模块断电或升级流程意外终止、数据错误,对模块彻底断电、重启后即可恢复正常。有时,模块发来的应答为0x00,此时可认为模块工作异常,也需要重启才能恢复。注意,主机设备的法拉电容可以为模块维持较长时间供电,故需要对主机断电一分钟左右才能保证GNSS模块彻底断电。

3. 启动Download Agent(DA)

3.1 程序跳转到DA

联发科MT33xx GNSS模块固件升级流程_第3张图片
DA_BASE_ADDR 与上一流程设置的相同(0x00 0x00 0x0C 0x00)

3.2 DA信息报告

当DA被下载并运行,它会返回20字节的数据,包含以下信息:

  1. SYNC_CHAR (1byte)
  2. DA_VERSION (2bytes)
  3. FLASH_DEVICE_ID (1byte)
  4. FLASH_SIZE (4bytes)
  5. FLASH_HW_ID (8bytes)
  6. EXT_SRAM_SIZE (4bytes)
  • SYNC_CHAR (1byte)
    当DA被运行,它会返回SYNC_CHAR,如果返回的不是这个值,可能下载的是错误的DA。
  • DA_VERSION (2bytes)
    在SYNC_CHAR后,DA会返回DA的版本号,包含两个字节,一个是主版本,一个是镜像版本。主机将检查是否支持这个版本的DA。
  • FLASH_DEVICE_ID (1byte)
    报告DA版本后,DA会自动检测目标上的闪存类型。 如果DA支持这个闪存,那么闪存设备ID将返回到主机。 如果DA不支持这个Flash,它将会返回0xFF来指示未知的Flash类型。
  • FLASH_SIZE (4bytes)
    四个字节的闪存大小,例如:128Mbits(16Mbytes)闪存将是0x01000000字节;DA将发送
    0x01,0x00,0x00和0x00。
  • FLASH_HW_ID (8bytes)
  • FLASH_MANUFACTURE_CODE:
    两个字节的闪存制造代码。 (用户应该参考每个闪存的数据表。)
  • FLASH_DEVICE_CODE:
    两个字节的闪存设备代码。 (用户应该参考每个闪存的数据表。)
  • FLASH_EXT_DEVICE_CODE1:
    两个字节闪存扩展设备代码1。 (用户应该参考每个闪存的数据表。)
  • FLASH_EXT_DEVICE_CODE2:
    两个字节闪存扩展设备代码2。 (用户应该参考每个闪存的数据表。)
  • EXT_SRAM_SIZE (4bytes)
    四个字节的外部SRAM大小,例如:64Mbits(8Mbytes)的外部SRAM将为0x00800000
    字节; DA将发送0x00,0x80,0x00和0x00。

3.3 设置存储区域

该命令用于通知DA每个块的总内存块数量和范围。该内存块信息指示要下载的BIN文件数量以及每个文件的范围BIN文件。
如果任何内存块超过闪存大小,DA将立即返回NACK(0xA5)来指示DA_MEM_CMD命令失败。
如果所有的下载内存块都有效,DA将返回ACK(0x5A)和UNCHANGED_BLOCK_COUNT通知主机端有多少不变的块应该被恢复
联发科MT33xx GNSS模块固件升级流程_第4张图片

  • MEM_BLOCK_COUNT (N):
    要下载的ROM文件的数量和内存块的数量相同由模块分配。 如果ROM文件的编号是1,那么N = 1。
  • BLOCK_1:BEGIN_ADDRESS:
    内存中ROM文件的起始地址,用于块1。
  • BLOCK_1:END_ADDRESS:
    内存中ROM文件的结束地址,用于块1。
  • 根据协议要求,ROM文件以固定长度的包发送的256字节(加上2字节的额外校验和)。 当没有足够的数据字节被发送,比如文件末尾的最后一个数据包(其余字节<256)应填将数据包其余的部分填充零。
    由于以上要求,内存块的END_ADDRSS必须包含额外的填充字节大小
    示例:如果ROM文件大小为500324字节,则预期长度为156个字节
    填充字节被附加到最后一个数据包中ROM文件的其余字节。END_ADDRSS应为总大小 -1。

4. 下载BIN(ROM)数据

4.1 写入BIN

此命令用于将BIN文件的所有数据写入目标端闪存。注意,在此阶段断电或程序异常终止,将导致模块损坏(连接串口后无法收、发任何指令)

  • 每个数据包是固定的长度; 即PACKET_LENGTH加上两个字节的校验和。
  • 如果DA成功接收到此数据包,它将返回CONT_CHAR(0x69)通知主机继续发送下一个数据包。
  • 如前文所述:命令CMD_SetMemBlock中,最后的数据包通常不足够PACKET_LENGTH,代码将填充0x00作为填充,直到到达PACKET_LENGTH。最后,DA将从闪存执行所有BIN文件的校验和,并与来自UART的校验和。 如果两个校验和都相同,则DA将返回ACK(0x5A)
    意味着它们被成功写入闪存,否则返回NACK(0xA5)来表示错误。

联发科MT33xx GNSS模块固件升级流程_第5张图片
PACKET_LENGTH = 256
DA_WRITE_CMD (0xD5 0x00 0x00 0x01 0x00)

4.2 结束升级

联发科MT33xx GNSS模块固件升级流程_第6张图片
此命令用于通过DA关闭解锁RTC电源键实现断电。固件更新程序完成,GNSS模块将自动重启。
PC端升级软件此时还依次发送了如下指令:

PMTK811:退出MP测试模式
PMTK810:进入MP测试模式
PMTK811:退出MP测试模式
PMTK104:完全冷启动

此时模块重启,能够正常返回GPS数据,但在模块断电重启之前,无法接收包括PMTK605版本查询指令在内的命令,故升级结束后无法立即返回新的版本号。

你可能感兴趣的:(嵌入式)