在第一课中学习了如何安装NCS开发环境,以及如何新建一个工程,还有如何构建和下载到开发板。并运行了官方的LED闪烁例程。

设备树

我们继续跟着官方开发者学院的教程来学习第二课的课程。官方课程包含了以下几个知识点:

设备树

设备驱动模型

GPIO的通用API

个人觉得设备树应该算一个难点,因为对于没有接触过linux驱动开发的人员来说是一个全新的知识点。

设备树是一种树状结构。文件格式是*.dts

下面是一个示例 DTS 文件:

/dts-v1/;

/ {
aliases {
serial0 = &uart0; // 别名 serial0 指向标签 uart0
}; soc {
uart0: serial@ff000000 { // 节点名称 serial@ff000000,标签 uart0
compatible = "ns16550a";
reg = <0xff000000 0x1000>;
};
};
};

设备树中有几个概念一定要搞清楚:节点名称标签别名属性.

1. 节点名称(Node Name)

  • 定义:每个设备树节点的唯一标识,通常由两部分组成:类型和地址(或其他标识符),格式为 @

示例:uart@ff000000 表示一个位于地址 0xff000000 的 UART 设备。

  • 作用:唯一标识同一父节点下的子节点。

内核通过节点名称匹配驱动(结合 compatible 属性)。

  • 规则:同一父节点下的子节点名称必须唯一。

地址部分(@ 后内容)可省略,但需保证名称唯一(如 i2c 控制器可能无需地址)。

2. 标签(Label)

  • 定义:在节点定义前附加的符号,用于在设备树中方便地引用该节点,语法为 :

示例:uart0: serial@ff000000,标签 uart0 可被其他部分通过 &uart0 引用。

  • 作用:简化节点引用,避免冗长的路径(如 /soc/serial@ff000000)。

    提高设备树源文件(.dts)的可读性和维护性。

  • 规则:标签在整个设备树中必须唯一。

编译后(生成 .dtb 文件),标签会被替换为节点的全路径或 phandle,不会保留。

3. 别名(Aliases)

  • 定义:在 aliases 节点中定义的全局简短名称,语法为 = &。

示例:aliases { serial0 = &uart0; },通过 serial0 别名引用标签 uart0 对应的节点。

  • 作用:提供稳定的设备标识符(如系统可能依赖 serial0 作为默认控制台)。

    运行时可通过别名快速查找设备(如内核使用 of_alias_get() 获取节点)。

  • 规则:别名在 aliases 节点中定义,每个别名全局唯一。

    别名通常与标签结合使用,指向具体节点。

对比与关系

特性 节点名称 标签 别名
唯一性 同一父节点下唯一 全局唯一 全局唯一
语法 <type>@<address> <label>:node{...} aliases { name = &label; }
编译后保留 否(替换为路径或 phandle) 是(保留在 .dtb 中)
主要用途 节点标识与驱动匹配 设备树内部的便捷引用 运行时通过名称访问设备

总结

  • 节点名称是硬件的唯一标识符。

  • 标签简化设备树内部的引用,提高可读性。

  • 别名提供全局的友好名称,用于运行时访问设备。

设备树的 绑定(Bindings)

设备树的 绑定(Bindings) 是描述设备树节点如何与硬件或驱动匹配的规范,通常以 YAML 文件 的形式定义。这些文件标准化了设备树节点的属性、约束和兼容性要求,帮助开发者正确描述硬件,并确保内核驱动能够正确匹配设备。以下是设备树绑定的核心概念和 YAML 文件的详细说明:

1. 绑定文件的作用

  • 定义节点规范: 规定某个设备树节点(如传感器、外设控制器)需要哪些属性、子节点,以及它们的格式。

  • 驱动匹配:通过 compatible 属性将设备树节点与内核驱动关联。

  • 验证设备树:使用工具(如 dt-validate 和 dt-schema)检查设备树是否符合绑定的约束。

2. YAML 绑定文件的结构

一个典型的绑定文件包含以下部分:

  1. 兼容性标识(compatible

    定义设备节点的兼容性字符串,用于匹配驱动。

示例:


compatible:
- const: "vendor,device-id" # 必须的兼容性字符串
- enum: # 可选的其他兼容性字符串
- "vendor,device-v2"
- "vendor,device-legacy"
  1. 属性(properties

    规定节点必须或可选的属性及其约束(类型、范围、描述等)。
properties:
reg:
description: "寄存器地址和长度"
type: array
items:
- description: "基地址"
type: int
- description: "长度"
type: int
clock-frequency:
description: "时钟频率(Hz)"
type: int
default: 1000000 # 默认值(可选)
  1. 子节点(child nodes)

    定义子节点的要求和结构。

patternProperties:
"^gpio-[a-z0-9]+$": # 正则匹配子节点名称(如 gpio-led)
type: object
properties:
label:
type: string
pin:
type: int
  1. 必需字段(required

    标记必须存在的属性或子节点。

required:
- reg
- interrupts
  1. 示例(examples

    提供合法的设备树节点示例。

示例:


examples:
- |
mydevice@0 {
compatible = "vendor,device-id";
reg = <0x1000 0x100>;
interrupts = <1 IRQ_TYPE_EDGE_RISING>;
};
  1. 完整的 YAML 绑定示例

# 绑定文件:vendor,device-id.yaml
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Vendor Device Binding description: >
Documentation for Vendor's XYZ Device. compatible:
- const: "vendor,device-id" properties:
reg:
description: "寄存器地址和长度"
type: array
items:
- description: "基地址"
type: int
- description: "长度"
type: int
minItems: 1
maxItems: 2 clock-frequency:
description: "设备时钟频率(Hz)"
type: int
default: 1000000 interrupt-names:
type: string
enum: [ "tx", "rx", "error" ] required:
- reg
- interrupts examples:
- |
// 合法节点示例
device@1000 {
compatible = "vendor,device-id";
reg = <0x1000 0x100>;
interrupts = <1 IRQ_TYPE_EDGE_RISING>;
clock-frequency = <2000000>;
};

第二课 - 输入(按键)控制输出(LED)-设备树的更多相关文章

  1. 基于tiny4412的Linux内核移植 -- 设备树的展开

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  2. 基于tiny4412的Linux内核移植 -- 设备树的展开【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/5248114.html#_lab2_3_1 阅读目录(Content) 作者信息 平台简介 摘要 正文 一.根 ...

  3. 用LED灯和按键来模拟工业自动化设备的运动控制

    开场白: 前面三节讲了独立按键控制跑马灯的各种状态,这一节我们要做一个机械手控制程序,这个机械手可以左右移动,最左边有一个开关感应器,最右边也有一个开关感应器.它也可以上下移动,最下面有一个开关感应器 ...

  4. 基于Arduino的按键控制LED实验

    I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功 ...

  5. 51单片机-独立按键控制led矩阵的左移和右移

    51单片机学习 独立按键 控制led灯光矩阵的左移和右移 开发板采用的是普中的A2学习开发板,具体的代码如下: typedef unsigned int u16; void delay(u16 tim ...

  6. cc2530的第二次实验,用按键控制流水灯

    按键控制流水灯 具体想要实现按一下按键,然后单片机的三个灯会以流水灯的形式都亮一遍 实验相关寄存器 实验相关电路 宏定义 #define uint unsigned int #define uchar ...

  7. zigbee学习之路(四):按键控制(中断方式)

    一.前言 通过上次的学习,我们学习了如何用按键控制led,但是在实际应用中,这种查询方式占用了cpu的时间,如果通过中断控制就可以解决这个问题,我们今天就来学习按键控制的中断方式. 二.原理分析 传统 ...

  8. JZ2440开发笔记(5)——通过按键点亮LED

    在JZ2440中,点亮LED就是给LED的控制位设置为输出,数据位设置为低电平,而通过按键点亮LED,就需要将按键对应的控制位设置为输出. 下面是JZ2440的3个LED电路图: 下面是JZ2440的 ...

  9. 【Linux探索之旅】第二部分第二课:命令行,世界尽在掌握

    内容简介 1.第二部分第二课:命令行,世界尽在掌握 2.第二部分第三课预告:文件和目录,组织不会亏待你 命令行,世界尽在掌握 今天的标题是不是有点霸气侧漏呢? 读者:“小编,你为什么每次都要起这么非主 ...

  10. 【C语言探索之旅】 第三部分第二课:SDL开发游戏之创建窗口和画布

    内容简介 1.第三部分第二课: SDL开发游戏之创建窗口和画布 2.第三部分第三课预告: SDL开发游戏之显示图像 第三部分第二课:SDL开发游戏之创建窗口和画布 在上一课中,我们对SDL这个开源库做 ...

随机推荐

  1. ASP.NET Core IHostBuilder

    HostBuilder 很显然,HostBuildr 就是用来构建 Host 的构建器. IHostBuilder 定义 通过 Build() 方法,构建器返回构建的 IHost 对象实例. 具体怎么 ...

  2. 架构发展趋势以及 d2js 的未来

    目前架构有几个热点方向:微服务, dubbo, Faas,还有 TiDB. 现在开发模式是前后端分离基本成为行规. 应该说以大部分企业业务量级.人员规模来说,要去和淘宝等大厂去对标是非常傻的.对大部分 ...

  3. 【深度剖析】自主可控的全国产方案,基于龙芯LS2K1000LA-i!

    龙芯LS2K1000LA-i产品简介 LS2K1000LA-i是龙芯双核LoongArch LA264自主架构处理器.创龙科技基于LS2K1000LA-i设计的工业核心板(SOM-TL2K1000)板 ...

  4. 夜莺 v8 第一个版本来了,开始做有意思的功能了

    夜莺 v8 大版本已经启动开发,预计 25 年 7.8 月份发正式版,相比 v7 大概会做四五个大功能,每个功能做完了做稳定了都会提前放出来供大家体验,虽然以 beta 来命名,实际是稳定的,大家可以 ...

  5. [转]vue 项目npm install 报错 npm ERR! enoent undefined ls-remote -h -t ssh://git@github.com/sohee-lee7/Sq

    npm install出错的解决办法 很多小伙伴可能跟我一样是个小白,还不知道怎么启动vue,然后就照着README一阵乱搞,然后npm install的时候就报了以下的错误,网上的解决办法也看不懂, ...

  6. DotNetBar115破解版下载地址

    DotNetBar115破解版下载地址: 百度网盘:https://pan.baidu.com/s/187bkgB6tGyp1jUicsljfkQ 提取码:v0za

  7. 深入Python胶水语言的本质:从CPython到各类扩展机制

    在开始深入讲解Python如何作为胶水语言之前,我们需要先了解Python语言本身的实现机制.这对于理解Python如何与C语言交互至关重要. CPython:Python的默认实现 当我们谈论Pyt ...

  8. springboot-多模块构建-2

    三个标签完成springboot定时任务配置 1. 问题描述 Java项目定时任务是必备模块,月高风黑夜跑个批处理,记录或者统计一些系统信息. 2. 解决方案: 结合springboot,只需三个标签 ...

  9. Kubernetes 深入学习

    目录 一.简介 1.Kubernetes 是什么 2.Kubernetes 特性 二.集群架构与组件 1.Master 2.Node 三.核心概念 四.集群搭建 -- 平台规划 1.生产环境 K8S ...

  10. 如何在 ASP.NET Core 中实现速率限制?

    在 ASP.NET Core 中实现速率限制(Rate Limiting)中间件可以帮助你控制客户端对 API 的请求频率,防止滥用和过载.速率限制通常用于保护服务器资源,确保服务的稳定性和可用性. ...