uboot的问题
在前面中,我们完成了Nand启动代码的编写。启动后会出现Flash 错误的问题,我们在Source insight 里面进行搜索:
在532行除,当检测不到Nor Flash 时uboot会被hang()
挂起,这是不应该的。同时,结合我们Nor Flash检测错误,可以确定一点的是flash_init()
函数肯定需要进行修改。
修改后我们重新烧入,替换掉Nand 启动的代码,发现可以正常启动uboot 了。
完成Nor Flash支持
由于我们的开发板上使用Nand 启动时,无法操作Nor Flash,因此后续的测试需要使用Nor 启动。
对flash_init 进行分析
上面为flash_init 的大致执行流程图,flash_init()
会根据 CONFIG_SYS_MAX_FLASH_BANKS
中指定的Flash BANKS的个数,对每一个BANK 的Flash 进行初始化操作。
初始化通过flash_detect_legacy()
函数来完成,该函数根据mode 的类型对Flash 进行初始化,一种是使用Intel 类型的操作,另一种是使用Amd 类型的操作,具体区别在于AMD 芯片有内存保护操作,而Intel 的没有。
获取了设备相关信息后,就要进行jedec_flash_match()
将ID 信息同我们内核中指定的相关信息进行匹配,若匹配成功则说明是可以识别的Nor Flash 芯片,返回1;若失败则返回0。
修改jdec_table
根据上面对flash_init 的分析,再结合我们最终识别不出我们的Nor Flash 芯片,我们大致可以猜测问题可能出现在jedec_flash_match()
函数处,我们进入该函数,进行详细的分析。其源码如下:
上面是jedec_table的定义,从中可以看出内核只定义了CONFIG_SYS_FLASH_LEGACY_512Kx8
和CONFIG_SYS_FLASH_LEGACY_512Kx16
两种,下面的CONFIG_SYS_FLASH_LEGACY_1Mx16
是我新添加的,根据MX29LV160D芯片数据手册编写的。
-
MX29LV160DB/MX29LV160DT:都是我添加的新定义,分别对应数据手册中指定的设备号。
-
CONFIG_SYS_FLASH_LEGACY_1Mx16:定义在s3c2440.h配置文件中。
-
NumEraseRegions:指明的是Nor Flash内块的情况,这里的4表示有4种类型的块。
在Sector Structure第一点,就说明了有4种类型的块,分别是容量为16KB一块,8KB两块,32KB一块以及31块64KB的块。
-
regions:指定的是这些块的排列方式,例如DT结尾的芯片,就按下面这种方式排列
从低地址开始,先排64KB、然后是32KB、8KB、16KB,因此我们的region就按照这个规则来指定。
编译烧写
修改完成后,我们重新编译,然后烧写到Nor Flash中。在此之前,我还修改了CONFIG_SYS_PROMPT
,这样uboot 的命令行开头就以BinWatson #的形式显示出来。
烧入后的运行结果:
至此,我们的uboot已经可以识别Nor Flash了。