Linux中如何修改ddr的分配容量

电子说

1.4w人已加入

描述

在 U-Boot 中修改 DDR 容量通常涉及以下几个步骤,尤其是在嵌入式系统中,当更换或升级DDR内存芯片后:

硬件配置更新:

如果你实际更换了物理DDR模块以增大容量,首先要确保新的DDR模块与SoC兼容,并且主板的电路设计能够支持新内存的规格。

2. 设备树(Device Tree)调整:

对于基于Device Tree的Linux内核系统,需要在设备树(DTS或DTB文件)中正确描述DDR内存的大小和参数。这意味着要更新内存节点中的大小信息和其他相关属性,以便内核能识别并使用全部的新内存。

3. U-Boot 配置及编译:

在U-Boot源代码中,如果存在DDR初始化相关的代码或者宏定义,需要检查并根据实际情况修改这些配置,如DDR控制器的设置、时序参数等。

重新编译U-Boot,确保它包含对更大容量DDR的支持。

4. 启动参数调整:

在某些情况下,可能需要通过U-Boot环境变量来传递给内核正确的内存大小参数,例如修改bootargs环境变量中的mem=部分来指定系统的总内存大小。

5. 保存环境变量:

修改完启动参数后,务必用saveenv命令将新的环境变量保存到非易失性存储器中,比如SPI Flash上的环境变量分区。

以下介绍rk是如何修改DDR容量的:

开机时DDR初始化代码会把DDR容量传递给U-Boot,U-Boot会去除一些安全内存后再传递给内核。用户可以在U-Boot阶段修改传递给内核的DDR容量。 传递范例:

 

......// 传递给内核的可用内存块(已去除安全内存块)。Adding bank: 0x00200000 - 0x08400000 (size: 0x08200000)Adding bank: 0x0a200000 - 0x40000000 (size: 0x35e00000)Total: 895.411 msStarting kernel ...[ 0.000000] Booting Linux on physical CPU 0x0

 

代码位置:

 

arch/arm/mach-rockchip/param.c

 

修改位置:

 

struct memblock *param_parse_ddr_mem(int *out_count){......// 这里就是ddr传递给U-Boot的容量信息。// 因为可能出现不连续的地址,所以会分块传递,分别指明各个内存块的起始地址和大小。// PS: 一般情况下都是连续内存,不会需要分块。for (i = 0, n = 0; i < count; i++, n++) {// 比如2GB容量(连续地址),则:count=1, base = 0,size = 0x80000000。// 用户调试时可以在这里按需修改。base = t->u.ddr_mem.bank[i];size = t->u.ddr_mem.bank[i + count];/* 0~4GB */if (base < SZ_4GB) {mem[n].base = base;mem[n].size = ddr_mem_get_usable_size(base, size);if (base + size > SZ_4GB) {n++;mem[n].base_u64 = SZ_4GB;mem[n].size_u64 = base + size - SZ_4GB;}} else {/* 4GB+ */mem[n].base_u64 = base;mem[n].size_u64 = size;}assert(n < count + MEM_RESV_COUNT);}......}

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分