JZ2440移植UBoot 2012.04:解决Nor Flash读写问题

5 下载量 148 浏览量 更新于2024-08-29 收藏 1.05MB PDF 举报
"这篇uboot研读笔记详细记录了移植uboot 2012.04到JZ2440开发板的过程,特别是针对Nor Flash读写的支持。作者在移植过程中遇到了闪存读写出错的问题,导致uboot启动后死机。通过分析,定位到问题出在`board_init_r`函数中调用的`flash_init`函数。" 在移植uboot到JZ2440开发板的过程中,支持Nor Flash的操作是至关重要的一步。Nor Flash是一种常见的非易失性存储器,常用于存储固件和引导加载程序。在本笔记中,作者首先回顾了之前的文章,即初步移植uboot到JZ2440并配置了时钟和串口。然而,在启动后,uboot因尝试访问Nor Flash时出现错误而停止运行。 定位问题的关键在于理解Nor Flash的读写机制。在S3C2440系列处理器中,操作Nor Flash通常涉及JEDEC标准的访问协议。当uboot启动并尝试初始化闪存时,它会调用`board_init_r`函数,该函数在`arch/arm/lib/board.c`中定义。在该函数内,uboot打印出“Flash:”消息,然后尝试通过`flash_init`函数来确定闪存的大小。如果`flash_init`返回的大小为0,uboot会打印错误信息并挂起CPU。 深入`flash_init`函数,发现其核心部分在于尝试通过两种方式获取Flash的CFI(通用闪存接口)信息:`flash_detect_legacy`和`flash_get_size`。CFI信息包含了关于闪存芯片的详细参数,如大小、速度等。如果这两个函数都无法成功获取CFI信息,uboot将无法正确识别和操作Nor Flash。 `flash_detect_legacy`函数的实现依赖于宏定义`CONFIG_FLASH_CFI_LEGACY`,在`smdk2440.h`文件中,这个宏已经定义。这表明uboot试图使用传统方法检测闪存,但这种方法可能不适用于JZ2440开发板的特定硬件配置。 因此,问题的焦点落在了为什么`flash_detect_legacy`和`flash_get_size`都无法正确获取CFI信息。可能的原因包括硬件配置不匹配、JTAG或SPI接口设置错误、或者是uboot配置文件中关于Nor Flash的定义有误。解决这个问题可能需要检查硬件连接、调整uboot源码中的配置选项,或者针对JZ2440的Nor Flash特性优化代码。 移植uboot到新的硬件平台是一项复杂的工作,涉及到对底层硬件的理解以及uboot源码的深入分析。通过逐步调试和定位,开发者可以找出导致问题的具体原因,并最终实现uboot对Nor Flash的有效支持。对于学习嵌入式系统和uboot的开发者来说,这样的过程具有很高的实践价值。