You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:28:28