Freescale MPC8308'de (root kompleksi olarak) PCIe veri yolu kullanıyorum ve uç nokta aygıtı yalnızca bir 256 MB bellek bölgesi ve bir BAR kaydına sahip bir ASIC. Cihaz yapılandırma alanı kayıtlarına "pciutils" paketi ile kolayca erişilebilir. İlk başta kullanarak hafıza bölgesine erişmeye çalıştım mmap()
ama işe yaramadı. Böylece bir sonraki seviyede, Linux önyüklemesinden sonra çekirdeğe yüklediğim bir çekirdek modülü olan PCIe uç nokta aygıtı için bir aygıt sürücüsü hazırladım.
Sürücümde uç nokta aygıtı aygıt kimliği tablosundan tanımlanıyor, ancak aygıtı etkinleştirmek istediğimde pci_enable_device()
bu hatayı görüyorum:
driver-pci 0000: 00: 00.0: BAR 0 [0x000000-0xfffffff] çarpışmaları nedeniyle cihaz kullanılamıyor
Ayrıca, PCIe aygıtı için bellek bölgesini kullanarak ayırmak istediğimde pci_request_region()
mümkün değil.
İşte çalışmayan sürücü kodunun bir kısmı:
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");
}
Ve işte "dmesg" nin sonucudur:
driver-pci 0000: 00: 00.0: BAR 0 [0x000000-0xfffffff] çarpışmaları nedeniyle cihaz kullanılamıyor
PCI etkin bir sorunla karşılaştı
sürücü-pci: 0000: 00: 00.0 probu -22 hatasıyla başarısız oldu
Sürücüdeki yapılandırma kayıtlarını pci_read_config_dword()
ve gibi fonksiyonları kullanarak doğru okuyabilir ve yazabilirim pci_write_config_dword()
.
Sence sorun ne? Çekirdeğin modülden önce başlatılmasından dolayı problem ortaya çıkmış olabilir mi? bunun olmasını önlemek için ne yapmalıyım?