设备树根节点下的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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

kubernetes 网络解析

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

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…

k8s的集群调度---下

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

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

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

linux查找文件中的指定字符,并批量替换文件中指定字符

1、grep -rl “jquery-1.8.0.min.js” /opt 查找/opt 目录下存在jquery-1.8.0.min.js的文件 [rootlocalhost file1]# grep -rl "jquery-1.8.0.min.js" /opt /opt/file1/index.xhtml /opt/file2/index.xhtml /opt/shell.sh扩展:使用该命令可以查找文件中…

DevEco Studio预览时报错:Build task failed. Open the Run window to view details.

图一: 解决方案 图二 : 图三: 按照以上图示步骤,去掉图三中3号标记的勾选

/usr/bin/ld: error: ../../lib/libnvinfer.so: file too short

一、背景 在编译TensorRT官方的C库时,库里是提供了命令行工具bin文件夹下的可执行程序trtexec,可以直接进行onnx的fp16以及int8量化,但我模型的输入是5维,模型里面全都是3D卷积,所以要对底层头文件进行修改。重新编译…

Python词云wordcloud库不显示中文

博主之前在项目中发现Python的词云库wordcloud显示的都是方框,别担心,我有一个妙招让你的中文词云变得美观又清晰! 问题 wordcloud是一个基于python的词云生成库,它可以让你用简单的代码创建出各种形状和颜色的词云图像。 word…

工业数据采集分析——工厂大脑 提升综合经济效益

随着企业对数字化的认知越来越清晰,对工业数智化的战略越来越明确,企业的诉求也在发生转变。中国的工业企业经过近几十年的发展,自动化、信息化,以及一些基础的数据系统建设在不同的行业中慢慢地推进。近几年,工业企业…

STM32CubeMX配置STM32G031多通道UART+DMA收发数据(HAL库开发)

时钟配置HSI主频配置64M 配置好串口&#xff0c;选择异步模式 配置DMA TX,RX,选择循环模式。 NVIC中勾选使能中断 勾选生成独立的.c和h文件 配置好需要的开发环境并获取代码 串口重定向勾选Use Micro LIB main.c文件修改 增加头文件和串口重定向 #include <string.h&g…

第三节课作业

复现&#xff1a; 对mmagic的理解

Vue3-44-Pinia- 安装步骤

介绍 本文介绍 在 vue3 中 安装 Pinia 的步骤 安装步骤 1、npm 安装 npm install pinia》 安装完成后可以看到 package.json 中添加了 pinia 的依赖信息 2、main.ts 中配置 // 引入 vue实例创建方法 import { createApp } from vue// 引入pinia import { createPinia } fro…