OTA升级移植指南*
GX8002 的 OTA 升级支持两种连接方式:UART
和 I2C
。
GX8002 支持空片升级,也就是说,GX8002 本身没有烧录过任何固件的情况下,也可以通过 OTA 方式进行升级。因此,这个升级安全可靠,如果在升级过程中断电或者异常,导致设备变砖,仍然可以重新上电复位后,重新OTA。
在 GX8002 芯片内部的只读 ROM 里,已经固化了我们的升级代码,因此可以支持空片升级。升级过程,和 GX8002 本身跑的内部固件没有任何关系。
1. 串口升级*
上位机可通过如下方式用串口来升级8002
GX8002 的 UART0 和 UART1 都可以支持升级
1.1 参考代码下载*
uart_ota_pc_demo.zip (http://yun.nationalchip.com:10000/l/yFs2dm)
升级例程代码说明:
- main.c 主代码
- porting.c 主要移植的接口
- grus.boot bootloader镜像
- 0922_siri_mcu_nor.bin 需要升级的固件
- Readme.md 需要阅读关注下
1.2 开发板验证方式*
1.2.1 windows环境测试*
-
Windows 环境需要先安装 gcc 编译器 mingw,并配置好环境变量
-
解压 uart_ota_pc_demo.zip
-
进入 uart_ota_pc_demo 目录下,注意当前路径下不能含有中文,打开cmd命令窗口,输入命令 mingw32-make windows 生成可执行文件 main.exe
mingw32-make windows
-
如下图将 8002 开发板连上 PC,UART0 和 UART1 均可使用
-
执行下面的命令后,拨动红框中的开关(向左为关,向右为开)给8002开发板重新上电即可升级固件,串口设备号不一定为COM0,根据本机实际情况修改
.\main.exe COM0 1500000 grus.boot 0922_siri_mcu_nor.bin
-
出现 flash image ok 的提示即固件升级成功
-
对8002开发板喊 "Hi siri",通过串口1可以看到唤醒信息(如下图)
1.2.2 Ubuntu linux环境测试*
-
解压 uart_ota_pc_demo.zip
-
进入 uart_ota_pc_demo 目录下,编译
make linux
- 将8002开发板连上PC,执行下面的命令后,给8002开发板重新上电即可升级固件,串口设备号不一定为ttyUSB0,根据本机实际情况而定。操作串口需要权限,因此使用 sudo 命令
sudo ./main.elf /dev/ttyUSB0 1500000 grus.boot 0922_siri_mcu_nor.bin
- 接下来的步骤和 windows 的一致
1.3 视频演示教学*
OTA演示视频: https://www.bilibili.com/video/BV1XK4y1Z7J6
1.4 升级流程图*
1.5 移植注意事项*
-
升级过程分两段,一段是加载 bootloader,等 bootloader 启动后再加载要烧录的固件。因此,开发者需要把 grus.boot 固化到自己的升级代码里,或者保存在主控的 flash 上。grus.boot 45K 大小。
-
升级过程,串口波特率可以先用我们代码推荐的,如果发现不稳定,可以降低波特率再测试,以找到个合适的波特率。
-
升级的协议流程,开发者可以不需要关注,直接移植即可。但是,需要关注 porting.c,把里面的串口接收接口换成自己平台的。该套代码给客户参考,成功移植在杰理,中科蓝迅,高通,恒玄等SOC上,并量产。
-
上电复位 GX8002 的时候,要注意时序,core 上电要比 IO 上电晚些,推荐10毫秒以上
lvp_tws/app/sample/lvp_app_sample.c | |
---|---|
1 2 3 4 5 6 |
|
-
上电后,希望 GX8002 正常启动的话,在上电的这一段时间,大概1秒内,不要通过串口发送任何数据给到 GX8002,否则有可能会进入到升级模式而无法正常工作
-
移植的时候,推荐使用我们参考例子给的超时时间。例子给的时间都比较长,这样稳定性会更好。而且这个时间,在 OTA 正常的话,是很短的。如果真的出现异常导致失败,这点超时对比整个 OTA 的流程来说,也是很短的时间
-
移植的时候,强烈推荐先拿我们的开发板飞线,进行调试,这样好排除PCBA硬件的问题干扰,在这个基础上调试成功后,再到 PCBA 上测试。在开发板调试遇到问题的话,可以非常方便的抓开发板的日志给我们分析定位。
-
握手阶段失败,先确保上电时序是否正确,然后尽量尝试握手的超时时间设长点,比如 5 秒超时
2. I2C升级*
GX8002 也支持 I2C 升级,使用 I2C0
2.1 参考代码下载*
i2c_ota_pc_demo.zip (http://yun.nationalchip.com:10000/l/yFs2dm)
代码目录下,仔细阅读内部的 readme 文档。里面有两个例子,一个是 windows 下验证的,一个是 linux下验证的,参考哪个都可以。
2.2 Ubuntu linux环境开发板验证方式*
- 解压 i2c_ota_pc_demo.zip,安装 CH341A 在 Linux 下的驱动后,连接上 I2C 读写工具,确认是否识别为 /dev/ch34x_pis
- 进入 i2c_ota_pc_demo 目录,解压 i2c_ota_pc_linux_demo, 然后进入代码目录,执行命令 make 编译生成 iic.load
- 如下图将 I2C 工具和 8002 开发板连接上 PC,I2C 工具连接上开发板上的 I2C0 管脚后,执行命令 sudo ./iic.load 即可升级固件
- 如下出现 flash image ok ! 的提示即固件升级成功
2.3 移植注意事项*
-
I2C 的频率,我们测试过 400K 或者更高的
-
升级过程分两段,一段是加载 bootloader,等 bootloader 启动后再加载要烧录的固件。因此,开发者需要把 grus.boot 固化到自己的升级代码里,或者保存在主控的 flash 上。grus.boot 45K 大小
-
升级的协议流程,开发者可以不需要关注,直接移植即可。但是,需要把里面的I2C接收接口换成自己平台的。该套代码给客户参考,成功移植在原相,MTK,RK,中科蓝迅等SOC上,并量产
-
如果开机握手容易失败,需要先严格按照我们的例子来,复位8002后,马上尝试写EF,写成功了,就读。如果写失败了或者读失败了,就间隔1毫秒再尝试,这样持续5秒都失败了,就认为握手失败。跑稳定了,再尝试把5秒的时候改短,调到一个合理的位置,比如1到2秒。考虑到,如果8002上电后,超过了内部ROM固件超时等待i2c握手的时间(200ms内),而跳转进入加载flash上的固件并运行的流程。在内部没有固件在运行;或者跑的固件对i2c管脚复用为其它功能了。那么这个时候,主控去对8002的i2c读写,是会存在异常的,查看管脚波形也会出现不符合i2c标准的现象。对于一些主控,这样异常的波形,会使主控卡死。因此,推荐的握手流程是:先主控给8002断电,然后主控再给8002上电,然后马上开始发送i2c握手信号。不要在8002上电已经跑了一段时间后的情况下,发送握手信号。
-
移植的时候,强烈推荐先拿我们的开发板飞线,进行调试,这样好排除PCBA硬件的问题干扰,在这个基础上调试成功后,再到 PCBA 上测试。在开发板调试遇到问题的话,可以非常方便的抓开发板的日志给我们分析定位
-
移植的时候,推荐使用我们参考例子给的超时时间和延迟时间。例子给的时间都比较长,这样稳定性会更好。而且这个时间,在 OTA 正常的话,是很短的。如果真的出现异常导致失败,这点超时对比整个 OTA 的流程来说,也是很短的时间
-
上电复位 GX8002 的时候,要注意时序,core 上电要比 IO 上电晚些,推荐10毫秒以上
lvp_tws/app/sample/lvp_app_sample.c | |
---|---|
1 2 3 4 5 6 |
|
- 例子中提供的 I2C 下载通道7为设备地址是:0x36。这个设备地址要根据硬件的具体行为来判断,根据 GPIO02 的行为来决定是:0x36 还是 0x35。开发板默认默认是0x36。
我们提供的参考代码,会发现,握手阶段,使用了 0x6c 这个地址。是因为开发板的GPIO_02默认上拉,用于OTA升级使用的七位i2c地址是:0x36,转换为二进制是:011 0110,而PC 的 i2c 驱动要求输入“七位I2C地址+一位读写位”,因为是写操作,最后一位是0,因此二进制:“011 0110 0” 转换位16进制就是 0x6c。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|