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"。