Rk3568驱动开发_设备树_9

news2025/3/25 7:04:07

什么是设备树?

以我目前的理解,设备树更像日常生活中用的地图,用户能根据地图去寻找到相应位置

设备树也是如此它描述了硬件设备的连接关系和配置信息,供 CPU(或者更准确地说,是操作系统内核)在启动时读取和解析,从而正确地识别和初始化硬件设备

在这里插入图片描述

设备树代码编写与代码解析:

根节点

/ {
 compatible = "rockchip,rk3568-evb1-ddr4-v10", "rockchip,rk3568";
 }

/ { 为根节点,代表设备树的起点,compatible:这是设备树中非常重要的属性,用于标识设备的兼容性,“rockchip,rk3568-evb1-ddr4-v10”:这是第一个兼容性字符串,表示该设备树描述的是 Rockchip RK3568 的开发板 EVB1 DDR4 V10 版本。这是一个非常具体的描述,用于匹配特定的硬件平台。“rockchip,rk3568”:这是第二个兼容性字符串,表示该设备树也兼容 Rockchip RK3568 芯片。这是一个更通用的描述,用于匹配所有基于 RK3568 芯片的硬件平台。

内核在启动时会读取 compatible 属性,根据这些字符串来选择合适的初始化代码和驱动程序。
如果内核中有一个驱动程序支持 rockchip,rk3568-evb1-ddr4-v10,那么它会被优先加载。如果没有,内核会尝试加载支持 rockchip,rk3568 的驱动程序。

用设备树描述下面信息

设备树里面描述的内容如下:
① 、这个芯片是由四个 Cortex-A55 架构的 64 位 CPU 组成。
② 、RK3568 内部 uart2,起始地址为 0xfe660000,大小为 256B(0x100)。
③ 、RK3568 内部 spi0,起始地址为 0xfe610000,大小为 4KB(0x1000)。
④ 、RK3568 内部 i2c5,起始地址为 0xfe5e0000,大小为 4KB(0x1000)

1、添加 cpus 节点

/ {
    compatible = "rockchip,rk3568-evb1-ddr4-v10", "rockchip,rk3568";

    cpus {
        #address-cells = <2>;
        #size-cells = <0>;

        /* CPU0 节点 */
        cpu0: cpu@0 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x0>;
        };

        /* CPU1 节点 */
        cpu1: cpu@1 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x100>;
        };

        /* CPU2 节点 */
        cpu2: cpu@2 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x200>;
        };

        /* CPU3 节点 */
        cpu3: cpu@3 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x300>;
        };
    };
};

cpus 表示cpu集合的节点,#address-cells = <2>;:表示每个 CPU 节点的地址由 2 个单元(64 位)表示,#size-cells = <0>;:表示 CPU 节点没有大小信息(size 属性)。cpu0: cpu@0:定义了一个名为 cpu0 的 CPU 节点,地址为 0x0。device_type = “cpu”;:表示这是一个 CPU 设备。compatible = “arm,cortex-a55”;:表示该 CPU 是 ARM Cortex-A55 架构,reg = <0x0 0x0>;:定义了 CPU 的地址,这里是一个 64 位的地址 0x0
reg 属性是一个 64 位的地址,表示设备的地址范围。具体解释如下:
<0x0 0x100>:这是一个由两个单元组成的地址值,每个单元是 32 位(4 字节)。
0x0:表示设备的起始地址的高位部分。
0x100:表示设备的起始地址的低位部分。
因此,reg = <0x0 0x100>; 表示设备的起始地址是 0x0000000000000100(即 16 进制的 0x100)。

完整代码:

/ {
    compatible = "rockchip,rk3568-evb1-ddr4-v10", "rockchip,rk3568";

    cpus {
        #address-cells = <2>;
        #size-cells = <0>;

        /* CPU0 节点 */
        cpu0: cpu@0 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x0>;
        };

        /* CPU1 节点 */
        cpu1: cpu@100 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x100>;
        };

        /* CPU2 节点 */
        cpu2: cpu@200 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x200>;
        };

        /* CPU3 节点 */
        cpu3: cpu@300 {
            device_type = "cpu";
            compatible = "arm,cortex-a55";
            reg = <0x0 0x300>;
        };
    };

    /* uart2 节点 */
    uart2: serial@fe660000 {
        compatible = "rockchip,rk3568-uart", "snps,dw-apb-uart";
        reg = <0x0 0xfe660000 0x0 0x100>;
    };

    /* spi0 节点 */
    spi0: spi@fe610000 {
        compatible = "rockchip,rk3568-spi", "rockchip,rk3066-spi";
        reg = <0x0 0xfe610000 0x0 0x1000>;
    };

    /* i2c5 节点 */
    i2c5: i2c@fe5e0000 {
        compatible = "rockchip,rk3568-i2c", "rockchip,rk3399-i2c";
        reg = <0x0 0xfe5e0000 0x0 0x1000>;
    };
};

reg = <0x0 0xfe5e0000 0x0 0x1000>; <0x0 0xfe5e0000>:表示设备的地址,<0x0 0x1000>:表示设备的大小

对于外设设备(如 UART、SPI、I2C 等),reg 属性通常包含两个部分:
地址(Address):设备的寄存器基地址。
大小(Size):设备的寄存器区域大小。
对于 CPU 核心,reg 属性通常只包含地址部分,而没有大小部分。这是因为 CPU 核心的寄存器地址通常不需要定义一个固定的大小范围。CPU 核心的寄存器地址通常是固定的,并且由硬件设计决定。
外设设备:reg 属性包含地址和大小部分,因为外设设备的寄存器区域需要定义一个地址范围,以便内核能够正确地访问这些寄存器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习:从零开始的DeepSeek-R1-Distill有监督微调训练实战(SFT)

原文链接&#xff1a;从零开始的DeepSeek微调训练实战&#xff08;SFT&#xff09; 微调参考示例&#xff1a;由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…

【AI News | 20250320】每日AI进展

AI Repos 1、servers 该仓库提供详细入门指南&#xff0c;用户可通过简单步骤连接Claude客户端&#xff0c;快速使用所有服务器功能。此项目由Anthropic管理&#xff0c;展示MCP的多样性与扩展性&#xff0c;助力开发者为大语言模型提供安全、可控的工具与数据访问。 2、awe…

从零开始实现 C++ TinyWebServer 阻塞队列 BlockQueue类详解

文章目录 阻塞队列是什么&#xff1f;为什么需要阻塞队列&#xff1f;BlockQueue 成员变量实现 push() 函数实现 pop() 函数实现 close() 函数BlockQueue 代码BlockQueue 测试 从零开始实现 C TinyWebServer 项目总览 项目源码 阻塞队列是什么&#xff1f; 阻塞队列是一种线程…

Linux驱动开发基础(can)

目录 1.can的介绍 2.can的硬件连接 2.1 CPU自带can控制器 2.2 CPU没有can控制器 3.电气属性 4.can的特点 5.can协议 5.1 can的种类 5.2 数据帧 5.2.1 标准数据帧格式 5.3.1 扩展数据帧格式 5.3 遥控帧 5.4 错误帧 5.5 过载帧 5.6 帧间隔 5.7 位填充 5.8 位时…

leetcode热题100道——字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", &…

MCU-芯片时钟与总线和定时器关系,举例QSPI

时钟源&#xff1a; 时钟源为系统时钟提供原始频率信号&#xff0c;系统时钟则通过&#xff08;分频、倍频、选择器&#xff09;成为整个芯片的“主时钟”&#xff0c;驱动 CPU 内核、总线&#xff08;AHB、APB&#xff09;及外设的运行。 内部时钟源&#xff1a; HSI&#x…

技术分享 | MySQL内存使用率高问题排查

本文为墨天轮数据库管理服务团队第51期技术分享&#xff0c;内容原创&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 一、问题现象 问题实例mysql进程实际内存使用率过高 二、问题排查 2.1 参数检查 mysql版本 &#xff1a;8.0.…

分享一个精灵图生成和拆分的实现

概述 精灵图&#xff08;Sprite&#xff09;是一种将多个小图像合并到单个图像文件中的技术&#xff0c;广泛应用于网页开发、游戏开发和UI设计中。在MapboxGL中&#xff0c;跟之配套的还有一个json文件用来记录图标的大小和位置。本文分享基于Node和sharp库实现精灵图的合并与…

函数:形参和实参

在函数的使用过程中分为实参和形参&#xff0c;实参是主函数实际调用的值而形参则是给实参调用的值&#xff0c;如果函数没被调用则函式不会向内存申请空间&#xff0c;先用一段代码演示 形参&#xff1a; int test(int x ,int y ) {int z 0;z x y;return z; } 为何会叫做…

【C#知识点详解】ExcelDataReader介绍

今天来给大家介绍一下ExcelDataReader&#xff0c;ExcelDataReader是一个轻量级的可快速读取Excel文件中数据的工具。话不多说直接开始。 ExcelDataReader简介 ExcelDataReader支持.xlsx、.xlsb、.xls、.csv格式文件的读取&#xff0c;版本基本在2007及以上版本&#xff0c;支…

《视觉SLAM十四讲》ch13 设计SLAM系统 相机轨迹实现

前言 相信大家在slam学习中&#xff0c;一定会遇到slam系统的性能评估问题。虽然有EVO这样的开源评估工具&#xff0c;我们也需要自己了解系统生成的trajectory.txt的含义&#xff0c;方便我们更好的理解相机的运行跟踪过程。 项目配置如下&#xff1a; 数据解读&#xff1a; …

在类Unix终端中如何实现快速进入新建目录

&#x1f6aa; 前言 相信喜欢使用终端工作的小伙伴或多或少会被一个小地方给膈应&#xff0c;那就是每次想要新建一个文件夹并且进入之&#xff0c;那么就需要两条指令&#xff1a;mkdir DIR和cd DIR&#xff0c;有些人可能要杠了&#xff0c;我一条指令也能&#xff0c;mkdir…

TG电报群管理机器人定制开发的重要性

在Telegram&#xff08;电报&#xff09;用户突破20亿、中文社群规模持续扩张的背景下&#xff0c;定制化群管理机器人的开发已成为社群运营的战略刚需。这种技术工具不仅解决了海量用户管理的效率难题&#xff0c;更通过智能化功能重构了数字社群的治理范式。本文从管理效能、…

VNA操作使用学习-01 界面说明

以我手里面的liteVNA为例。也可以参考其他的nanoVNA的操作说明。我先了解一下具体的菜单意思。 今天我想做一个天调&#xff0c;居然发现我连一颗基本的50欧姆插件电阻和50欧姆的smt电阻的幅频特性都没有去测试过&#xff0c;那买来这个nva有什么用途呢&#xff0c;束之高阁求…

耘想Docker版Linux NAS的安装说明

耘想LinNAS&#xff08;Linux NAS&#xff09;可以通过Docker部署&#xff0c;支持x86和arm64两种硬件架构。下面讲解LinNAS的部署过程。 1. 安装Docker CentOS系统&#xff1a;yum install docker –y Ubuntu系统&#xff1a;apt install docker.io –y 2. 下载LinNas镜像…

OpenCV图像拼接(4)图像拼接模块的一个匹配器类cv::detail::BestOf2NearestRangeMatcher

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::BestOf2NearestRangeMatcher 是 OpenCV 库中用于图像拼接模块的一个匹配器类&#xff0c;专门用于寻找两幅图像之间的最佳特征点匹配…

不用 Tomcat?SpringBoot 项目用啥代替?

在SpringBoot框架中&#xff0c;我们使用最多的是Tomcat&#xff0c;这是SpringBoot默认的容器技术&#xff0c;而且是内嵌式的Tomcat。 同时&#xff0c;SpringBoot也支持Undertow容器&#xff0c;我们可以很方便的用Undertow替换Tomcat&#xff0c;而Undertow的性能和内存使…

Zabbix安装(保姆级教程)

Zabbix 是一款开源的企业级监控解决方案&#xff0c;能够监控网络的多个参数以及服务器、虚拟机、应用程序、服务、数据库、网站和云的健康状况和完整性。它提供了灵活的通知机制&#xff0c;允许用户为几乎任何事件配置基于电子邮件的告警&#xff0c;从而能够快速响应服务器问…

鸿蒙开发真机调试:无线调试和USB调试

前言 在鸿蒙开发的旅程中&#xff0c;真机调试堪称至关重要的环节&#xff0c;其意义不容小觑。虽说模拟器能够为我们提供初步的测试环境&#xff0c;方便我们在开发过程中快速预览应用的基本效果&#xff0c;但它与真机环境相比&#xff0c;仍存在诸多差异。就好比在模拟器中…

工厂函数详解:概念、目的与作用

一、什么是工厂函数&#xff1f; 工厂函数&#xff08;Factory Function&#xff09;是一种设计模式&#xff0c;其核心是通过一个函数来 创建并返回对象&#xff0c;而不是直接使用 new 或构造函数实例化对象。它封装了对象的创建过程&#xff0c;使代码更灵活、可维护。 二、…