在Zynq平台上,虽然标准的启动方式是通过QSPI、SD卡或eMMC来实现的,但Zynq并没有初期支持从SDNAND(即SD NAND flash)直接启动。因此,想要在QSPI模式下使用SDNAND来做代码存储器的实现启动,需要较复杂的定制化工作。
最常见的方案是在QSPI Flash或SD卡中存放FSBL(First Stage Bootloader),通过Zynq的BootROM直接从这些设备启动。FSBL加载后,可以初始化SDNAND,并完成读取并加载应用程序。
步骤:
在QSPI Flash或SD卡上存储FSBL。
FSBL负责初始化SDNAND。
FSBL从SDNAND加载应用程序到DDR内存并执行。
方法的好处是使用了Zynq标准支持的启动这种方式,稳定性首要,且需要BootROM。
要在QSPI模式下直接使用SDNAND进行启动,必须编写自定义的Bootloader,因为Zynq的BootROM不支持直接识别SDNAND。该Bootloader需要配备以下功能:
初始化QSPI接口并配置SDNAND。
读取SDNAND中的固件并将其加载到DDR。
跳转到加载的代码执行。
这个方法涉及其中,需要熟悉Zynq的启动流程和SDNAND的接口协议。可以参考Zynq的FSBL源码进行修改,从而支持SDNAND。
你可以使用修改SD卡作为主启动介质,然后在应用层加载SDNAND作为代码或数据存储的扩展。这样就避免了启动流程的复杂性。
步骤:
在SD卡上存放FSBL和应用程序的核心部分。
在应用程序启动后,初始化SDNAND并加载额外的数据或代码。
方案避免了对启动过程的复杂性,适用于这种需要在后期加载增加代码或数据的情况。
在Petalinux或裸机环境下,确保FSBL能够正确启动。
在FSBL中添加初始化SDNAND的驱动,使用QSPI协议与SDNAND进行通信。
修改FSBL源码,由SDNAND中加载应用代码支持。
编译并烧录到QSPI Flash或SD卡中。
在FSBL源码中,加入SDNAND初始化代码,通常涉及到设置QSPI控制器、配置SDNAND操作。
确保可以通过SPI/QSPI正确接口与SDNAND通信,并实现读写器操作。
将SDNAND中的数据加载到DDR内存中执行。
保证QSPI和SDNAND的初始化正确无误,可以成功读取NAND中的数据。
调试和优化代码,使启动过程稳定。
这个过程需要对Zynq平台的启动流程、QSPI控制器和SDNAND硬件接口有较深入的了解。定制开发Bootloader的方法比较复杂,但如果实现成功,可以灵活使用SDNAND作为代码存储器。你可以先从最开始考虑常见的FSBL + QSPI Flash启动方法开始,逐步划分SDNAND的使用。