ZYNQ使用Xilinx SDK烧写flash失败的问题

起因

下载程序到flash最方便的办法自然就是sdk里面的flash programmer了。之前不知道什么原因一直都不能用,所以只能在uboot里面烧写,可以说是又慢又麻烦,所以还是来解决一下历史遗留问题。

尝试失败

下载失败的时候sdk并没有给出什么有用的信息,只提示了失败,所以首要的想法自然是打印出来更多的log确定错误原因。
由于之前有观察到flash programmer是个cmd可以执行的命令,所以先看下这个命令的帮助文件,然而出乎意料的是并没有类似-d或–verbose的参数用于调试,也没有什么其他可以改变的参数,直接执行也没有看到更多的log,此路不通。

debug log

于是还是求助了万能的谷歌==
找到了xilinx官方的answer,地址如下:
https://www.xilinx.com/support/answers/59272.html
那么首先打开debug信息,这里注意,关于sdk的这些配置基本都是通过环境变量来配置的。首先配置XIL_CSE_ZYNQ_DISPLAY_UBOOT_MESSAGES环境变量,从名字上就可以知道,似乎flash的下载是用uboot实现的???那么验证一下猜想,打开以后输出了大量的log,从log看来,的确是uboot实现的,大概应该是首先将 uboot下载到内存中,然后运行uboot。最后通过sf命令擦除和写入数据,其实跟我之前使用uboot烧录flash完全相同。

结论

从Log中看出,第一步sf probe就已经失败,并没有读出来正确的flash id。这里第一个猜想就是频率问题,默认的频率可能已经高于这片flash所能够支持的频率。随后就尝试手动设定频率到80M,具体方法参照以下连接:
https://www.xilinx.com/support/answers/70148.html
修改频率通过这个环境变量实现 XIL_CSE_ZYNQ_UBOOT_QSPI_FREQ_HZ,修改到80M之后再看一下log,id已经能够正常获取,擦除写入读取都正常,问题解决。

后记

xilinx sdk烧录flash的时候需要选择一个fsbl文件,之前一直不明白这个文件的作用。调试中可以看出来,sdk需要先载入fsbl文件用来初始化外设,然后下载uboot到ocm中并启动uboot,最后使用sf命令烧写flash。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注