在Linux内核启动时,内核通过of_platform_populate()函数,将dts中的devicenode创建成platformdevice。为后续和各类驱动的platformdriver匹配做准备。
of_platform_populate()函数在文件drivers/of/中实现。下面基于RockPI4A单板的内核代码介绍其调用流程和实现过程。
一、函数调用流程在Linux内核中,可以使用dump_stack()函数查看函数的调用流程。
/***of_platform_populate()-Populateplatform_devicesfromdevicetreedata打印函数调用的堆栈信息//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.为每个节点和子节点创建platformdevicerc=of_platform_bus_create(child,matches,lookup,parent,true);}}EXPORT_SYMBOL_GPL(of_platform_populate);dump_stack()堆栈信息如下:
[0.311191]CPU:0PID:1Comm:swapper/0=1;clock-cells=0;clock-output-names="clk_usbphy0_480m";status="disabled";}}display_subsystem:display-subsystem{display-subsystem对应节点名compatible="rockchip,display-subsystem";ports=vopl_out,vopb_out;clocks=cruPLL_VPLL,cruPLL_CPLL;clock-names="hdmi-tmds-pll","default-vop-pll";devfreq=dmc;status="disabled";};在系统启动后,可以在/sys/firmware/devicetree/base路径下查看dts文件节点,在/sys/devices/platform路径下查看platformdevice。
root@linaro-alip:/sys/firmware/devicetree/baseaddress-cellscompatiblemipi-dphy-rx0phandlepvtmusb2-phy@e450lsdisplay-subsystem/clock-namescompatiblelogo-memory-regionphandlerouteclocksdevfreqnameportsstatusroot@linaro-alip:/sys/firmware/devicetree//driver_:usb2-phy@e460/:io-domains/:mipi-dphy-rx0/of_node/:phy@f780/power/:pvtm/subsystem/:usb2-phy@e450/ueventroot@linaro-alip:/sys/devices/platform#lsdisplay-subsystem/driverdrmmodaliaspowerueventdriver_overridegraphicsof_nodesubsystem