zynq远程更新程序
记录一下近期开发远程更新程序功能遇到的问题,如果有进行类似开发的同学可以借鉴,如果你对启动过程不了解,请看UG1085/UG585等对应的手册,或者网络搜一下。
片子是赛灵思的ZU11EG, vitis2019.2,跑的ftreeRTOS+LWIP,方案如下,
具体方案是先通过UDP将boot.bin写入到emmc中,然后再从emmc烧写到flash,这里有一个注意事项,之所以不直接从emmc启动,是因为emmc没挂在对应的口上,从下面的boot mode可以看到,emmc必须挂载MIO[22:13]上面才行,否则没法从emmc启动,而用的硬件emmc挂在MIO[51:39]上面,因此没法直接刷emmc,如果是跑linux是可以的。
然后第二个注意事项是在写flash的时候,用的是官方的例程里的函数,最好是在写之前一次性擦完,然后只管写就行了,还要注意每次只能写一个page,如果每次都先擦一次写一次,由于是按照secter擦的(见下图),导致之前写的都被擦掉了,因为这个原因困扰了我一天,写完一读全是FF,
为了验证下位机程序,我还专门学习了一下winform上位机,因为没人给写,还好比较简单,
代码已经验证通过,以后就不用哭呵呵的用jtag了。
为了保证交互过程的可靠,我规定了一个协议,数据传输和响应都是按照协议进行的,如果有需要,可以提供源代码,首先说明这个上位机能用,但是不完善,毕竟才学了几天。
还有一个注意事项,由于boot是存储在emmc中的,每次下载都会下载到同一个文件里面,如果下载的boot和上一次大小不同就需要注意了,如果新的boot比上一次大,则没问题,如果比上一次小,则需要将文件大小进行截断,否则上一次boot的尾巴也会被写入flash,导致启动失败。