Linux PCI驱动加载时of_node为NULL的问题排查与解决咨询
解决PCI驱动中
pci_dev->dev->of_node为NULL的问题 1. 修正设备树节点的绑定规则
PCI设备的设备树节点必须和PCI总线枚举的BDF(Bus/Device/Function)严格对应,内核才能自动关联of_node。针对imx8mm的pcie@33800000控制器,正确的节点写法如下:
pcie@33800000 { status = "okay"; pci@1,0 { reg = <0x00010000 0 0 0 0>; // BDF编码:Bus0、Device1、Function0,需和实际枚举值一致 compatible = "your-vendor,casin"; // 必须与驱动中of_device_id的compatible完全匹配 /* 此处添加你的I2C设备相关属性,如i2c总线地址、中断信息等 */ }; };
reg字段的高16位是Bus号,中间8位是Device号,最后8位是Function号,可通过lspci命令查看设备实际BDF(比如00:01.0对应上述0x00010000)。compatible字符串的大小写、标点必须和驱动定义完全一致,不能有任何差异。
2. 检查驱动代码的匹配表配置
确保pci_driver结构体正确关联of_match_table,且of_device_id的匹配规则无误:
static const struct of_device_id casin_of_match[] = { { .compatible = "your-vendor,casin", }, { /* 哨兵节点,必须存在 */ } }; MODULE_DEVICE_TABLE(of, casin_of_match); static struct pci_driver casin_pci_driver = { .name = "casin_pci", .id_table = casin_pci_ids, // 若仅依赖设备树匹配,可设为NULL .probe = casin_probe, .remove = casin_remove, .of_match_table = casin_of_match, // 关键:必须赋值该字段 }; module_pci_driver(casin_pci_driver);
3. 确认内核配置项
必须开启PCI设备树匹配的核心配置,可通过zcat /proc/config.gz | grep PCI_OF验证:
- 确保
CONFIG_PCI_OF=y,若未开启,需在Yocto的内核配置中添加该选项后重新编译内核。
4. 验证匹配过程
加载驱动时查看dmesg日志:
- 若出现
pci 0000:00:01.0: match for of_device_id,说明设备树匹配成功,pci_dev->dev->of_node会被自动赋值。 - 若出现
no match for of_device_id,需检查compatible字符串或BDF的对应关系。
完成以上步骤后,驱动即可无需手动查找节点,直接通过pci_dev->dev->of_node访问设备树信息。
内容的提问来源于stack exchange,提问作者ozimki
相关产品推荐
相关产品推荐

