移植u-boot-2015.07-rc3之修改代码支持NorFlash(四)

时间:2022-01-22 17:13:59

如果你只想做一个从NandFlash启动不从NorFlash启动的u-boot.bin,请直接跳过这一节,NandFlash启动的uboot是不支持NorFlash的。原因这一节后面会讲到。

从串口打印出来的信息可以看到   Flash:0 Bytes,这里的Flash指的就是NorFlash,需要修改NorFlash的初始化函数以支持开发板上的NorFlash。那么这个初始化函数在哪里呢?过段时间就记不住了,但是没关系,可以通过grep命令搜索出来(搜索与NorFlash相关的字符串“Flash:”):

root@ubuntu:/home/uboot/u-boot-2015.07-rc3# grep "Flash:" * -nR

可以看到两个相关的结果:

arch/arm/lib/board.c:541:       puts("Flash: ");

common/board_r.c:321: puts("Flash: ");

在前面的文章中就讲到了,由于定义了CONFIG_SYS_GENERIC_BOARD宏的关系,smdk2440开发板不使用arch/arm/lib/board.c,取而代之的是common/board_r.c和common/board_f.c文件。所以打开common/board_r.c:321看到     puts("Flash: ");属于initr_flash函数,而initr_flash函数又被board_init_r函数调用。下面给出追踪流程图:

移植u-boot-2015.07-rc3之修改代码支持NorFlash(四)


追踪到jedec_table[]内可以看到定义各种NorFlash信息的table项,u-boot就是根据读取NorFlash的信息与这张表中的信息对比,如果jedec_table[]中有匹配的项,就代表能识别这款NorFlash。那么u-boot读取的NorFlash信息都是些什么呢?在flash_detect_legacy函数中可以看到调试语句:

                                     debug("JEDEC PROBE: ID %x %x %x\n",                                                                                                                                                                                 

                                                        info->manufacturer_id,

                                                        info->device_id,

                                                        info->device_id2);

                                      if (jedec_flash_match(info, info->start[0]))

                                               break;

那么就把这个debug调试信息打印出来看看。想要把debug信息打印出来只有追踪debug函数(其实是个宏,不算是函数)了,使用sourceInsight追踪观察后测试可以使用两种方式把debug的内容打印出来:

#define _DEBUG 1                                                                                                                                                                                                                                                            

#define debug(fmt, args...)     printf(fmt, ##args)

这个两句宏定义二选其一添加在flash_detect_legacy函数所在的drivers/mtd/cfi_flash.c文件的#include语句下方,效果如下:

#include <common.h>                                                                                                                                                                                                                                                     

#include <asm/processor.h>

#include <asm/io.h>

#include <asm/byteorder.h>

#include <asm/unaligned.h>

#include <environment.h>

#include <mtd/cfi_flash.h>

#include <watchdog.h>

 

//#define _DEBUG 1

#define debug(fmt, args...)     printf(fmt, ##args)

保存后make编译后的u-boot-spl.bin和u-boot.bin下载到NandFlash中启动便能看到关于NorFlash的打印信息:

移植u-boot-2015.07-rc3之修改代码支持NorFlash(四)


可以看到读取到了ID是f0 ea00 0,依次代表Manufacturer IDDeviceID、第三个为0的ID可以不关注。

我的NorFlash是29AL016J70TFI02,于是打开NorFlash芯片的数据手册,可以看到这张表:

移植u-boot-2015.07-rc3之修改代码支持NorFlash(四)


现在对照上图中的表格,发现Manufacturer IDDevice ID应该分别是01、2249,和读取到的f0、ea00完全对不上号。为什么呢?因为现在的uboot是从NandFlash启动,而从NandFlash启动的uboot是无法识别和使用NorFlash的,因为在s3c2440手册第五章MEMORY CONTROLLER中已经说明了从NandFlash启动时内存映射不存在Bank0,而Bank0的片选为nGCS0,NorFlash的硬件连接依赖nGCS0控制。所以NandFlash启动时cpu压根就感觉不到NorFlash的存在,所以识别的ID是错误的。


移植u-boot-2015.07-rc3之修改代码支持NorFlash(四)

移植u-boot-2015.07-rc3之修改代码支持NorFlash(四)


所以想要修改代码支持NorFlash还得让uboot从Nor启动,但是我们现在是以NandFlash的SPL方式启动,目前生成的u-boot.bin下载到NorFlash中是无法启动的。

         以spl方式启动的uboot就是这点比较烦,以spl启动的uboot和NorFlash启动的uboot是不一样的,不能让一个u-boot.bin既可以下载到NorFlash启动也可以下载到NandFlash启动。后面会讲到取消链接选项-pie的uboot修改,那样的uboot就可以实现一个u-boot.bin既可以下载到NorFlash启动也可以下载到NandFlash启动。

         这一节并没有正真的完成对NorFlash的支持,原因是由于我们选择先从NandFlash启动造成s3c2440无法感知NorFlash的存在,下一节讲述u-boot从NorFlash启动,并修改代码实现NorFlash读写支持。当然了,只是修改从NorFlash启动的uboot代码,至于从NandFlash启动的uboot,由于从NandFlash启动的uboot根本不支持NorFlash,所以从NandFlash启动的uboot根本不需要添加对NorFlash支持的代码。