Linux内核Device Tree-创建platform device
在Linux
内核启动时,内核通过of_platform_populate()
函数,将dts
中的device node
创建成platform device
。为后续和各类驱动的platform driver
匹配做准备。
of_platform_populate()
函数在文件drivers/of/platform.c
中实现。下面基于RockPI 4A单板的内核代码介绍其调用流程和实现过程。
一、函数调用流程
在Linux
内核中,可以使用dump_stack()
函数查看函数的调用流程。
/** * of_platform_populate() - Populate platform_devices from device tree data ... #省略部分注释 */ int of_platform_populate(struct device_node *root, const struct of_device_id *matches, const struct of_dev_auxdata *lookup, struct device *parent) { struct device_node *child; int rc = 0; dump_stack(); ### 打印函数调用的堆栈信息 //1.如果root为NULL,则通过of_find_node_by_path()查找 root = root ? of_node_get(root) : of_find_node_by_path("/"); if (!root) return -EINVAL; //2.遍历dts中的节点 for_each_child_of_node(root, child) { //3.为每个节点和子节点创建platform device rc = of_platform_bus_create(child, matches, lookup, parent, true); ... } ... } EXPORT_SYMBOL_GPL(of_platform_populate);
dump_stack()
堆栈信息如下:
[ 0.311191] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.154-00036-gcef30e88a9f5-dirty #36 [ 0.311198] Hardware name: ROCK PI 4A 2 (DT) [ 0.311206] Call trace: [ 0.311220] [<ffffff80080888d8>] dump_backtrace+0x0/0x220 [ 0.311232] [<ffffff8008088b1c>] show_stack+0x24/0x30 [