我正在经历 Uboot 和内核启动过程。 FDT(扁平设备树)到底有什么用?
我读过的许多链接都指出uboot以FDT的形式将主板和SOC配置信息传递给内核
https://wiki.freebsd.org/FlattenedDeviceTree
为什么内核需要主板配置信息?
我问这个问题是因为当我们在Linux中制作设备驱动程序时,我们使用
probe()
或module_init()
调用并使用request_mem_region()
和ioremap()
函数来初始化设备来获取地址范围
然后设置驱动程序的时钟和其他寄存器。现在,如果我的片上和片外设备的设备驱动程序正在执行完整的板初始化。
那么
flattened device tree
对于内核有什么用呢?
您正确地假设,初始化片上模块和片外外设需要board文件和设备树。
启动时,需要“探测”SoC 的所有片上模块和与其连接的片外外设的相应驱动程序,即加载和调用。在 USB 和 PCI 等总线上,可以物理检测和枚举外设,并探测其相应的驱动程序。然而,一般来说,对于其余总线上的其余外设(如 I2C、SPI 等),这样的设施不可用。
除了上述之外,当探测设备驱动程序时,还需要向其提供一些有关我们打算配置和使用硬件的方式的信息。这取决于用例。例如,我们想要操作 UART 端口的波特率。
上述两类信息,即
通常在“
board”文件中定义为
structs
。
然而,使用板文件方法需要重新构建内核,甚至在初始化期间简单地将可配置选项修改为不同的值。此外,当存在多个拓扑/配置略有不同的物理板时,“板”文件方法变得太麻烦而难以维护。
因此有兴趣在设备树中单独维护这些信息。任何设备驱动程序都可以解析设备树的相关分支和叶子以获得所需的信息。
在开发自己的设备驱动程序时,如果您的平台支持设备树,那么鼓励您使用设备树来存储设备驱动程序所需的“平台数据”。这应该可以帮助你清楚地分开:
您设备的通用驱动程序代码位于 <driver.c> 文件和
特定于该平台的设备配置选项进入设备树。