news 2026/8/13 23:11:23

Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (14-19)设备树相关

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (14-19)设备树相关

视频:https://www.bilibili.com/video/BV18SE26cEjn?vd_source=92b7efa4daa5bb4fdcdc9f2db97c307b&p=14

lesson13后面的视频是说设备树和misc 设备,感觉设备树讲的不太好,没有基础的估计完全看不懂,而且这个系列没有说中断,DMA,SPI,UART,IIC等,也没说网络设备和块设备,值得称道的是源码例子非常浅显。

设备树:

lesson14 说了下设备树基本概念。linux 官方解释了设备树的三大目的:

Linux and the Devicetree — The Linux Kernel documentation

Linux uses DT data for three major purposes:

  1. platform identification,

  2. runtime configuration, and

  3. device population.

也就是定义识别设备/总线,读取设备树配置设备,生成设备信息。

我的理解是设备树是描述硬件状态的一个文件,它的语法类似json,需要更多了解下设备树语法。

一般官方会给出一个设备树模板,自己根据情况修改。比如之前给zynq的linux 写个system_user.dtsi,要写个mcp2518fd的设备树,xilinx 官方 内核提供了设备树模板文件microchip,mcp251xfd.yaml;

examples: - | #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/interrupt-controller/irq.h> spi { #address-cells = <1>; #size-cells = <0>; can@0 { compatible = "microchip,mcp251xfd"; reg = <0>; clocks = <&can0_osc>; pinctrl-names = "default"; pinctrl-0 = <&can0_pins>; spi-max-frequency = <20000000>; interrupts-extended = <&gpio 13 IRQ_TYPE_LEVEL_LOW>; microchip,rx-int-gpios = <&gpio 27 GPIO_ACTIVE_LOW>; vdd-supply = <&reg5v0>; xceiver-supply = <&reg5v0>; }; };

这个设备树有头文件 <dt-bindings/gpio/gpio.h>,<dt-bindings/interrupt-controller/irq.h>,所以自己写的时候要加进去;zynq 里面基本可以不考虑pin_ctrl,因为vivado里面配置zynq的时候已经给spi总线设置好了IO口各种属性了。

然后写zynq system_user.dtsi 是overlay的(lesson15解释了overlay),所以这个SPI调用的时候SPI总线节点需要给它加上&号,根据硬件原理图就是&SPI1,然后例子里面的can0_osc 这个需要自己写个对应的根节点。

所以,我就先参考官方的例子:Device Tree Tips - AMD Adaptive Computing Wiki - Confluence

给晶振clock 说明写好一个clocks对应的晶振osc:

osc: oscillator { //节点:osc,别名 oscillator
compatible = "fixed-clock"; //这个看厂家,我找的zynq的选择是 fixed-clock
#clock-cells = <0>;
clock-frequency = <40000000>; //晶振频率40MHZ
clock-output-names = "osc";
};

然后spi总线SPI1里面调用这个osc, clocks =<&osc>;

最后设备MCP2518FD的设备树自己写了如下:

&spi1{
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
canfd@0{
compatible = "microchip,mcp2518fd";
reg = <0>;
clocks =<&osc>;
spi-max-frequency = <20000000>;
interrupt-parent = <&gpio0>;
interrupts-extended = <&gpio0 62 IRQ_TYPE_LEVEL_LOW>;
microchip,rx-int = <&gpio0 61 GPIO_ACTIVE_LOW>;
};
};

同时内核进行相应的裁减操作,这样驱动读取设备树文件dtsi就知道SPI总线用的是40Mhz的时钟晶振,spi 的sclk 20MHZ,中断用的是哪个IO口。

总而言之,PCB 软件用画原理图来表明这个设备的情况,设备树是通过语言的方式描叙硬件的状态。具体设备树怎么写一般下载内核后在DOCUMENT下面查找各个内核的设备树,照说明写。

要自己写驱动,写好设备树之后让自己的驱动读取它来工作,可以看看视频lesson17,lesson18了解。

视频里面的代码那些都不放了。感觉大同小异。看视频和git,了解即可。

搜索看到Johannes还有个UP传送了另一个系列的他的linux 内核视频系列: ://www.bilibil

https://www.bilibili.com/video/BV1CNJc64Esv/?vd_source=92b7efa4daa5bb4fdcdc9f2db97c307b

内容挺丰富的

1. Simple Kernel Module
2. Device Numbers and Device Files
3. Create device file in driver and callbacks
4. GPIO Driver
5. Text LCD Driver
6. PWM Module
7. Temperature Sensor (I2C)
8. Timer in Linux Kernel Modules
9. High Resolution Timer in Linux Kernel Modules
10. Accessing SPI with a Linux Kernel Module (BMP280 sensor again)
11. Using a GPIO Interrupt in a Linux Kernel Module
12. Using Parameters in a Linux Kernel Module
13. IOCTL in a Linux Kernel Module
14. Threads in a Linux Kernel Module
15. Sending a signal from a Linux Kernel Module to an userspace application
16. The poll callback
17. Waitqueues in a Linux Kernel Module
18. Create procfs entries from a Linux Kernel Module
19. Create sysfs entries from a Linux Kernel Module
20. Parse the device tree from a Linux Kernel Module to get the deivce properties of a specific device
21. Device Tree GPIO Driver
22. Device Tree Driver for I2C Device
23. Dynamical memory management in a Linux Kernel module
24. Serial (UART) Driver
25. Industrial IO compatible driver for an ATMEGA I2C ADC
26. Device Tree SPI Driver (IIO compatible driver for Atmega SPI ADC)
27. Misc Device
28. Mutex for exclusive access to shared resource
29. Completions for synchronisation
30. Direct Memory Access (DMA) memcopy example
31. Accessing files form a Linux Driver
32. The mmap callback
33. Linked Lists
34. Registering device numbers, read and write callback in character devices Take 2
35. Private Data in struct file
36. I2C Device Driver without Device Tree
37. Sysfs Class
38. Kernel Log levels

git 上面有程序资源,B站评论区有。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/13 23:11:21

膝盖痛风急性肿痛:从剂型与药理分析外用制剂筛选思路

摘要痛风发作不只局限于脚趾跖趾关节&#xff0c;不少患者会出现膝盖受累&#xff0c;关节肿胀、发热、活动受限&#xff0c;严重影响行走与日常活动。在风湿科规范系统治疗之外&#xff0c;很多人希望借助外用制剂改善局部不适感。不少饱受膝盖痛风困扰的患者都会疑惑&#xf…

作者头像 李华
网站建设 2026/8/13 23:08:52

小红书笔记被判AI怎么办?从开头到结尾逐项诊断人味!

小红书笔记被判AI怎么办&#xff1f;从开头到结尾逐项诊断人味&#xff01; 先区分症状、原因和误操作 笔记开头泛泛共鸣&#xff0c;中间整齐列点&#xff0c;结尾统一号召。遇到这种情况&#xff0c;最容易犯的错误是立刻换词、换工具或重写全文&#xff0c;却没有先固定文件…

作者头像 李华
网站建设 2026/8/13 23:02:57

从髋关节影像到临床决策:以FAI为例的系统性诊疗思维

如果你是一名骨科医生或医学生&#xff0c;正在处理一例髋关节疼痛的年轻患者&#xff0c;面对X光片&#xff0c;除了“股骨头坏死”、“髋臼发育不良”这些教科书上的诊断&#xff0c;你是否曾感到困惑&#xff1a;为什么同样的影像表现&#xff0c;治疗建议却大相径庭&#x…

作者头像 李华
网站建设 2026/8/13 23:00:59

基于LLM的Agent协作系统:从中心化调度到去中心化协商的工程实践

1. 项目概述&#xff1a;从单兵作战到团队协作的范式转变在软件开发这个行当里待久了&#xff0c;你肯定经历过这样的场景&#xff1a;为了调试一个复杂的线上问题&#xff0c;你需要在终端里敲命令看日志&#xff0c;切到浏览器查文档&#xff0c;打开IDE改代码&#xff0c;再…

作者头像 李华
网站建设 2026/8/13 22:56:27

从Softmax与交叉熵损失原理到NumPy实现:掌握分类任务核心梯度推导

1. 项目概述&#xff1a;从公式到代码的深度穿越 如果你正在入门深度学习&#xff0c;尤其是分类任务&#xff0c;那么“Softmax 交叉熵损失”这个组合对你来说&#xff0c;就像学开车必须先学会踩油门和刹车一样基础。但很多人可能只是调用了 torch.nn.CrossEntropyLoss() …

作者头像 李华
网站建设 2026/8/13 22:54:52

C++ RAII技术:资源管理的核心原理与实践

1. RAII技术概述在C开发中&#xff0c;资源管理一直是个令人头疼的问题。记得我刚入行时&#xff0c;经常因为忘记释放资源导致内存泄漏&#xff0c;直到遇到RAII这个"救星"。RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是C特有的资源管理范…

作者头像 李华