如何在Linux内核模块中解析新设备树BLOB并自动生成平台设备?
问题解答
一、替代of_fdt_unflatten_tree的设备树BLOB解析方案
首先必须明确:所有内核原生的设备树解析函数(包括struct device_node结构本身)都依赖CONFIG_OF=y配置。如果你的内核未开启该配置,不仅of_fdt_unflatten_tree无法使用,连struct device_node的定义都不存在,根本无法实现基于内核原生结构的设备树解析。
针对你的场景,可行的方案有两种:
- 开启
CONFIG_OF=y并重新编译内核
这是最稳妥且符合内核规范的方案。x86架构下开启CONFIG_OF=y不会破坏原有系统功能,只是启用了设备树相关的基础设施。开启后,你可以直接使用of_fdt_unflatten_tree解析FPGA中的BLOB,生成独立的device_node树,无需覆盖系统原有设备树。
调用示例(简化版):struct device_node *root_node; void *fdt_blob = /* 从FPGA内存读取的BLOB指针 */; /* 解析BLOB,生成device_node树 */ root_node = of_fdt_unflatten_tree(fdt_blob, NULL, NULL); if (IS_ERR(root_node)) { /* 错误处理 */ return PTR_ERR(root_node); } - 自行实现轻量FDT解析逻辑
若完全无法重新编译内核,只能基于Device Tree Specification手动解析FDT BLOB的格式,提取所需的节点、属性信息。但这种方式无法生成内核原生的struct device_node,只能自定义数据结构存储解析结果,后续也无法复用内核的platform_device生成逻辑,开发成本极高,不推荐。
二、从device_node自动生成platform_device列表
当你成功解析得到根device_node后,可以使用内核提供的of_platform_populate()函数自动遍历设备树节点,生成对应的platform_device实例。
关键注意事项:
- 需确保FPGA设备树节点中包含
compatible属性,且已有对应的platform驱动注册到内核; - 要将生成的
platform_device的父设备设置为你之前创建的PCIe设备(或其对应的struct device),确保设备层次正确,资源管理合规。
调用示例:
int ret; struct device *pcie_dev = /* 你的PCIe设备对应的struct device指针 */; /* 从根节点开始遍历,生成platform_device */ ret = of_platform_populate(root_node, NULL, NULL, pcie_dev); if (ret) { /* 错误处理,比如释放已生成的节点 */ of_node_put(root_node); return ret; }
另外,若你只想生成特定子节点对应的platform_device,可以指定of_platform_populate的第二个参数(匹配表),实现精准过滤。
内容的提问来源于stack exchange,提问作者cykoenig
相关产品推荐
相关产品推荐

