


Linux-Gerätetreiber-Gerätebaum: eine effiziente Methode zum Beschreiben und Verwalten von Hardwaregeräten
Feb 10, 2024 pm 05:33 PMHaben Sie sich jemals gefragt, wie Sie Treiber für Ihre Hardwaregeräte unter Linux schreiben können? Haben Sie sich jemals gefragt, wie Sie Ihren Treiber an verschiedene Hardwareplattformen und Konfigurationen unter Linux anpassen können? Haben Sie jemals darüber nachgedacht, wie Sie Ihren Treiber in die Lage versetzen können, einige erweiterte Funktionen in Linux-Systemen zu implementieren, wie z. B. Hot-Plugging, Energieverwaltung, Gerätefreigabe usw.? Wenn Sie sich für diese Probleme interessieren, stellt Ihnen dieser Artikel eine effektive Methode zum Erreichen dieser Ziele vor: den Linux-Gerätetreiber-Gerätebaum. Devicetree ist eine Datenstruktur zur Beschreibung von Hardwaregeräten. Sie ermöglicht es Ihnen, die Informationen und Attribute von Hardwaregeräten auf einfache und einheitliche Weise an den Kernel zu übertragen und so die Geräteidentifikation und den Treiber zu realisieren. Devicetree ist auch ein Mechanismus zur Erzielung von Hardwareunabhängigkeit. Es ermöglicht Ihnen, die Konfiguration und Verwaltung von Hardwaregeräten auf flexible und portable Weise vom Treibercode zu trennen und so eine Unterstützung für mehrere Plattformen zu erreichen. Devicetree ist auch ein Framework zur Implementierung erweiterter Funktionen. Es ermöglicht die einheitliche und universelle Definition und Nutzung der Schnittstellen und Protokolle verschiedener Hardwaregeräte und ermöglicht so die Realisierung von Funktionen wie Hot-Plugging, Energieverwaltung und Gerätefreigabe. In diesem Artikel werden die Anwendung und Rolle von Devicetree in Linux-Gerätetreibern anhand der Grundkonzepte, Grammatikregeln, Schreibmethoden, Kompilierungsprozess, Lademethode usw. von Devicetree ausführlich vorgestellt und Ihnen dabei geholfen, diese nützliche und leistungsstarke Methode zu beherrschen.
Devicetree (Gerätebaum) ist ein Baummodell zur Beschreibung von Systemhardwareinformationen, das den Kernel vereinheitlichen soll. Die Gerätebauminformationen werden über den Bootloader an den Kernel übergeben. Anschließend initialisiert der Kernel den entsprechenden Treiber auf Platinenebene basierend auf diesen Gerätebeschreibungen, um den Zweck der gemeinsamen Nutzung eines Kernels auf mehreren Plattformen zu erreichen.
Übersicht
Devicetree dient hauptsächlich dazu, Hardwareinformationen auf Platinenebene von nicht steckbaren (nicht dynamischen) Geräten zu beschreiben. Es besteht aus einer hierarchischen Baumstruktur von Knoten, die Geräteinformationen beschreiben. Der in jedem Knoten enthaltene Inhalt wird durch ein Eigenschafts-/Wertpaar dargestellt. Mit Ausnahme des Wurzelknotens hat jeder Knoten einen übergeordneten Knoten. Wie im Bild gezeigt:
Knotennamen
Mit Ausnahme des Wurzelknotens, dessen Name durch „/“ dargestellt wird, werden die anderen Knoten durch node-name@unit-address
benannt und müssen auf derselben Ebene eindeutig sein.
-
Knotenname
1
2
3
4
5
6
7
8
9
表示节点名,由1-31个字符组成。如非必须,推荐使用以下通用的node-name:
cpu、memory、memory-controller、gpio、serial、watchdog、flash、compact-flash、
rtc、interrupt-controller、dma-controller、ethernet、ethernet-phy、timer、
mdio、spi、i2c、usb、can、keyboard、ide、disk、display、sound、atm、cache-
controller、crypto、fdc、isa、mouse、nvram、parallel、pc-card、pci、pcie、sata、
scsi、vme。
Nach dem Login kopieren -
Geräteadresse
1
2
3
表示这个节点所在的bus类型。它必须和节点中reg属性的第一个地址一致。如果这个节点没有
reg属性,则不需“@unit-address”。
Nach dem Login kopieren
Pfadnamen
stellt den vollständigen Pfad eines Knotens dar. Wie zum Beispiel:
1 |
|
Eigenschaften
Der in jedem Knoten enthaltene Hauptinhalt sind die Attributinformationen des beschriebenen Geräts, bestehend aus Name und Wert:
-
Eigenschaftsnamen
1
1-31个字符,可包含字母、数字、及‘,’,‘.’,‘_’,‘+’,‘?’,‘#’。
Nach dem Login kopieren -
Eigenschaftswerte
Wert | Beschreibung |
---|---|
leer | Der Attributwert ist leer und wird zur Darstellung von Wahr-Falsch-Informationen verwendet |
u32/u64 | 32/64-Bit-Big-Endian-Ganzzahl ohne Vorzeichen, beim Ausdruck muss
|
string,stringlist | nullterminierte Zeichenfolge oder Liste ihrer Komponenten |
Standard Properties
-
compatible
1
2
3
4
5
6
7
8
9
10
11
12
Value type:
Description:
表示兼容的设备类型,内核据此选择合适的驱动程序。由多个字符串组成,从左到由列出
这个设备兼容的驱动(from most specific to most general)。
推荐的格式为:“制造商名,具体型号”。
Example:
compatible =
"fsl,mpc8641-uart"
,
"ns16550"
;
内核先搜索支持“fsl,mpc8641-uart”的驱动,如未找到,则搜索支持更通用的“ns16550”
设备类型的驱动。
Nach dem Login kopieren -
model
1
2
3
4
5
6
Value type:
Description:
表明设备型号。
推荐的格式为:“制造商名,具体型号”。
Example:
model =
"fsl,MPC8349EMITX"
;
Nach dem Login kopieren -
phandle
1
2
3
4
5
6
7
8
9
10
11
Value type:
Description:
用一个树内唯一的数字标识所在的这个节点,其他节点可以直接通过这个数字标识来引用
这个节点。
Example:
pic@10000000 {
phandle = ;
interrupt-controller;
};
interrupt-parent = ;
Nach dem Login kopieren -
status
1
2
3
4
5
6
7
Value type:
Description:
表示设备的可用状态:
"okay"
-> 设备可用
"disabled"
-> 目前不可用,但以后可能会可用
"fail"
-> 不可用。出现严重问题,得修一下
"fail-sss"
-> 不可用。出现严重问题,得修一下。sss指明错误类型。
Nach dem Login kopieren -
#address-cells and #size-cells
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Value type:
Description:
在拥有子节点的节点中使用,来描述它的字节点的地址分配问题。即分别表示子节点中使
用多少个u32大小的cell来编码reg属性中的address域和size域。
这两个属性不会继承,必须明确指出。如未指出,默认#address-cells=2,#size-
cells=1。
Example:
soc {
#address-cells = ;
#size-cells = ;
serial {
reg = ;
};
};
Nach dem Login kopieren -
reg
1
2
3
4
5
6
Value type: encoded
as
an arbitraty number of (address, length) pairs.
Description:
描述该设备在parent bus定义的地址空间中的地址资源分配。
Example:
reg = ;
a 32-byte block at offset 0x3000
and
a 256-byte block at offset 0xFE00。
Nach dem Login kopieren -
virtual-reg
1
2
3
4
5
Value type:
Description:
表示映射到reg第一个物理地址对应的effective address。使bootloader能够提供给内
核它所建立的virtual-to-physical mappings。
Nach dem Login kopieren -
ranges
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Value type:
or
encoded
as
an arbitrary number of (child-bus-address,parent-bus-
address, length) triplets.
Description:
提供了子地址空间与父地址空间的映射关系,如果值为空则父子地址相等,无需转换。
Example:
soc {
compatible =
"simple-bus"
;
#address-cells = ;
#size-cells = ;
ranges = ;
serial {
compatible =
"ns16550"
;
reg = ;
};
};
将子节点serial的0x0地址映射到父节点soc的0xe0000000,映射长度为0x100000。此时
reg的实际物理地址就为0xe0004600。
Nach dem Login kopieren -
dma-ranges
1
2
3
Value type:
or
encoded
as
an arbitrary number of (child-bus-address,parent-bus-address, length) triplets.
Description:
提供了dma地址的映射方法。
Nach dem Login kopieren
Interrupts
描述中断的属性有4个:
-
interrupt-controller
1
一个空的属性用来指示这个节点设备是接收中断信号的控制器。
Nach dem Login kopieren -
#interrupt-cells
1
2
3
这是上面所说中断控制器中的一个属性,用来描述需要用多少个cell来描述这个中断控制器的
interrupt specifier(类似#address-cells和#size-cells)。
Nach dem Login kopieren -
interrupt-parent
1
2
3
常出现在根节点的一个属性,它的属性值是指向interrupt-controller的一个phandle。可从
parent继承。
Nach dem Login kopieren -
interrupts
1
包含interrupt specifiers列表,每一个specifier表示一个中断输出信号。
Nach dem Login kopieren
Example
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Base Device Node Types
所有的设备树都必须有一个root节点,且root节点下必须包含一个cpus节点和至少一个memory节点。
-
root node
1
root节点须包含 #address-cells、#size-cells、model、compatible等属性。
Nach dem Login kopieren -
/cpus node
1
是cpu子节点的父节点容器。须包含 #address-cells、#size-cells属性。
Nach dem Login kopieren -
/cpus/cpu* node
1
是描述系统cpu的节点。
Nach dem Login kopieren -
/memory node
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
描述系统物理内存的layout。须包含reg节点。
Example:
假如一个64位系统有如下两块物理内存:
- RAM: starting address 0x0, length 0x80000000 (2GB)
- RAM: starting address 0x100000000, length 0x100000000 (4GB)
则我们可以有下面两种描述方法(#address-cells =
and
#size-cells =):
Example #1
memory@0 {
reg = ;
};
Example #2
memory@0 {
reg = ;
};
memory@100000000 {
reg = ;
};
Nach dem Login kopieren -
/chosen node
1
2
3
4
根节点下的一个子节点,不是描述设备而是描述运行时参数。常用来给内核传递bootargs:
chosen {
bootargs =
"root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200"
;
};
Nach dem Login kopieren -
/aliases node
1
2
3
4
由1-31个字母、数字或下划线组成的设备节点full path的别名。它的值是节点的全路径,因此最终会被编码成字符串。
aliases {
serial0 =
"/simple-bus@fe000000/serial@llc500"
;
}
Nach dem Login kopieren
Device Bindings
更多具体设备具体类别的描述信息:内核源代码/Documentation/devicetree/bindings。
DTS是描述devicetree的源文本文件,它通过内核中的DTC(Devicetree Compiler)编译后生成相应平台可烧写的二进制DTB。
Devicetree Blob (DTB) Structure
DTB又称Flattened Devicetree(FDT),在内存中的结构如下图所示:
Header
大端字节序结构体:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Memory Reservation Block
-
Purpose
1
为系统保留一些特殊用途的memory。这些保留内存不会进入内存管理系统。
Nach dem Login kopieren -
Format
1
2
3
4
struct fdt_reserve_entry {
uint64_t address;
uint64_t size;
};
Nach dem Login kopieren
Structure Block
Devicetree结构体存放的位置。由一行行“token+内容”片段线性组成。
-
token
每一行内容都由一个32位的整形token起始。token指明了其后内容的属性及格式。共有以下5种token:
token | Description |
---|---|
FDT_BEGIN_NODE (0x00000001) | 节点起始,其后内容为节点名 |
FDT_END_NODE (0x00000002) | 节点结束 |
FDT_PROP (0x00000003) | 描述属性 |
FDT_NOP (0x00000004) | nothing,devicetree解析器忽略它 |
FDT_END (0x00000009) | block结束 |
-
tree structure
- (optionally) any number of FDT_NOP tokens
-
FDT_BEGIN_NODE
- The node’s name as a null-terminated string
- [zeroed padding bytes to align to a 4-byte boundary]
-
For each property of the node:
- (optionally) any number of FDT_NOP tokens
-
FDT_PROP token
- property information
- [zeroed padding bytes to align to a 4-byte boundary]
- Representations of all child nodes in this format
- (optionally) any number of FDT_NOP tokens
- FDT_END_NODE token
Devicetree Source (DTS) Format
Node and property definitions
1 2 3 4 |
|
File layout
Version 1 DTS files have the overall layout:
1 2 3 4 5 6 |
|
通过本文,我们了解了devicetree在Linux设备驱动中的应用和作用,学习了如何编写、编译、加载、修改和调试devicetree。我们发现,devicetree是一种非常适合嵌入式系统开发的方法,它可以让我们方便地描述和管理硬件设备,实现硬件无关性和高级功能。当然,devicetree也有一些注意事项和限制,比如需要遵循语法规范、需要注意兼容性问题、需要注意内存占用和性能影响等。因此,在使用devicetree时,我们需要有一定的硬件知识和经验,以及良好的编程习惯和调试技巧。希望本文能够为你提供一个入门级的指导,让你对devicetree有一个初步的认识和理解。如果你想深入学习devicetree,建议你参考更多的资料和示例,以及自己动手实践和探索。
Das obige ist der detaillierte Inhalt vonLinux-Gerätetreiber-Gerätebaum: eine effiziente Methode zum Beschreiben und Verwalten von Hardwaregeräten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Android TV Box erhält inoffizielles Ubuntu 24.04-Upgrade

Deepseek Web Version Eingang Deepseek Offizielle Website Eingang

BitPie Bitpie-Wallet-App-Download-Adresse

Bitget Offizielle Website -Installation (2025 Anfängerhandbuch)

Installation der Quellcode-Kompilierung von Zabbix 3.4

Ausführliche Erklärung: Parameterbefehl zur Beurteilung der Variablen des Shell-Skripts

Ouyi OKX Installationspaket ist direkt enthalten
