我在飞思卡尔MPC8308上使用PCIe总线(作为根复合体),端点设备是一个只有一个256 MB内存区域和一个BAR寄存器的ASIC。可以通过“pciutils”包轻松访问设备配置空间寄存器。起初我尝试使用mmap()
访问内存区域,但它不起作用。所以在下一级,我为PCIe端点设备准备了一个设备驱动程序,这是一个内核模块,我在Linux启动后加载到内核中。
在我的驱动程序中,端点设备是从设备ID表中识别出来的,但是当我想通过pci_enable_device()
启用设备时,我看到了这个错误:
driver-pci 0000:00:00.0:因BAR 0 [0x000000-0xfffffff]冲突而无法使用设备
此外,当我想使用pci_request_region()
为PCIe设备分配内存区域时,这是不可能的。
以下是驱动程序代码无效的部分:
pci_enable_result = pci_enable_device (pdev);
if (pci_enable_result)
{
printk(KERN_INFO "PCI enable encountered a problem \n");
return pci_enable_result;
}
else
{
printk(KERN_INFO "PCI enable was succesfull \n");
}
这是“dmesg”的结果:
driver-pci 0000:00:00.0:因BAR 0 [0x000000-0xfffffff]冲突而无法使用设备
PCI启用遇到问题
driver-pci:探测0000:00:00.0失败,错误-22
值得注意的是,在驱动程序中,我可以使用pci_read_config_dword()
和pci_write_config_dword()
等函数正确读写配置寄存器。
你觉得有什么问题?是否可能出现问题,因为内核在内核模块之前初始化设备?我应该怎么做以防止这种情况发生?
答案 0 :(得分:0)
BAR寄存器访问通常用于小区域。您的BAR0尺寸似乎太大了。尝试使用更少的内存(小于1MB),它应该工作。