Linux内核如何从设备树中获取数据?

6

我是一个Linux内核的初学者。
据我所知,在早期版本的内核中,有一个特定于板子的文件,所有设备都是通过使用一些API(如platform_get_register等)进行注册的。
而在较新版本的内核中,设备所需的信息是通过设备树传递的。
我的问题是内核如何从设备树中获取驱动程序的信息?设备如何通过设备树在内核中注册?


https://dev59.com/hYXca4cB1Zd3GeqPGEhz#27032068 - raghav3276
1个回答

7
如果您指的是OpenFirmware设备树,那么它们会被打包成一种特殊格式(dtb镜像),并由引导加载程序与内核镜像一起放入RAM中。然后,引导加载程序将调用内核入口点,并将RAM中dtb镜像的地址作为其中一个参数传递。
位于/drivers/of子目录中的内核子系统将遍历树,并对每个受支持的设备条目尝试通过device_add()和相关函数创建所需的设备(这是Linux中创建设备的常规过程)。如果驱动程序子系统可以找到合适的驱动程序,该驱动程序的*_probe()回调将能够从传递给它的(可能是子类化的)device对象中获取OF设备条目中找到的参数。

谢谢您的回复。我还有一些疑问:1)如果我们通过设备树传递一个寄存器,那么在驱动程序/内核中如何访问这个寄存器?2)是否还有其他类似于device_add()的API可以使用? - Vineesh Vijayan
  1. 您可以使用of_find_property() / of_get_child_by_name() / of_find_node_by_path() /等函数从OF树中挖掘任意数据。它只是一个树形结构的字符串集合,没有什么神奇的地方。
  2. 在运行Linux实例中,所有设备最终都是由device_add()和相关函数创建的。您可能需要哪些其他API呢?
- oakad

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