compatible 属性也叫做 “兼容性” 属性,这是非常重要的一个属性!compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序。compatible 属性值的推荐格式:
"manufacturer,model"
① manufacturer : 表示厂商;
② model : 一般是模块对应的驱动名字。
例如:
compatible = "fsl,mpc8641", "ns16550";
上面的compatible有两个属性,分别是 "fsl,mpc8641" 和 "ns16550";其中 "fsl,mpc8641" 的厂商是 fsl;设备首先会使用第一个属性值在 Linux 内核里面查找,看看能不能找到与之匹配的驱动文件;
如果没找到,就使用第二个属性值查找,以此类推,直到查到到对应的驱动程序 或者 查找完整个 Linux 内核也没有对应的驱动程序为止。
在驱动代码里,compatible的写法与设备树dts里写法有区别,举例如下:
test_nodelabel: TEST_NODELABEL_ALLCAPS: test_gpio_1: gpio@deadbeef {
compatible = "vnd,gpio";
gpio-controller;
reg = < 0xdeadbeef 0x1000 >;
#gpio-cells = < 0x2 >;
#foo-cells = < 0x1 >;
label = "TEST_GPIO_1";
interrupts = <4 3>;
status = "okay";
};
test_phandles: phandle-holder-0 {
compatible = "vnd,phandle-holder";
gpios = <&test_gpio_1 10 20>, <&test_gpio_2 30 40>;
};
对于上面的dts文件,如果不存在其他的compatible名字为 “vnd,phandle-holder”,那么可以通过下面代码获取到test_gpio_1的label属性值。
#define DT_DRV_COMPAT vnd_phandle_holder
DT_INST_GPIO_LABEL_BY_IDX(0, gpios, 0) //"TEST_GPIO_1"
这里定义DT_DRV_COMPAT的值为vnd_phandle_holder,注意,这里的下划线,对应在dts文件里有可能时,或者-,也就是对应于dts文件里的compatible = "vnd,phandle-holder"。
compatible属性是设备驱动与硬件匹配的关键,它是一个字符串列表,按照manufacturer,model格式指定设备的制造商和模型。当内核寻找匹配的驱动时,会按顺序检查这些字符串。在给定的dts文件示例中,展示了如何定义compatible属性以及如何在驱动代码中通过DT_DRV_COMPAT获取设备标签。如果在dts文件中vnd,phandle-holder是唯一的compatible值,DT_INST_GPIO_LABEL_BY_IDX宏可以用来获取test_gpio_1的label属性值。
294

被折叠的 条评论
为什么被折叠?



