据我所知,当设备树中的“兼容”字段与内核模块中的“兼容”字段匹配时,平台设备驱动程序可以自动加载。这是来自Raspberry Pi发行版的pwm-overlay.dts
文件:
/ {
fragment@0 {
target = <&gpio>;
__overlay__ {
pwm_pins: pwm_pins {
brcm,pins = <18>;
brcm,function = <2>; /* Alt5 */
};
};
};
fragment@1 {
target = <&pwm>;
__overlay__ {
pinctrl-names = "default";
pinctrl-0 = <&pwm_pins>;
status = "okay";
};
};
fragment@2 {
target = <&clk_pwm>;
frag2: __overlay__ {
clock-frequency = <100000000>;
};
};
__overrides__ {
pin = <&pwm_pins>,"brcm,pins:0";
func = <&pwm_pins>,"brcm,function:0";
clock = <&frag2>,"clock-frequency:0";
};
};
首先,我没有看到任何“兼容”字段,但在pwm-bcm2835.c
文件中有这样的字符串:
static const struct of_device_id bcm2835_pwm_of_match[] = {
{ .compatible = "brcm,bcm2835-pwm", },
{ /* sentinel */ }
};
此外,当我加载叠加层时,驱动程序也成功自动加载。这个怎么运作?它如何知道要加载哪个驱动程序?
答案 0 :(得分:2)
关于如何匹配“兼容”字段以将驱动程序绑定到设备,你是对的,你只是找不到合适的位置。
您正在查看的文件是设备树覆盖图。它被添加到现有设备树中,添加,删除或更改某些节点和属性。最终的设备树是将原始图像与一些叠加层相结合的结果。可以在任何原始和/或叠加的源文件中(重新)定义给定属性。设计者如何构造设备树源代码是一个任意的决定。
但请考虑一下为什么存在叠加层。该覆盖层用于配置PWM,因为PWM的配置对于每个电路板都不相同(您可能根本不使用它)。对可以更改的内容使用叠加层可以让我们进行更改而无需从新设备树构建和引导。 SoC中PWM硬件的存在是不变的。即使没有使用,它也永远不会存在。关于它的某些事情,如设备寄存器的基地址,也不会改变。因此,将它放在叠加层中是没有意义的,因为它不会改变,并且可能在基础设备树源中。
在叠加层中,CUnsignedLong
正在修改标记为“pwm”的现有目标节点。如果我们查找此节点,我们会在fragment@1
:
bcm283x.dtsi
并且你有兼容的属性值“brcm,bcm2835-pwm”。由于它不需要更改,因此它就像我们期望的那样位于基本设备树的源中。