当前位置: 首页 > article >正文

v3s传memory

一、uboot是如何确定dram的大小的:

函数调用为:

dram_sunxi_dw.c

sunxi_dram_init  》

        mctl_auto_detect_dram_size  》

                mctl_auto_detect_dram_size_rank  》

                        mctl_mem_matches_base  》 

 static bool mctl_mem_matches_base(u32 offset, ulong base)
{
    /* Try to write different values to RAM at two addresses */
    writel(0, base);
    writel(0xaa55aa55, base + offset);
    dsb();
    /* Check if the same value is actually observed when reading back */
    return readl(base) ==
           readl(base + offset);
}

意思是,我在基地址写0,与内存未端写一个数。如果未端超出真实内存,就为0,两都相比就反回1。如果连基地址都不为0,在距离基地址很近的地址的地方,就会出现相等,表示内存出错。

需要返回不相等,来证明该距离在内存范围内。

上一个函数,也就是mctl_auto_detect_dram_size_rank()必然用到了该函数mctl_mem_matches_base()循环检测:

for( i++){

        if mctl_mem_matches_base(base+i){

                break

        }

}

size=i

二、修改设备树

int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
{

。。。省略。。。

/* find or create "/memory" node. */
    nodeoffset = fdt_find_or_add_subnode(blob, 0, "memory");
    if (nodeoffset < 0)
            return nodeoffset;

    err = fdt_setprop(blob, nodeoffset, "device_type", "memory",
            sizeof("memory"));
    if (err < 0) {
        printf("WARNING: could not set %s %s.\n", "device_type",
                fdt_strerror(err));
        return err;
    }

    for (i = 0; i < banks; i++) {
        if (start[i] == 0 && size[i] == 0)
            break;
    }

    banks = i;

    if (!banks)
        return 0;

    len = fdt_pack_reg(blob, tmp, start, size, banks);

    err = fdt_setprop(blob, nodeoffset, "reg", tmp, len);
    if (err < 0) {
        printf("WARNING: could not set %s %s.\n",
                "reg", fdt_strerror(err));
        return err;
    }

}

所以是将内存信息,通过修改dtb传递给了kernel。


http://www.kler.cn/a/522887.html

相关文章:

  • 独立成分分析 (ICA):用于信号分离或降维
  • Cursor 帮你写一个小程序
  • 低代码产品表单渲染架构
  • [蓝桥杯 2014 省 AB] 蚂蚁感冒
  • mybatis(112/134)
  • ChirpIoT技术的优势以及局限性
  • 数论问题73
  • xceed PropertyGrid 如何做成Visual Studio 的属性窗口样子
  • kaggle比赛入门 - House Prices - Advanced Regression Techniques(第三部分)
  • mapstruct入门
  • 【Linux】IPC:匿名管道、命名管道、共享内存
  • 智能课堂点名系统:从零实现一个高效课堂管理工具
  • 基于SpringBoot的高校志愿活动服务平台
  • C语言初阶牛客网刷题—— JZ11 旋转数组的最小数字【难度:简单】
  • WSL2+Ubuntu 部署Linux
  • 【CSS入门学习】Flex布局设置div水平、垂直分布与居中
  • Docker Desktop 解决从开发到部署的高效容器化工作流问题
  • Java基础教程(007):方法的重载与方法的练习
  • Linux(NTP配置)
  • JavaEE:多线程编程中的同步与并发控制
  • 逻辑学起码常识凸显级数论有重大错误:将两相同级数误为相异级数
  • WGCLOUD运维工具从入门到精通 - 如何设置主题背景
  • Rust语言进阶之迭代器:iter用法实例(九十)
  • 在docker上部署nacos
  • FPGA 23 ,使用 Vivado 实现花式跑马灯( 使用 Vivado 实现花式流水灯,采用模块化编程,从按键消抖到LED控制 )
  • Hive:基本查询语法