《W5200E01-M3远程固件更新教程》之boot.bin 程序说明
0赞上一次给大家介绍了《W5200E01-M3远程固件更新教程》中系统说明的部分,对此更新方式有了大概的了解。在ISP更新过程中,首先我们先来看一下关于boot.bin程序的说明。
2.1main函数
首先,对系统各个组件进行初始化,该过程包括系统时钟初始化、输入输出引脚初始化、嵌套中断向量初始化、串行通信端口初始化、WIZnet W5200的SPI通信端口初始化,再对W5200进行复位操作。同时,打印输出“W5200 Demo Code for Remote IAP.”
然后,从闪存中读取配置信息,从应用程序的开始地址处读取4字节信息,该信息指明了在闪存中是否存在应用程序。值得注意的是,引导程序(boot)的存储地址范围是0x08000000到0x08004fff,而应用程序(app)的存储地址范围从0x08005000开始。
- 若应用程序没有存在于闪存中,那么再通过已经读取的配置信息检查固件版本号,如果固件版本号是0xffff,则恢复默认配置[i]。如果固件版本号是0x00,同样恢复默认配置;否则通过已读取的配置信息检查硬件地址,如果mac地址是0xffffffffff,则恢复默认配置。最后,配置网络信息[ii]。
- 若应用程序存在于闪存中,那么再通过已读取的配置信息检查固件版本号,如果固件版本号为0x00,则进行网络配置;否则,查找到应用程序地址,并跳转至应用程序。
[i]恢复默认配置的函数set_default(),该函数执行的操作包括:设置DHCP为静态模式,设置固件版本号,设置当前模式为TCP混合模式,设置默认端口,设置波特率为115200,设置数据位为8位,设置无校验,设置停止位为1位,设置停止流控制,DNS标志复位,设置设备默认名称和设备默认序列号。
[ii]配置网络信息的函数set_network(),该函数执行的操作包括:配置mac地址,配置子网掩码,配置网关地址,配置源IP地址,发送接收缓存初始化,设置重传时间,设置重传次数。
2.2boot.bin main() function source code
上述内容均是和主机应用程序通信之前的准备工作,通过主机应用程序对设备进行设置和固件更新的具体操作如下:
2.3do_udp_config函数
UDP配置函数do_udp_config()执行的主要功能是:建立UDP通信端口,实现主机PC端软件与W5200E01-M3模块之间的通信。用户使用主机PC端软件与模块进行交互,PC端以UDP广播的形式向模块发送指令,指令包含“FIND(查找设备)”、“SETT(设置)”、“FIRM(固件更新)”、“FACT(复位)”等操作。而W5200E01-M3同样以UDP广播的形式对接收到的命令进行回复。该函数执行过程如下:
图2 Do_udp_config() 函数流程图 |
UDP配置过程使用的端口为SOCK_CONFIG.
SOCK_CONFIG可能出现的状态如下:
- SOCK_UDP UDP端口打开
- SOCK_CLOSED UDP端口关闭
根据SOCK_CONFIG的状态,执行如下操作:
图3 do_udp_config() 函数状态图 |
在UDP模式下,主机程序与W5200E01-M3的通信过程如下:
- 若接收到“FIND”字符,即操作人员点击主机应用程序界面的“Search”按钮时,则利用配置信息ConfigMsg来更新接收信息RecvMsg,并将RecvMsg的op字段改写为“FIND”重新发回主机程序,告知主机设备已找到,配置信息已发送,发送模式为UDP广播数据包。
图4 “FIND”指令下的通信时序图 |
- 若接收到“SETT”字符,即操作人员点击主机应用程序界面的“Setting”按钮时,首先检查配置信息与接收信息中的mac地址是否一致,若一致,则利用接受信息RecvMsg来更新配置信息,同时修改配置信息中的软件版本号ConfigMsg.sw_ver并写入闪存,再将配置信息发回主机程序,告知主机当前配置信息,发送模式为UDP广播数据包,最后重新启动程序。若mac地址不一致,则不会执行上述操作。
图5 “SETT”指令下的时序图 |
- 若接收到“FIRM”字符,即操作人员点击主机应用程序界面的“Firmware Upload”按钮时,首先检查配置信息与接收信息中的mac地址是否一致,若一致,则修改配置信息中的软件版本号ConfigMsg为0x00写入闪存,再将接收信息发回主机程序,告知主机固件升级已准备好,发送模式为UDP广播数据包,最后重新启动程序。若mac地址不一致,则不执行上述操作。
图7 “FACT”指令下的时序图 |
2.4boot.bin do_udp_config() function source code
2.5do_fw_update函数
在上述过程中,若接收到“FIRM”信息,则固件更新过程开始,根据固件更新端口SOCK_FW状态的不同,执行不同的操作。
SOCK_FW可能的状态如下:
- SOCK_INIT TCP连接正在建立
- SOCK_ESTABLISHED TCP连接已经建立
- SOCK_CLOSE_WAIT TCP连接正在关闭
- SOCK_CLOSED TCP连接已经关闭
根据SOCK_FW的状态,执行如下操作:
- 如果当前状态是连接正在关闭,则等待连接关闭;
- 如果当前状态是连接已经关闭,则重新建立连接;
- 如果当前状态是建立正在连接,则等待连接建立完成;
- 如果当前状态是连接已经建立,则开始进行固件更新[i]。
[i]固件更新正式开始之前还要进行解锁闪存FLASH_Unlock(),清除闪存标志位FLASH_ClearFlag()和寄存器设置setSn_IR()等操作。
图8 do_fw_update() 函数状态图 |
为保证固件文件的可靠传输,用于固件更新的端口SOCK_FW采用的是TCP连接模式。最先收到的TCP数据包包含有固件长度信息,为4个字节,接收到该数据包后,将其存储于变量fLen中,并根据固件文件的大小计算出更新固件需要擦除闪存页数,完成擦除后将擦除标志isErased置位。
此后接收到的若干TCP数据包即为固件文件,逐次写入闪存并记录已经写入数据的长度,直到该长度与fLen一致时,即完成了固件文件的接收。接下来,发送断开连接请求disconnect(),同时更新配置信息ConfigMsg中的软件版本信息sw_ver为0xffff,并将该信息写入EEPROM,打印输出“OK”。最后,重新启动并执行新版固件的应用程序。
下面根据该过程的时序图对固件更新过程进行说明。W5200E01-M3始终监听TCP连接状态,检测到连接建立后,其与主机之间的通信如下:
(1) 主机发送包含固件长度信息的TCP数据包。W5200E01-M3将固件长度保存在fLen变量中。同时根据固件长度擦除闪存。
(2) W5200E01-M3将fLen发回主机,告知其已准备好接收固件。
(3) 主机发送固件文件。W5200E01-M3接收固件文件,并写入闪存。同时将已接收的固件长度保存在rxLen变量中。
(4) W5200E01-M3将len发回主机,告知其已接收到此次发送的数据。
(5) 反复执行步骤(3)(4),直到rxLen==fLen时,表明全部固件文件都已经接收完毕,此时,W5200E01-M3发送断开连接的请求disconnect()。
需要着重说明的是,在每一次的连接关闭之后,即端口状态变成SOCK_CLOSED之后,要重新初始化rxLen, nPage, nErasedPage, fLen, isErased, flashdest等变量,以便为下一次的固件更新做好准备。
远程固件更新时序图如下:
图9 do_fw_update() 序列图 |
1 恢复默认配置的函数set_default(),该函数执行的操作包括:设置DHCP为静态模式,设置固件版本号,设置当前模式为TCP混合模式,设置默认端口,设置波特率为115200,设置数据位为8位,设置无校验,设置停止位为1位,设置停止流控制,DNS标志复位,设置设备默认名称和设备默认序列号。
2 配置网络信息的函数set_network(),该函数执行的操作包括:配置mac地址,配置子网掩码,配置网关地址,配置源IP地址,发送接收缓存初始化,设置重传时间,设置重传次数。
3 固件更新正式开始之前还要进行解锁闪存FLASH_Unlock(),清除闪存标志位FLASH_ClearFlag()和寄存器设置setSn_IR()等操作。
明天讲解的是第三部分:app.bin程序说明