DDR地址另外配置+DDR初始化参数更改2

这篇博客记录了在《朱老师物联网大讲堂》中学到的DDR内存地址从0x20000000更改为0x30000000的过程。更改涉及DDR初始化代码中的宏定义、内存基址、SDRAM银行大小、虚拟地址映射表以及MMU相关设置。博主通过调整DMC0_MEMCONFIG_0寄存器的值和相关代码,解决了地址变更带来的问题。
摘要由CSDN通过智能技术生成

《朱老师物联网大讲堂》学习笔记

学习地址:www.zhulaoshi.org


将0x20000000更改到0x30000000,
好处就是和DRAM1以0x40000000开头的地址,连到一起了,



DDR初始化代码在lowlevel_init.S中,
是不动的,即对相应寄存器操作是不变的,
变得是对寄存器中写的值得更改,
而这个值是以宏定义的形式存在的,
所以我们更改这个值就可以了,



#define DMC0_MEMCONFIG_0 0x20E01323
改为如下
#define DMC0_MEMCONFIG_0 0x30E01323
此时相当于硬件更改到30开头的,
但是与之对应的软件部分还没更改,


#define MEMORY_BASE_ADDRESS 0x20000000
改为如下
#define MEMORY_BASE_ADDRESS 0x30000000



而上面这句话的使用地方,我们前面才提到,
在这里,
#define CONFIG_NR_DRAM_BANKS    2          /* we have 2 bank of DRAM */
//#define SDRAM_BANK_SIZE         0x20000000    /* 512 MB */
#define SDRAM_BANK_SIZE         0x10000000    /* 256 MB */
#define PHYS_SDRAM_1            MEMORY_BASE_ADDRESS /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE       SDRAM_BANK_SIZE
//#define PHYS_SDRAM_2            (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */
#define PHYS_SDRAM_2            0x40000000
#define PHYS_SDRAM_2_SIZE       SDRAM_BANK_SIZE



虚拟地址映射表中的更改,
从start.s中去找,
找到_mmu_table_base,
接着找到lowlevel.init.s中的mmu_table,

// .set __base,0x200

修改为
.set __base,0x300


这是整体的,顺便看下虚拟地址设置,

/* .rept 0xc00 - 0xb00
.word 0x00000000
.endr */


.set __base,0xB00
.rept 0xc00 - 0xb00
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr


//.set __base,0x200
.set __base,0x300
// 256MB for SDRAM with cacheable
.rept 0xD00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr


最好改,如果我们没有使能MMU就,完蛋了,
 /* base address for uboot */
#ifdef CONFIG_ENABLE_MMU
#define CFG_UBOOT_BASE 0xc3e00000
#else
//#define CFG_UBOOT_BASE 0x23e00000
#define CFG_UBOOT_BASE 0x33e00000
#endif
结果只出现了一个OK,


上面说到效果进了一步,但是还是有问题,

改这里,是上面修改过的地方,

#define DMC0_MEMCONFIG_0 0x30E01323
修改后
#define DMC0_MEMCONFIG_0 0x30F01323,


这是另一个地方,

#ifdef CONFIG_MCP_SINGLE
ulong virt_to_phy_smdkc110(ulong addr)
{
if ((0xc0000000 <= addr) && (addr < 0xd0000000))
//return (addr - 0xc0000000 + 0x20000000);
return (addr - 0xc0000000 + 0x30000000);
else
printf("The input address don't need "\"a virtual-to-physical translation : %08lx\n", addr);
return addr;
}


然后这一部分就算ok了,

//return (addr - 0xc0000000 + 0x20000000);
return (addr - 0xc0000000 + 0x30000000);

这个20开头改30应该能联想到前面吧,

DDR初始化没问题,但是DDR的这些参数,对其它方面间接产生了影响,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值