2 设备节点兼容性

上传人:大米 文档编号:563615390 上传时间:2022-08-21 格式:DOCX 页数:4 大小:16.90KB
返回 下载 相关 举报
2 设备节点兼容性_第1页
第1页 / 共4页
2 设备节点兼容性_第2页
第2页 / 共4页
2 设备节点兼容性_第3页
第3页 / 共4页
2 设备节点兼容性_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《2 设备节点兼容性》由会员分享,可在线阅读,更多相关《2 设备节点兼容性(4页珍藏版)》请在金锄头文库上搜索。

1、2.设备节点兼容性在.dts文件的每个设备节点中,都有一个兼容属性,兼容属性用于驱动和设备的绑定。 兼容属性是一个字符串的列表,列表中的第一个字符串表征了节点代表的确切设备,形式为 , ,其后的字符串表征可兼容的其他设备。可以说前面的是特指, 后面的则涵盖更广的范围。如在vexpress-v2m.dtsi中的Flash节点如下:flash0,00000000 compatible = arm,vexpress-flash, cfi-flash;reg = ,; b1ank-width = ;兼容属性的第2个字符串cfi-flash明显比第1个字符串arm, vexpress-flash涵盖的范

2、 围更广。再如,Freescale MPC8349SoC含一个串口设备,它实现了国家半导体(National Sem-iconductor)的 NS16550寄存器接口。则 MPC8349 串 口设备的兼容属性为compatible=fsl, mpc8349-uart, ns16550。其中,fsl, mpc8349-uart 指代了确切的设备,ns16550 代表该设 备与NS16550UART保持了寄存器兼容。因此,设备节点的兼容性和根节点的兼容性是类似 的,都是“从具体到抽象”使用设备树后,驱动需要与.dts中描述的设备节点进行匹配,从而使驱动的probe() 函数执行。对于platfo

3、rm_driver而言,需要添加一个OF匹配表,如前文的.dts文件的acme, a1234-i2c-bus兼容I2C控制器节点的OF匹配表,具体代码如下所示。1 static const struct of_device_id a1234_i2c_of_match = 2 .compatible = acme,a1234-i2c-bus, ,3 ,4 ;5 MODULE_DEVICE_TABLE(of, a1234_i2c_of_match);66 static struct pla tf orm_driver i2c_a1234_driver = 7 .driver = 8 .name =

4、 a1234-i2c-bus,9 .owner = THIS_MODULE,10 .of_match_table = a1234_i2c_of_match,11 ,12 .probe = i2c_a1234_probe,13 .remove = i2c_a1234_remove,14 ;15 module_platform_driver(i2c_a1234_driver);对于I2C和SPI从设备而言,同样也可以通过of_match_ta-ble添加匹配的.dts中的相关 节点 的兼容属性,如 sound/soc/codecs/wm8753.c中 的针对 WolfsonWM8753的 of_m

5、atch_ta-ble,具体代码如下所示。1 static const struct of_device_id wm8753_of_match = 2 .compatible = wlf,wm8753, ,3 4;5MODULE_DEVICE_TABLE(of, wm8753_of_match);6static struct spi_driver wm8753_spi_driver = 7.driver = 8.name = wm8753,9.owner = THIS_MODULE,10.of_match_table = wm8753_of_match,11,12.probe= wm8753_

6、spi_probe,13.remove= wm8753_spi_remove,14;15static struct i2c_driver wm8753_i2c_driver = 16.driver = 17.name = wm8753,18.owner = THIS_MODULE,19.of_match_table = wm8753_of_match,20,21.probe =wm8753_i2c_probe,22.remove = wm8753_i2c_remove,23.id_table = wm8753_i 2c_id,24;上述代码中的第2行显示 WM8753的供应商是“ wlf”,它

7、其实是对应于 WolfsonMicroe-lectronics 的前缀。详细的前缀可见于内核文档:Documentation/devicetree/bindings/vendor-pre-fixes.txt对于I2C、SPI还有一点需要提醒的是,I2C和SPI外设驱动和设备树中设备节点的兼容 属性还有一种弱式匹配方法,就是“别名”匹配。兼容属性的组织形式为manufacturer, ,别名其实就是去掉兼容属性中manufacturer前缀后的id_table)12 return !spi_match_id(sdrv-id_table, spi);1617return strcmp(spi-mo

8、dalias, drv-name) = 0;18 19 static const struct spi_device_id *spi_match_id(const struct spi_device_id *id,20const struct spi_device *sdev)21 22while (id-name0) 23if (!strcmp(sdev-modalias, id-name)24return id;25id+;2627return NULL;28 通过这个别名匹配,实际上,SPI和I2C的外设驱动即使没有of_match_table,还是可以 和设备树中的节点匹配上的。一个驱

9、动可以在of_match_table中兼容多个设备,在Linux内核中常常使用如下API来 判断具体的设备是什么:int of_device_is_compatible(const struct device_node *device,const char *compat);此函数用于判断设备节点的兼容属性是否包含compat指定的字符串。这个API多用于 一个驱动支持两个以上设备的时候。当一个驱动支持两个或多个设备的时候,这些不同.dts 文件中设备的兼容属性都会写入驱动OF匹配表。因此驱动可以通过Bootloader传递给内核 设备树中的真正节点的兼容属性以确定究竟是哪一种设备,从而根据不

10、同的设备类型进行不 同的处理。如 arch/powerpc/platforms/?3xx/usb.c 中的 mpc831x_usb_cfg ()就进行了类似处 理:if(immr_node&(of_device_is_compatible(immr_node, fsl,mpc8315-immr)|of_device_is_compatible(immr_node, fsl,mpc8308-immr)clrsetbits_be32(immap+MPC83XX_SCCR_OFFS,MPC8315_SCCR_USB_MASK,MPC8315_SCCR_USB_DRCM_01);elseclrsetb

11、its_be32(immap+MPC83XX_SCCR_OFFS,MPC8315_SCCR_USB_MASK,MPC8315_SCCR_USB_DRCM_11);它根据具体的设备是fsl, mpc8315-immr和fsl, mpc8308-immr、中的哪一种来进行不 同的处理。当一个驱动可以兼容多种设备时,除了 of_devcice_is_compatinle()这种判断方法之外, 还可以采用在驱动的of_device_id表中填充.data成员的形式。譬如, arch/arm/mm/cache-l2x0.c支持“arm, l210-cache “arm, pl310-cache “arm

12、, l220-cache 等多种设备,其of_device_id表如代码清单18.9所示。1 #define L2C_ID(name, fns) .compatible = name, .data = (void *)&fns 2 static const struct of_device_id l2x0_ids _initconst = 3 L2C_ID(arm,l210-cache, of_l2c210_data),4 L2C_ID(arm,l220-cache, of_l2c220_data),5 L2C_ID(arm,pl310-cache, of_l2c310_data),6 L2C

13、_ID(brcm,bcm11351-a2-pl310-cache, of_bcm _l 2x0_data),7 L2C_ID(marvell,aurora-outer-cache, of_aurora_with_outer_data),8 L2C _I D(marvell,aurora-system-cache, of_aurora_no_outer_data),9 L2C_ID(marvell,tauros3-cache, of_tauros3_data),10 /* Deprecated IDs */11 L2C_ID(bcm,bcm11351-a2-pl310-cache,of_bcm_l2x0_data),12 13 ;在驱动中,通过如代码清单18.10的方法拿到了对应于L2缓存类型的.data成员,其中 主要用到了 of_match_node ()这个 API。1 int

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号