扁平设备树的作用是什么 - Linux 内核

8
我正在了解Uboot和内核启动过程。FDT(平面设备树)的用途是什么?许多链接中都提到,Uboot将板子和SOC配置信息以FDT形式传递给内核。

https://wiki.freebsd.org/FlattenedDeviceTree

为什么内核需要板级配置信息?
我问这个问题是因为每当我们在Linux中制作设备驱动程序时,我们都会在probe()或module_init()调用中初始化设备,并使用request_mem_region()和ioremap()函数来获取地址范围,然后设置驱动程序的时钟和其他寄存器。 request_mem_region()实际上是做什么的,何时需要? 现在,如果我的芯片上和芯片外设备的设备驱动程序正在进行完整的板级初始化。 那么内核中的“扁平设备树”有什么用处?

3
一些设备驱动程序配置的概念现在已经过时,使用设备树(Device Tree)可以解决这个问题。以下是一段介绍如何使用设备树的视频,同时Thomas Petazzoni在Free Electrons上也有一些幻灯片。 - sawdust
“所以你的意思是说…” - 我没有写下或暗示任何接近于你所猜测的内容。那个视频和幻灯片已经清楚地描述了旧的“板文件”和“平台数据”与“设备树”的方法。因此,不要猜测和荒谬地曲解我所写的简单句子,点击那些链接吧。 - sawdust
对于ARM架构,设备树首次出现在Linux 3.1中。你的第二个问题两边的条件并不是相互排斥的。 - sawdust
互斥是什么意思? - Katoch
@Katoch 目前,在 Linux 内核中支持的众多 SoC 中,采用设备树方法的很少。普遍共识是,在大多数情况下,设备树是有益的,并且正在逐步被采用。 - TheCodeArtist
显示剩余3条评论
1个回答

9
您的想法是正确的,初始化芯片内部块和外部设备所需的是“板”文件和“设备树”。
1. 在引导过程中,需要“探测”SoC的所有芯片内部块和接口到它的外部设备的相应驱动程序。在USB和PCI等总线上,可以物理检测并列举外围设备,并探测其相应的驱动程序。然而,通常情况下,在其他总线(如I2C、SPI等)上的其他外围设备中没有这样的功能。
2. 除了上述内容之外,在探测设备驱动程序时,还需要向其提供有关我们打算如何配置和利用硬件的一些信息。这取决于使用情况。例如,我们希望以哪个波特率操作UART端口。
上述两类信息:
- 硬件的物理拓扑结构。 - 硬件的配置选项。
通常定义为“板”文件中的“structs”。
然而,使用板文件方法需要重新构建内核,即使只是在初始化期间将可配置选项修改为不同的值。此外,当存在几个物理板具有略微不同的拓扑/配置时,“板”文件方法变得过于繁琐,难以维护。
因此,有兴趣将此信息单独维护在设备树中。任何设备驱动程序都可以解析设备树的相关分支和叶子以获取所需的信息。

在开发自己的设备驱动程序时,如果您的平台支持设备树,则建议您利用设备树存储设备驱动程序所需的“平台数据”。这应该有助于您清楚地分离:

  • 位于driver.c文件中的设备的通用驱动程序代码和

  • 此平台特定的设备配置选项位于设备树中。

逐步介绍将Linux内核移植到板子/SoC的方法可以帮助您了解涉及的微妙差别以及使用设备树的优势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接