如果你只想做一个从NandFlash启动不从NorFlash启动的u-boot.bin,请直接跳过这一节,NandFlash启动的uboot是不支持NorFlash的。原因这一节后面会讲到。
从串口打印出来的信息可以看到 Flash:0 Bytes,这里的Flash指的就是NorFlash,需要修改NorFlash的初始化函数以支持开发板上的NorFlash。那么这个初始化函数在哪里呢?过段时间就记不住了,但是没关系,可以通过grep命令搜索出来(搜索与NorFlash相关的字符串“Flash:”):
|
追踪到jedec_table[]内可以看到定义各种NorFlash信息的table项,u-boot就是根据读取NorFlash的信息与这张表中的信息对比,如果jedec_table[]中有匹配的项,就代表能识别这款NorFlash。那么u-boot读取的NorFlash信息都是些什么呢?在flash_detect_legacy函数中可以看到调试语句:
|
那么就把这个debug调试信息打印出来看看。想要把debug信息打印出来只有追踪debug函数(其实是个宏,不算是函数)了,使用sourceInsight追踪观察后测试可以使用两种方式把debug的内容打印出来:
|
这个两句宏定义二选其一添加在flash_detect_legacy函数所在的drivers/mtd/cfi_flash.c文件的#include语句下方,效果如下:
|
保存后make编译后的u-boot-spl.bin和u-boot.bin下载到NandFlash中启动便能看到关于NorFlash的打印信息:
可以看到读取到了ID是f0 ea00 0,依次代表Manufacturer ID、DeviceID、第三个为0的ID可以不关注。
我的NorFlash是29AL016J70TFI02,于是打开NorFlash芯片的数据手册,可以看到这张表:
现在对照上图中的表格,发现Manufacturer ID、Device ID应该分别是01、2249,和读取到的f0、ea00完全对不上号。为什么呢?因为现在的uboot是从NandFlash启动,而从NandFlash启动的uboot是无法识别和使用NorFlash的,因为在s3c2440手册第五章MEMORY CONTROLLER中已经说明了从NandFlash启动时内存映射不存在Bank0,而Bank0的片选为nGCS0,NorFlash的硬件连接依赖nGCS0控制。所以NandFlash启动时cpu压根就感觉不到NorFlash的存在,所以识别的ID是错误的。
所以想要修改代码支持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支持的代码。