单独的u-boot可以正常运行,而kernel配合04000010版的uboot也能正常运行。但当前的uboot配合kernel却不能正常boot,会在kernel串口设置的地方出错。
整理尝试结果:
uboot.10Pelco + kernel == OK
uboot.12Pelco + kernel == No
uboot.10 + kernel == OK
uboot.12 + kernel = No
根据以上结果推断,10版可以,而12版不行,跟Pelco改动无关。
补充其他尝试:
uboot.12 + kernel.original == OK,
uboot.12Pelco + Kernel.original == OK
据此推断,还是uboot Pelco的部分的设置对Kernel Pelco的部分产生了影响产生了一些影响
Kernel中存在着一个驱动模块:
SERIAL_DRAM_LOG
实验将此模块禁止,发现可以正常驱动起来。因此可以确定肯定是这个模块的问题。
在u-boot中重新观察与SERIAL_DRAM_LOG相关的设置,一个最重要的宏,位于/include/configs/myboard.h
#define CONFIG_SERIAL_DRAM_LOG_ADDR 0xA0000000
此地址对应了具体的DDR的地址。目前设置的地址似乎与实际不符。
当前的Soc有2个DDR I/F,分别为(在非交织模式下)
DDR0: 0x8000 0000 ~ 0xBFFFFFFF ==> 1GB
DDR1: 0xC000 0000 ~ 0xFFFFFFFF ==> 1GB
但目前的板子实际空间为
DDR0:256MB, DDR1:256MB
因此,当在非交织模式下时的有效地址为:
DDR0: 0x8000 0000 ~ (0x9000 0000-1)
DDR1: 0xC000 0000 ~ (0xD000 0000-1)
另一种情况,交织模式下:
DDR0和DDR1不再是独立的空间了,而是交织在一起的,这样,总的空间范围为:
DDR0: 0x8000 0000 ~ (0xA000 0000 -1)
查询Soc的手册,发现2个DRAM控制模块被一个叫DMM的上层控制器控制,它可以控制整个RAM空间的地址分配。例如把DDR1放在80000000,而把DDR0放在A0000000,或者DDR0,1交织存放数据。