进过上文代码修改后,我们已经能打印出一些内容了,如下:
上文说到“NAND:”打印后续的问题先放一放,把前面一些错误修正一下。
错误信息修正
关于这些打印,其实都是在uboot第二阶段中的start_armboot函数中打印出来的。
该函数上来就循环调用了一系列的初始化函数。
这个init_sequence是一个函数指针数组,我们会for循环遍历执行它们。
uboot版本信息
版本信息是在display_banner中打印的(包含uboot版本号、编译时间、开发板名称)。U-Boot 1.3.4如果要修改可以去Makefile里面改。然后是“for SMDKV210”,我们改成自己的名字“for x210”。这个是对应配置头文件smdkv210single.h中的一个宏。
时钟信息
时钟部分的代码在lowlevel_init.S中的bl system_clock_init调用的这个函数中。时钟部分的运行结果本来就是对的,不需要改动。这是因为我们开发板使用的CPU和三星的开发板CPU都是s5pv210,我们与三星的差异在于板级,而芯片级是一样的。
要改动的是寄存器写入的值,这些值都在配置头文件(smdkv210single.h)中用宏定义定义出来了。如果时钟部分要更改,关键是去更改头文件中的宏定义。三星移植时已经把210常用的各种时钟配置全都计算好用宏开关来控制了。只要打开相应的宏开关就能将系统配置为各种不同的频率。
Serial在print_cpuinfo中被打印,Board在checkboard中被打印(修改正确即可)。
DDR内存块信息
DRAM的信息是在display_dram_config中打印出来的,但是分析代码可知,真正计算size却是在其上面一个函数中通过宏计算得到的,而这些宏定义均定义在配置头文件smdkv210single.h中。
其实x210板子上的DDR是512MB的而非打印出来的1G,因此这里的配置是有问题的,主要是SDRAM_BANK_SIZE应该配成256MB,然后PHYS_SDRAM_2的地址要配置成0x40000000(目前还没验证配成0x30000000(两块SDRAM地址连续)是否可以)。
改完之后打印如下:
SD/MMC与NAND信息修正
我们直接去搜索"EXT_CSD"错误关键字,能找到错误就是下面那句,往回退的函数调用关系为:
mmc_initialize => mmc_init => mmc_startup => mmc_read_ext_csd
网上查找相关资料,关于extended CSD(或ext_csd寄存器):
ecsd的全称应该是EXT_CSD,就是“扩展寄存器”,相当于你对这个eMMC芯片的特殊设置寄存器配置文件。比如这颗eMMC芯片的启动模式、存储结构、boot存放等特殊信息的设置、存储区域。在eMMC标准里面有说明:
并且找到了相关的修改方案:unrecognised EXT_CSD revision 6解决办法
可以看出,这个版本限制只是当前uboot仅支持到了version5的SD卡而已,有可能当时uboot出来的时候最新的SD卡仅到版本5,而我们现在去用以前的uboot就会遇到我们新版本的SD卡在旧版本的uboot上得到拦截。所以说,我们直接将这个限制版本改成7或7以上,就可以解决问题。
推测和实验验证(SD卡和iNand的区别)
1、当前板子上有一个iNand接在SD0上,有一个外置SD卡接在SD2上。而uboot中初始化的这个是iNand而不是SD卡,也就是说uboot中实际用的是SD0而不是SD2。见以下代码,find_mmc_device写死传的是0,结合cpu_mmc_init分析可知,得到的mmc就是SD0(iNand)。从打印现象也可以验证,板子里的iNand容量是4G。
2、那么还可以尝试,使用外置SD卡时,这个版本号的问题不会出现。从这里可以推测出SD卡和iNand的区别,至少从一个角度可以看出:SD卡版本低,iNand的版本比较高。
3、我们可以将iNand(SD0)和SD卡(SD2)的容量都打印,效果如下图(我的SD卡是128MB的)。
"NAND:"问题
这个问题一直没有解决,我直接注释到了卡死的这个函数nand_init,一切就可以正常运行下去了。
随后,直到我翻看了正确可使用的uboot代码时发现,CONFIG_CMD_NAND这个宏被注释掉了,这也就意味着x210开发板中根本没有NAND!哎,折腾了半天,还是自己对设备硬件不清楚啊`(>﹏<)′
但是直接注释宏声明的影响面太大,导致编译的时候有些函数中无法找到某些函数的定义。
进过代码分析,翻看这部分的源代码可以发现,fastboot的执行是通过CONFIG_GENERIC_MMC、CONFIG_MTD_ONENAND、CONFIG_CMD_NAND这三个宏去知道操作具体哪个存储介质,当然我们使用的是SDMMC啊。
因此,将如下CFG_FASTBOOT_NANDBSP屏蔽,打开CFG_FASTBOOT_SDMMCBSP即可。
那么得到结论,这里的三个存储硬件(CONFIG_GENERIC_MMC、CONFIG_MTD_ONENAND、CONFIG_CMD_NAND)是只要存在一种最为BSP存储介质即可。当然同时存在2种应该是可以的,毕竟三星的smdkv210single开发板就是这样的,但也只能配置一种作为BSP存储介质。