在每个dts的设备节点下device_node,如果有交叉引用其他设备节点的,即反编译出来的dts文件中有引用对应的phandle的,可用如下方法解析。
timer4_pins:timer4_pin_default{
AM33XX_IOPAD(0x804, PIN_INPUT_PULLUP | MUX_MODE1)
};
&timer4{
pinctrl-0 = <&timer4-pins>;
};
编译后就会在timer4节点下,生成phandle = <0xXX>;
xx:表示对timer4_pins:timer4_pin_default节点的引用。
可在timer设备驱动下,使用
of_find_property 传入timer4设备节点(of_node),属性名称:pinctrl-0,返回的参数长度地址
返回的property->value则是phandle的值,但是需要be32_to_cpup转换字节序,避免出错。
还可通过size计算phandle包含几个引用。
of_find_node_by_phandle
将phandle值传入,查找对应的引用设备节点device_node
再通过如下函数可以反向查找到对应的设备device。
of_find_device_by_node(struct device_node * np)
找到device后,一般device->driver_data指向配置设备probe时关联的驱动相关的数据和方法。(设备地址,操作函数,中断等)
dts解析后,在内核中的存放方式,参看如下资料: