ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Zephyr BSP: 27-Binding定义硬件

Zephyr BSP: 27-Binding定义硬件 摘要:本文是 Zephyr BSP 开发系列的第 27 篇,深入讲解 Devicetree Binding 的核心概念。Binding 是硬件在 Zephyr 中的"数据结构定义",它规定了compatible对应的硬件节点允许哪些属性、每个属性的类型与是否必填。文章从 Binding 与 DTS 的"类型与对象"关系讲起,逐步展开compatible的匹配机制、properties与required的语义、属性类型约束、include继承复用,以及 Binding 如何通过 DT macros 最终影响 Driver 的 C 代码生成。理解 Binding,是建立"数据驱动" BSP 开发思想、完成从硬件规格到软件驱动契约的关键一步。Binding:告诉 Zephyr “我的硬件是什么”在上一篇26 — Devicetree:把 Company SoC 描述给 Zephyr之后,我们已经能写:uart0: uart@40000000{compatible="company,uart";reg=0x40000000 0x1000;interrupts=50;status="okay";};但这里有一个关键问题:Zephyr 怎么知道 company,uart 允许哪些属性?reg 是什么?interrupts 是什么?clock-frequency 能不能写?current-speed 是不是合法?compatible = “company,uart” 到底对应什么硬件?答案就是:Devicetree BindingBinding 可以理解成:Devicetree Binding = 你的硬件在 Zephyr 中的"数据结构定义"。如果 Devicetree 是:“这块板子上有什么硬件?”那么 Binding 就是:“这种硬件应该长什么样、有哪些属性、每个属性是什么类型?”一、先把整个关系图建立起来到了 BSP 开发阶段,你应该形成这样一张脑图:Company SoC │ ▼ ┌──────────────────┐ │ Hardware IP │ │ │ │ UART / SPI / GPIO│ │ Timer / I2C... │ └────────┬─────────┘ │ │ 硬件规格 ▼ ┌──────────────────┐ │ Devicetree │ │ Binding │ │ │ │ company,uart │ │ company,spi │ │ company,timer │ └────────┬─────────┘ │ │ compatible ▼ ┌──────────────────┐ │ Board .dts │ │ │ │ uart0: uart@... │ │{│ │ compatible=│ │"company,uart";│ reg=... │ │interrupts=... │ │};│ └────────┬─────────┘ │ ▼ Devicetree Compiler │ ▼ generated devicetree │ ▼ C / C++ macros │ ▼ DEVICE_DT_DEFINE()│ ▼ struct device │ ▼ UART Driver所以:Binding ↓ 规定 DTS 节点可以描述什么 DTS ↓ 描述具体板子上的实例 Driver ↓ 真正操作硬件这三个东西不要混在一起。二、Binding 本质上是什么?一个最简单的 Binding:description: Company UART controller compatible:"company,uart"properties: reg: required:trueinterrupts: required:trueclock-frequency: type: int required:falsecurrent-speed: type: int required:false你可以把它理解成类似 C 的:struct company_uart_dt{reg;interrupts;clock_frequency;current_speed;};当然,Binding 并不是 C struct。它实际上是一个YAML schema。它告诉 Zephyr:compatible="company,uart"这种节点:必须有 reg 必须有 interrupts 可以有 clock-frequency 可以有 current-speed 为了帮你快速建立概念边界,这里把 **Binding、DTS、Driver** 三者放在一起对比:|维度|Binding|DTS|Driver||---|---|---|---||**作用**|定义某类硬件"允许有哪些属性、每个属性是什么类型、是否必填"|描述某块具体板子上"有哪些硬件实例、每个实例的具体配置值"|真正操作硬件寄存器,实现读写、初始化、中断处理等行为||**定义位置**
返回列表