2011-03-03 95 views
4

我在寫一個設備驅動程序來訪問PCIe卡上FPGA中的內存。
卡靴子和被探測/發現: -實現PCIe Linux設備驅動程序(希望從內核驅動程序訪問我的卡寄存器)

的/ proc/IOMEM

80000000-840fffff : PCI Bus #03 
    80000000-83ffffff : 0000:03:00.0 
    84000000-840fffff : 0000:03:00.0 

所以讀LDD /等我編寫了以request_mem_region呼叫在80000000,並通過請求指向它的指針ioremap_nocache

1)我需要request_mem_region以及ioremap_nocache,不能使用後者嗎?

的/ proc/IOMEM後insmod我的設備驅動程序: -

80000000-840fffff : PCI Bus #03 
    80000000-83ffffff : 0000:03:00.0 
    80000000-8003ffff : fp2 
    84000000-840fffff : 0000:03:00.0 

2)does not看起來很正確,我...?

總之,讀不工作(它不是編碼方式類似於下面,有支票等): -

#define BAR_ADDR 0x80000000 
void *base = ioremap_nocache(BAR_ADDR, 0x40000); 
void *address = base + KNOWN_REG_LOCATION; 
int data = ioread32(address); 
printk("fp2: address:0x%08x, data:0x%08x\n", address, data); 

輸出: -

address:0xfd500000, data:0xffffffff 

我可以閱讀x80000000+KNOWN_REG_LOCATION從mmap用戶空間。

3)我試過__raw_readl/readl也沒有運氣。

4)我可以在當前映射地址x80000000處閱讀嗎?

+0

您的.tar文件需要密碼。審查代碼會很有幫助。 – PatrickM 2011-10-31 23:26:46

+0

我認爲你的評論應該引導@willtake – 2012-02-23 09:52:09

回答

6

伊恩,

我寫了一個PCI驅動的設備(full source)。雖然寄存器空間的映射應該是相同的。這是我如何做到的。

dm7820_device->pci[region].virt_addr = ioremap_nocache(address, length); 
if (dm7820_device->pci[region].virt_addr == NULL) { 
    printk(KERN_ERR "%s: ERROR: BAR%u remapping FAILED\n", 
     &((dm7820_device->device_name)[0]), region); 
    dm7820_release_resources(); 
    return -ENOMEM; 
} 

if (request_mem_region(address, length, &((dm7820_device->device_name)[0])) == NULL) { 
    printk(KERN_ERR "%s: ERROR: I/O memory range %#lx-%#lx allocation FAILED\n", 
     &((dm7820_device->device_name)[0]), address, (address + length - 1)); 
    dm7820_release_resources(); 
    return -EBUSY; 
} 

的地址和長度值從pci_resource_start()pci_resource_length()調用返回。

然後你就可以使用ioread32()使用dm7820_device->pci[region].virt_addr + <register offset>

讓我知道如果您有任何疑問訪問。