6410的DRAM controller可以挂两个DDR,CS0对应 0x50000000~0x5fffffff的地址空间,CS1对应 0x60000000 ~ 0x6fffffff。也就是两个256M的空间。
相对于一片256M的设置,6410部分的不同的设置主要有:
1、P1MEMCFG 的 Active chips要设为 2 chips([22:21]=01);
2、除了P1_chip_0_cfg外还需要设置P1_chip_1_cfg。P1_chip_0_cfg 设的 0x150f0,P1_chip_1_cfg 设的 0x160f0。能跑,但这两个寄存器如何设置我还是没弄明白。
3、在设置完6410的寄存器后,通过P1_DIRECTCMD配置初始化DDR的时候,不要忘了把CS1的内存也要初始化一下。相应的P1_DIRECTCMD的Chip number[21:20]应该为 01。
u-boot里面的修改:
1、将CONFIG_NR_DRAM_BANKS设置为2。
2、板子的初始化文件中的 dram_init 中再加一个bank的初始化
#if CONFIG_NR_DRAM_BANKS == 2
gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
#endif
kernel部分来不用修改的,但启动完了以后发现可用内存少了128M。内核启动开始的时候,显示了
Truncating RAM at 60000000-6fffffff to -67ffffff (vmalloc region overlap).
找了一下这句提示,在 arch/arm/mm/mmu.c里面。发现的 VMALLOC_MIN 在作怪。
static unsigned long __initdata vmalloc_reserve = SZ_128M;
#define VMALLOC_MIN (void *)(VMALLOC_END - vmalloc_reserve)
vmalloc_reserve可以通过内核参数vmalloc=size修改,详见early_vmalloc函数。我在这直接改成SZ_16M了。
阅读(2101) | 评论(1) | 转发(0) |