韦东山嵌入式linux系列-驱动进化之路:设备树的引入及简明教程

1 设备树的引入与作用

以 LED 驱动为例,如果你要更换LED所用的GPIO引脚,需要修改驱动程序源码、重新编译驱动、重新加载驱动。

在内核中,使用同一个芯片的板子,它们所用的外设资源不一样,比如A板用 GPIO A, B 板用 GPIO B。而 GPIO 的驱动程序既支持 GPIO A 也支持GPIO B,你需要指定使用哪一个引脚,怎么指定?在 c 代码中指定。

随着 ARM 芯片的流行,内核中针对这些 ARM 板保存有大量的、没有技术含量的文件。

于是, Linux 内核开始引入设备树。

设备树并不是重新发明出来的,在 Linux 内核中其他平台如 PowerPC,早就使用设备树来描述硬件了

有一种错误的观点,说“新驱动都是用设备树来写了”。 设备树不可能用来写驱动。

请想想,要操作硬件就需要去操作复杂的寄存器,如果设备树可以操作寄存器,那么它就是“驱动”,它就一样很复杂。

设备树只是用来给内核里的驱动程序, 指定硬件的信息。比如 LED 驱动,在内核的驱动程序里去操作寄存器,但是操作哪一个引脚?这由设备树指定。(相当于配置文件

一个单板启动时, u-boot 先运行,它的作用是启动内核。 U-boot 会把内核和设备树文件都读入内存,然后启动内核。在启动内核时会把设备树在内存中的地址告诉内核。

2 设备树的语法

为什么叫“树?

中间是bus总线,树干是各种设备。

怎么描述这棵树?

需要编写设备树文件(dts: device tree source),它需要编译为dtb(device tree blob)文件,内核使用的是 dtb 文件。

下面是一个设备树示例

它对应的 dts 文件如下

/dts-v1/;/ {model="fsl,mpc8572ds"compatible="fsl,mpc8572ds"#address-cells=<1>#size-cells=<1>cpus {#address-cells=<1>#size-cells=<0>cpu@0 {device_type="cpu"reg=<0>timebase-frequency=<825000000>clock-frequency=<825000000>};cpu@1 {device_type="cpu"reg=<1>timebase-frequency=<825000000>clock-frequency=<825000000>};};memory@0 {device_type="memory"reg=<0 0x20000000>};uart@fe001000 {compatible="ns16550"reg=<0xfe001000 0x100>};chosen {bootargs="root=/dev/sda2";};aliases {serial0="/uart@fe001000"};
};

2.1 Devicetree 格式

1 DTS 文件的格式。设备树文件(dts: device tree source)

DTS 文件布局(layout):

/dts-v1/;             // 表示版本
[memory reservations] // 格式为: /memreserve/ <address> <length>;
/ {[property definitions][child nodes]
};

2 node 的格式

设备树中的基本单元,被称为“ node”,其格式为:

[label:] node-name[@unit-address] {[properties definitions][child nodes]
};

label 是标号,可以省略。 label 的作用是为了方便地引用 node,比如:

/dts-v1/;
/ {uart0: uart@fe001000 {compatible="ns16550";reg=<0xfe001000 0x100>;};
};

可以使用下面 2 种方法来修改 uart@fe001000 这个 node:

// 在根节点之外使用 label 引用 node:
&uart0 {status = “disabled”;
};// 或在根节点之外使用全路径:
&{/uart@fe001000} {status = “disabled”;
};

3 properties 的格式

简单地说, properties 就是“ name=value”, value 有多种取值方式。

Property 格式 1:

[label:] property-name = value;

Property 格式 2(没有值):

[label:] property-name;

Property 取值只有 3 种:

arrays of cells(1 个或多个 32 位数据, 64 位数据使用 2 个 32 位数据表示),
string(字符串),
bytestring(1 个或多个字节)

示例:

a) Arrays of cells : cell 就是一个 32 位的数据,用尖括号包围起来

interrupts = <17 0xc>;

b) 64bit 数据使用 2 个 cell 来表示,用尖括号包围起来:

clock-frequency = <0x00000001 0x00000000>;

c) A null-terminated string (有结束符的字符串),用双引号包围起来:

compatible = "simple-bus";

d) A bytestring(字节序列) ,用中括号包围起来:

local-mac-address = [00 00 12 34 56 78];    // 每个byte使用2个16进制数来表示
local-mac-address = [000012345678];         // 每个byte使用2个16进制数来表示

可以是各种值的组合, 用逗号隔开:

compatible = "ns16550", "ns8250";
example = <0xf00f0000 19>, "a strange property format";

2.2 dts 文件包含 dtsi 文件
 

2.3 常用的属性

2.4 常用的节点(node)

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

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

相关文章

TI毫米波雷达1843 Out-of-box Demo 总结

总结 以上就是基于MATLAB实现1843 Out-of-box Demo的实时数据采集的相关内容,里面包含了 如何快速上手TI的毫米波雷达开发板;如何使用CCS构建TI的工程代码框架;如何阅读CCS源码确定串口输出的通讯协议;如何使用MATLAB实时接收串口数据;如何使用MATLAB编写上位机软件;成品…

13 循环神经网络—序列模型,语言模型

目录 1.序列模型序列数据统计工具自回归模型马尔可夫模型因果关系前向算法举例(根据过去的事件推测未来的事件)方案 A -马尔科夫假设方案 B -潜变量模型总结代码实现 使用马尔科夫假设 训练一个MLP2.文本预处理常见的文本预处理步骤代码实现3.语言模型**使用计数来建模**N 元…

大模型评测技术研讨会暨国际标准IEEE P3419第二次工作组会议成功召开

7月12日&#xff0c;由北京智源人工智能研究院主办的大模型评测技术研讨会暨国际标准IEEE P3419第二次工作组会议在智源大厦举办&#xff0c;来自百度、信通院、移动、联通、电信、浪潮、南方电网、南瑞、清华、北航等互联网大厂、科研机构、运营商、知名高校以及海外的50余位专…

Android:创建自定义View

点击查看创建自定义view官网文档 一、简介 设计良好的自定义视图与任何其他精心设计的类一样。它通过一个简单的接口封装一组特定的功能&#xff0c;高效使用 CPU 和内存&#xff0c;诸如此类。除了是一个精心设计的类之外&#xff0c;自定义视图还必须执行以下操作&#xff1…

vue echarts 柱状图表,点击柱子,路由代参数(X轴坐标)跳转

一 myChart.on(click, (params) > {if (params.componentType series && params.dataIndex ! undefined) {const months this.month_htqd[params.dataIndex]; // 获取点击柱状图的 X 轴坐标值alert(点击了柱状图&#xff0c;值为: ${months});// 根据点击的柱状图…

哪种SSL证书可以快速签发保护http安全访问?

用户访问网站&#xff0c;经常会遇到访问http网页时&#xff0c;提示网站不安全或者不是私密连接的提示&#xff0c;因为http是使用明文传输&#xff0c;数据传输中可能被篡改&#xff0c;数据不被保护&#xff0c;通常需要SSL证书来给数据加密。 SSL证书的签发速度&#xff0…

自动化测试中如何应对网页弹窗的挑战!

在自动化测试中&#xff0c;网页弹窗的出现常常成为测试流程中的一个难点。无论是警告框、确认框、提示框&#xff0c;还是更复杂的模态对话框&#xff0c;都可能中断测试脚本的正常执行&#xff0c;导致测试结果的不确定性。本文将探讨几种有效的方法来应对网页弹窗的挑战&…

Postgresql-12.5 安装及配置 -银河麒麟V10服务器版本

Postgresql-12.5 安装及配置 环境基于银河麒麟V10 服务器版本操作 此安装步骤Linux操作系统几乎通用 下载数据库安装包 链接&#xff1a;https://pan.baidu.com/s/1wt4Yjwv79W-fCd4tlMC4-w 提取码&#xff1a;0117 1.下载依赖 可以用系统自带的依赖库下载 yum install -…

基于PHP+MYSQL开发制作的趣味测试网站源码

基于PHPMYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分&#xff0c; 自己手动在数据库里修改数据&#xff0c;数据库里有就会优先查询数据库的信息&#xff0c; 没设置的话第一次查询缘分都是非常好的 95-99&#xff0c;第二次查就比较差 &#xff0c; 所以如果要…

什么是SQL锁

SQL锁是数据库系统中的一个重要概念&#xff0c;主要用于保证多用户环境下的数据库完整性和一致性。在多用户并发访问数据库时&#xff0c;通过加锁的方式防止其他事务访问指定的资源&#xff0c;从而控制并发的访问&#xff0c;确保数据的完整性和一致性。 SQL锁可以分为以下…

msyql (8.4,9.0) caching_sha2_password 转换 mysql_native_password用户认证

mysql 前言 caching_sha2_password 主要特性 用于增强用户账户密码的存储和验证安全性。这种插件利用 SHA-256 散列算法的变体来存储和验证密码 安全的密码散列&#xff1a; caching_sha2_password 使用基于 SHA-256 的算法来生成密码的散列值。这意味着即使数据库被未授权访…

地图项目涉及知识点总结

序&#xff1a;最近做了一个在地图上标记点的项目&#xff0c;用户要求是在地图上显示百万量级的标记点&#xff0c;并且地图仍要可用&#xff08;能拖拽&#xff0c;能缩放&#xff09;。调研了不少方法和方案&#xff0c;最终实现了相对流畅的地图系统&#xff0c;加载耗时用…

spring-boot 整合 redisson 实现延时队列(文末有彩蛋)

应用场景 通常在一些需要经历一段时间或者到达某个指定时间节点才会执行的功能&#xff0c;比如以下这些场景&#xff1a; 订单超时提醒收货自动确认会议提醒代办事项提醒 为什么使用延时队列 对于数据量小且实时性要求不高的需求来说&#xff0c;最简单的方法就是定时扫描数据…

【IEEE出版】第四届能源工程与电力系统国际学术会议(EEPS 2024)

第四届能源工程与电力系统国际学术会议&#xff08;EEPS 2024&#xff09; 2024 4th International Conference on Energy Engineering and Power Systems 重要信息 大会官网&#xff1a;www.iceeps.com 大会时间&#xff1a;2024年8月9-11日 大会…

S7-1200PLC使用西门子报文 111 和 FB38002(Easy_SINA_Pos)实现V90 PN总线伺服定位控制

1、博途1200/1500 PLC V90 PN通信 博途1200/1500PLC V90 PN通信控制 (FB284功能块)_fb284功能块文档说明-CSDN博客文章浏览阅读7k次。先简单说下如何获取FB284,一般有2种方法,Startdrive软件可以操作大部分西门子的驱动器,建议安装调试方便,缺点就是软件太大。_fb284功能…

安装anaconda后jupyter notebook打不开 闪退

首先&#xff0c;通过清华源安装了最新的anaconda&#xff08;安装在了D盘&#xff09; 尝试打开jupyter&#xff0c;发现小黑框1s后自己关了&#xff0c;根本不打开浏览器 之后尝试按照这个做了一遍https://blog.csdn.net/gary101818/article/details/123560304还是不行。。…

Jmeter性能测试(九)

一、Jmeter性能测试需要特别注意的地方 1、参数化 2、请求参数 3、BeanShell 预处理程序更新jmeter请求参数 4、接口中不可重复的随机数处理 5、线程组设置 6、总结 二、参数化 1、参数化配置,多个参数用英文逗号隔开 2、wallet参数化文件,不要写表头,多个参数用英文逗号…

二叉树的前、中、后序遍历(递归法、迭代法)leetcode144/94/145

leetcode144、二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a;…

鸿蒙开发入门——ArkTS语法简介(万字简介)

ArkTS 作为鸿蒙开发的编程语言&#xff0c;我们先来一图看看这个语言&#xff0c;我们可以看到ArkTS是在TS&#xff08;TypeScript&#xff09;的基础上改造的&#xff0c;而TS又是在JS&#xff08;JavaSript&#xff09;上改造的&#xff0c;一句话总结就是ArkTS是TS的超集&a…

新版本 idea 创建不了 spring boot 2 【没有jkd8选项】

创建新项目 将地址换成如下 https://start.aliyun.com/