设备树根节点下的compatile属性的作用

一.  简介

每个节点都有 compatible 属性,根节点 “ /” 也不例外。 imx6ull-alientek-emmc.dts 设备树 文件中的根 节点下也有一个 compatible 属性。

本文继续学习设备树文件的语法。具体学习根节点 "/" 下的 compatile属性的作用。

二. 设备树根节点下的compatile属性的作用

下面以 imx6ull-alientek-emmc.dts设备树文件为例,imx6ull-alientek-emmc.dts 文件中根 节点的 compatible 属性内容如下所示:

/ {model = "Freescale i.MX6 ULL 14x14 EVK Board";compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";chosen {stdout-path = &uart1;};
........................................
};

可以看出, compatible 有两个值:“ fsl,imx6ull-14x14-evk ” 和 “ fsl,imx6ull ”。
前面我们说了, 设备节点的 compatible 属性值是为了匹配 Linux 内核中的驱动程序,那么根节点中的 compatible 属性是为了做什么工作的?
通过根节点的 compatible 属性可以知道我们所使用的设备,一般第 一个值描述了所使用的硬件设备名字,例如,这里使用的是“ imx6ull-14x14-evk ”这个设备,第二 个值描述了设备所使用的 SOC (即芯片),例如,这里使用的是 “ imx6ull ” 这颗 SOC
Linux 内核会通过根 节点的 compoatible 属性查看是否支持此设备,如果支持的话设备就会启动 Linux 内核。
接下来 我们就来学习一下 Linux 内核在使用设备树前后是如何判断是否支持某款设备的。

1.  使用设备树之前设备匹配方法

在没有使用设备树以前, uboot 会向 Linux 内核传递一个叫做 machine id 的值, machine id 也就是设备 ID ,告诉 Linux 内核自己是个什么设备,看看 Linux 内核是否支持。
Linux 内核是支持很多设备的,针对每一个设备 ( 板子 ) Linux 内核都用 MACHINE_START MACHINE_END 来定义一个 machine_desc 结构体来描述这个设备,例如,在文 arch/arm/mach-imx/mach- mx35_3ds.c 中有如下定义:
MACHINE_START(MX35_3DS, "Freescale MX35PDK")/* Maintainer: Freescale Semiconductor, Inc */.atag_offset = 0x100,.map_io = mx35_map_io,.init_early = imx35_init_early,.init_irq = mx35_init_irq,.init_time	= mx35pdk_timer_init,.init_machine = mx35_3ds_init,.reserve = mx35_3ds_reserve,.restart	= mxc_restart,
MACHINE_END

上述代码就是定义了 “ Freescale MX35PDK ” 这个设备,其中 MACHINE_START 和MACHINE_END 定义在文件 arch/arm/include/asm/mach/arch.h 中,内容如下:
#define MACHINE_START(_type,_name)			\
static const struct machine_desc __mach_desc_##_type	\__used							\__attribute__((__section__(".arch.info.init"))) = {	\.nr		= MACH_TYPE_##_type,		\.name		= _name,#define MACHINE_END				\
};

根据 MACHINE_START MACHINE_END 的宏定义,展开后如下:
static const struct machine_desc __mach_desc_MX35_3DS__used						__attribute__((__section__(".arch.info.init"))) = {	.nr		= MACH_TYPE_MX35_3DS,			//机器ID	.name		= "Freescale MX35PDK",.atag_offset = 0x100,.map_io = mx35_map_io,.init_early = imx35_init_early,.init_irq = mx35_init_irq,.init_time	= mx35pdk_timer_init,.init_machine = mx35_3ds_init,.reserve = mx35_3ds_reserve,.restart	= mxc_restart,
};

可以看出,这里定义了一个 machine_desc 类型的结构体变量 __mach_desc_MX35_3DS , 这 个 变 量 存 储 在 “ .arch.info.init ” 段 中 。
4 行 的 MACH_TYPE_MX35_3DS 就 是 “ Freescale MX35PDK ” 这 个 板 子 的 machine id
MACH_TYPE_MX35_3DS 定义在文件 include/generated/mach-types.h 中,此文件定义了大量的
machine id ,内容如下所示:
#define MACH_TYPE_EBSA110 0
..........
#define MACH_TYPE_WRT350N_V2           1633
#define MACH_TYPE_OMAP_LDP             1639
#define MACH_TYPE_MX35_3DS             1645
...............
前面说了, uboot 会给 Linux 内核传递 machine id 这个参数, Linux 内核会检查这个 machine id ,其实就是将 machine id 上面的这些 MACH_TYPE_XXX 宏进行对比,看 看有没有相等的,如果相等,就表示 Linux 内核支持这个设备,如果不支持,那么这个设 备就没法启动 Linux 内核。

2.  使用设备树以后的设备匹配方法

Linux 内 核 引 入 设 备 树 以 后 就 不 再 使 用 MACHINE_START 了 , 而 是 换 用了
DT_MACHINE_START DT_MACHINE_START 也定义在文件 arch/arm/include/asm/mach/arch.h 里面,定义如下:
#define DT_MACHINE_START(_name, _namestr)		\
static const struct machine_desc __mach_desc_##_name	\__used							\__attribute__((__section__(".arch.info.init"))) = {	\.nr		= ~0,				\.name		= _namestr,#endif

可以看出, DT_MACHINE_START MACHINE_START 基本相同,只是 .nr 的设置不同,在 DT_MACHINE_START 里面,直接将 .nr 设置为 ~0 。说明引入设备树以后,不会再根据 machine
id 来检查 Linux 内核是否支持某个设备了。

打开文件 arch/arm/mach-imx/mach-imx6ul.c ,有如下所示内容:
static const char *imx6ul_dt_compat[] __initconst = {"fsl,imx6ul","fsl,imx6ull",NULL,
};DT_MACHINE_START(IMX6UL, "Freescale i.MX6 Ultralite (Device Tree)").map_io		= imx6ul_map_io,.init_irq	= imx6ul_init_irq,.init_machine	= imx6ul_init_machine,.init_late	= imx6ul_init_late,.dt_compat	= imx6ul_dt_compat,
MACHINE_END

可以看出,machine_desc 结构体中有个 .dt_compat 成员变量,此成员变量保存着本设备兼容属性。
上面的 mach-imx6ul.c 文件中的结构体设置 .dt_compat = imx6ul_dt_compat imx6ul_dt_compat 表里面有 "fsl,imx6ul"  "fsl,imx6ull" 这两个兼容值。 只要某个设备 ( 板子 ) 的设备树文件的根节点 “ / ” 的 compatible 属性值与 imx6ul_dt_compat 表中的任何一个值相等,那么就表示 Linux 内核支持此设备。

imx6ull-alientek-emmc.dts 中根节点的 compatible 属性值如下:
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
可以看出,mach-imx6ul.c 文件 中 “fsl,imx6ull” 与 imx6ul_dt_compat 中的 “ fsl,imx6ull ” 匹配,因此 I.MX6U-ALPHA 开发板可以正常启动 Linux 内核。
如果将 imx6ull-alientek-emmc.dts 根节点的 compatible 属性改为其他的值,比如:
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ullll"

重新编译 .dts 设备树文件,并用新的 DTS 启动 Linux 内核,开发板重启后,结果如下

当我们修改了根节点 compatible 属性内容以后,因为 Linux 内核找不到对应的设备,因此,Linux 内核无法启动。在 uboot 输出 Starting kernel… 以后就再也没有其他信息输出了。

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

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

相关文章

python内app自动化测试的局限性,该如何破局?

Python在App自动化测试方面非常流行,尤其对于移动应用(Android和iOS)的测试,可以借助于像Appium、Robot Framework等工具进行跨平台自动化。然而,即使使用Python这样的强大语言,App自动化测试也存在一些局限…

JavaScript的闭包、执行上下文、到底是怎么回事?还有必要学吗?

在上一课,我们了解了 JavaScript 执行中最粗粒度的任务:传给引擎执行的代码段。并且,我们还根据“由 JavaScript 引擎发起”还是“由宿主发起”,分成了宏观任务和微观任务,接下来我们继续去看一看更细的执行粒度。 一…

彻底卸载Microsoft Edge:一步步指南

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 随着技术的不断发展,互联网浏览器已成为我们日常生活中不可或缺的工具之…

网络安全B模块(笔记详解)- Web渗透测试

Web渗透测试 1.通过渗透机Kali1.0对服务器场景PYsystem20192进行Web渗透测试(使用工具w3af的对目标Web服务器进行审计),在w3af的命令行界面下,使用命令列出所有用于审计的插件,将该操作使用的命令作为Flag值提交; 进入kali命令控制台中使用命令w3af_console进入w3af命令…

APP广告变现常见的植入广告类型

随着移动互联网的快速发展,APP广告变现成为许多应用开发者和企业的重要收入来源之一。在众多广告类型中,植入广告因其自然、有效的推广方式而备受欢迎。本文将深入探讨APP广告变现中常见的植入广告类型。 admaoyan猫眼聚合 内容植入广告: 原生…

设计模式的艺术P1基础—2.4-2.11 面向对象设计原则

设计模式的艺术P1基础—2.4-2.11 面向对象设计原则 2.4 面向对象设计原则概述 向对象设计的目标之一在于支持可维护性复用,一方面需要实现设计方案或者源代码的重用,另一方面要确保系统能够易于扩展和修改,具有较好的灵活性。 面向对象设计…

收藏!一文读懂“灯塔工厂”完整申报流程

1、什么是灯塔工厂? 灯塔工厂是通过数字化、网络化和智能化手段,运用先进的工业4.0技术和理念,实现生产过程的全面自动化、精确化和优化。它不仅实现了数字化与物理世界的深度融合,而且提高了生产效率和质量,降低了制…

提升决策效率:探索NL2SQL和KBQA在实际应用中的奇迹

⭐简单说两句⭐ ✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! &…

kubernetes 网络解析

开头语 写在前面:如有问题,以你为准, 目前24年应届生,各位大佬轻喷,部分资料与图片来自网络 内容较长,页面右上角目录方便跳转 基础 Kubernetes 使用扁平网络模型,所有 Pod 都可以直接相互…

AI智能电销器人需要注意哪些问题呢

随着科技的不断发展,人们出行变得越来越方便,市面上很多产品也越来越智能化,高科技的产品不仅改变了我们的生活方式而且也改变了企业的竞争方式,很多的企业尤其是电销行业中的大佬己经意识到了AI电销机器人的好处,因此…

CLIP论文总结

文章目录 NLP的积淀Method1. 预训练的方法:放宽约束:对比学习2. 模型训练训练时间 ExperimentsMotivationPrompt:提示:也就是文本的引导作用Prompt enginneringPrompt ensembling 对比实验 NLP的积淀 取之不尽用之不竭的自监督信…

Maven 工程 java -jar 时提示 xxx-SNAPSHOT.jar 中没有主清单属性

Maven 工程 java -jar 时提示 xxx-SNAPSHOT.jar 中没有主清单属性 将skip属性注释掉或者改为false 如果为true,则工程找不到主启动类

Python print 高阶玩法

Python print 高阶玩法 当涉及到在Python中使用print函数时,有许多方式可以玩转文本样式、字体和颜色。在此将深入探讨这些主题,并介绍一些print函数的高级用法。 1. 基本的文本样式与颜色设置 使用ANSI转义码 ANSI转义码是一种用于在终端&#xff0…

C#中的静态字段double.Epsilon

double.Epsilon 是C#中的一个静态字段,表示 double 数据类型的最小可表示的正数值。它的值为 4.94065645841247e-324。 在浮点数表示中,存在着精度有限的问题,即使是双精度浮点数 double 也无法表示所有的实数。由于浮点数的存储方式&#x…

【JVM线上故障排查】

对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的。各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题。楼主同样也遇到过这些问题,那么,遇到这些问题该如何解决呢&…

【Vue3+Ts项目】硅谷甄选 — 品牌管理模块+平台属性管理模块

一、品牌管理模块 1.1 静态模块搭建 使用到element-plus的card、button、table、pagination等组件&#xff1a;src/views/product/trademark/index.vue <template><el-card><!-- 卡片顶部添加品牌按钮 --><el-button type"primary" size&quo…

k8s的集群调度---下

前情回顾 预算策略&#xff1a;过滤出合适的节点 优选策略&#xff1a;选择部署的节点 nodeName&#xff1a;硬匹配&#xff0c;不走调度策略。node01. nodeSelector&#xff1a;根据节点的标签选择&#xff0c;会走调度算法。 只要是走调度算法&#xff0c;在不满足预算策…

计算机图形学流体模拟 blender 渲染脚本

做流体模拟的时候&#xff0c;想要复现别人的成果&#xff0c;但是别人的代码都是每帧输出 ply 格式的文件&#xff0c;渲染部分需要自己完成 看了一下&#xff0c;似乎用 blender 是最简单的&#xff0c;于是记录一下过程中用到的代码 Blender 版本 4.0 批量导入 ply 假设…

LeetCode 31. 下一个排列

31. 下一个排列 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正…

【hcie-cloud】【17】华为云Stack灾备服务介绍【灾备方案概述、备份解决方案介绍】【上】

文章目录 前言灾备方案概述灾备的定义灾备的重要性故障和灾难对业务连续性带来的挑战灾备系统的衡量指标RTO与RPO分析 灾备等级标准数据中心容灾解决方案全景图云灾备服务总结架构华为云Stack灾备服务总览 备份解决方案介绍云备份服务介绍备份服务架构介绍云备份服务组件功能介…