Я использую шину PCIe в Freescale MPC8308 (в качестве корневого комплекса), а конечное устройство представляет собой ASIC с одной областью памяти 256 МБ и одним регистром BAR. Регистры пространства конфигурации устройства легко доступны через пакет "pciutils". Сначала я попытался получить доступ к области памяти с помощью mmap()
но это не сработало. Итак, на следующем уровне я подготовил драйвер устройства для конечного устройства PCIe, являющегося модулем ядра, который я загружаю в ядро после загрузки Linux.
В моем драйвере устройство конечной точки идентифицируется из таблицы идентификаторов устройств, но когда я хочу включить устройство с помощью pci_enable_device()
, я вижу эту ошибку:
driver-pci 0000: 00: 00.0: устройство недоступно из-за коллизий BAR 0 [0x000000-0xfffffff]
Также, когда я хочу выделить область памяти для устройства PCIe с помощью pci_request_region()
, это невозможно.
Вот часть кода драйвера, которая не работает:
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 возникла проблема
драйвер-pci: зонд 0000: 00: 00.0 не выполнен с ошибкой -22
Стоит отметить, что в драйвере я могу правильно читать и записывать регистры конфигурации, используя такие функции, как pci_read_config_dword()
и pci_write_config_dword()
.
В чем проблема, вы думаете? Возможно ли, что проблема возникает, потому что ядро инициализирует устройство до модуля ядра? что я должен сделать, чтобы это не произошло?