当前位置: 首页 > news >正文

嵌入式Linux驱动开发 —— 从DTS到代码的桥梁与简单OF系列API(1)

前言:当设备树遇见驱动代码

前面我们聊了设备树的语法和编译原理,知道了.dts文件是如何被编译成.dtb然后被内核解析的。但说实话,这些只是"准备工作"。对于驱动开发者来说,真正的问题在于:我的驱动代码怎么去用这些设备树信息?

设备树里写着reg = <0x020C406C 0x04>,但这只是个文本描述。驱动程序在运行时需要知道这个地址,需要把它映射成虚拟地址,然后才能去读写寄存器。中间缺了一个环节 —— 需要有人在运行时去解析设备树,把那些< >里的数字提取出来,塞给C代码。

Linux内核提供了这个环节,那就是一系列以of_为前缀的API函数。你可以把它们理解为设备树和驱动代码之间的"翻译官"。

但这里有个历史遗留问题可能会困扰你:为什么叫"OF"而不是"DT"?Device Tree的缩写不是DT 吗?这个问题的答案藏在设备树的历史里,我们稍后再说。现在先记住一点:当你看到of_xxx()这样的函数时,它们就是在操作设备树。

这一章我们会系统地介绍这些 API,看看它们是如何在实际驱动中使用的。我们还会拿LED驱动的代码做例子,看看那些在设备树里写的属性,是怎么一步步变成驱动里的寄存器地址的。

快速回顾:设备树的前世今生

在深入API之前,我们先快速过一遍设备树是怎么走到今天的。这段历史能帮你理解为什么内核里操作设备树的函数都叫of_xxx(),以及设备树为什么被设计成现在这个样子。

从PowerPC到ARM:一场被逼出来的变革

设备树最早不是ARM的发明。上世纪90年代,IBM和苹果在PowerPC架构上制定了一个叫Open Firmware的固件标准,核心思想是让固件向操作系统提供一份完整的硬件描述,这样操作系统就不用为每块板子写专门的初始化代码了。设备树就是这个标准里定义的数据结构 —— 用树状层次描述所有设备,每个节点包含寄存器地址、中断号、时钟频率等属性。

到了2000年代中后期,ARM芯片爆发式增长,但ARM Linux处理硬件描述的方式极其原始:直接硬编码在C代码里。内核源码树里塞满了arch/arm/mach-xxxarch/arm/plat-xxx目录,每个对应一种板子,重复率高达90%以上。维护成本高得离谱,代码膨胀到arch/arm的代码量比其它所有架构加起来还多。

2011 年,Linus Torvalds终于爆发了:

"This whole ARM thing is a f*cking pain in the ass."

他明确拒绝继续合并这些垃圾代码。ARM社区被迫改革,引入了PowerPC上已经成熟的设备树机制,经历了一个从可选到强制的演进过程。到了2013年左右,新的ARM板级代码几乎都使用了设备树;ARM64更是从设计之初就强制要求设备树,不支持传统的板级C代码。

如今,设备树已成为Linux嵌入式领域描述硬件的通用机制,覆盖ARM、ARM64、RISC-V、PowerPC、MIPS等多个架构。

OF命名的由来

因为设备树起源于Open Firmware标准,内核里操作设备树的函数就都叫of_xxx()。后来ARM社区引入设备树时,为了复用已有的基础设施,也沿用了这个命名前缀。所以今天我们在ARM Linux 里看到的设备树API,依然叫OF API,而不是DT API。你可以把它理解为一种"历史遗产"——就像 C语言的printf而不是print

那么OF和设备树是什么关系呢?设备树是数据结构,OF API是操作这个数据结构的一套函数。就像C语言里有struct和操作struct的函数一样,设备树是“数据”,OF API是“操作数据的工具”。

在Linux内核的源码里,你会看到这样的头文件:

  • include/linux/of.h

核心OF API定义。

  • include/linux/of_address.h

地址映射相关函数。

  • include/linux/of_gpio.h

GPIO相关函数。

  • include/linux/of_irq.h

中断相关函数。

这些文件里定义的所有函数,都是我们接下来要讲的内容。

http://www.jsqmd.com/news/877257/

相关文章:

  • Windows 11绕过硬件限制的完整指南:让老电脑轻松升级的终极方案
  • 如何为 Claude Code 配置 Taotoken 的 API Key 与 Base URL 实现稳定调用
  • 大众点评爬虫实战:3步配置破解动态字体加密,5分钟获取全站店铺数据
  • 5分钟实现百度网盘Mac版SVIP功能破解与下载加速完整指南
  • WeChatIntercept终极指南:3分钟解锁macOS微信防撤回功能
  • ChatGPT写新闻稿总被退稿?揭秘92%从业者忽略的3个合规雷区与4步校验法
  • Awoo Installer:为破解Switch玩家量身定制的“无废话“游戏安装神器
  • 3步解决方案:用BG3 Mod Manager彻底解决博德之门3模组管理难题
  • 3分钟快速上手:m4s-converter轻松将B站缓存视频转换为MP4格式的完整指南
  • 国家中小学智慧教育平台电子课本下载完整指南:3分钟搞定所有教材
  • 10分钟搭建跨平台QQ机器人:go-cqhttp完整入门教程
  • ContextMenuManager:终极Windows右键菜单优化指南,免费提升办公效率300%
  • 流体仿真核心:从偏微分方程到工程实践的全链路解析
  • 一键解锁智慧教育平台:电子课本下载效率提升90%的秘诀
  • 逆向工程架构设计:PvZWidescreen如何重构经典游戏的宽屏体验
  • 免费跨设备按键映射神器QKeyMapper:5分钟上手,游戏办公两不误
  • 教育机构如何通过Taotoken为学生实验提供安全可控的AIAPI环境
  • BiliBiliCCSubtitle:解密视频平台封闭字幕系统的技术突围方案
  • SRWE完整教程:免费Windows窗口编辑器终极指南
  • 免费获取Grammarly Premium高级Cookie的终极指南:3种简单方法告别付费限制
  • 统信UOS/麒麟KYLINOS批量部署神器:用dpkg和yes命令实现deb包静默安装
  • Lua 5.x反编译实战指南:用unluac还原加密字节码的完整方法
  • LSLib游戏资源处理工具:解决MOD制作与资源管理的技术挑战
  • 免费AI音频处理终极指南:5个OpenVINO插件让Audacity变身专业工作站
  • 技术深度解析:STL到STEP转换的核心算法与工程实现
  • 如何快速找回Navicat数据库密码:5分钟掌握开源解密工具完整指南
  • 5分钟上手:QKeyMapper——Windows上最强大的免费按键映射工具完全指南
  • 湖州卫生间漏水到楼下,外墙渗漏起皮,楼顶下雨滴水,专业防水补漏公司帮您解决问题。本地权威防水补漏TOP5强烈推荐(2026全新房屋修缮维修指南) - 企业资讯
  • 深度解析AutoJs6在安卓11上的外部存储写入问题:完整技术方案与最佳实践
  • 三年级下册语文第八单元作文:这样想象真有趣