2016-02-08 55 views
5

我正在爲Linux編寫一個PCIe驅動程序,目前沒有DMA,並且需要知道如何從用戶空間啓用PCIe設備時讀取和寫入PCIe設備。PCIe驅動程序 - 用戶空間如何訪問它?

在我做的基礎知識探頭()司機:

pci_enable_device(); 
pci_request_regions(); 
pci_iomap(); 

但後來怎樣訪問從用戶空間這個內存讀寫?我是否將文件操作添加到我的PCIe驅動程序?從pci_iomap的內存是否顯示用戶空間代碼可以調用的某些地方:

open('mapped memory location'); 
mmap(...); 

如果是這樣,那麼位置是什麼?

注:的PCIe設備不會插入到任何Linux子系統,如音頻,以太網等

+0

不知道是否是推薦的做事方式,但其他內核驅動程序會暴露類似'/ dev/vboxnetctl'的虛擬設備,我假設您可以發出命令。我不確定Linux內核是否會允許任何用戶空間程序無情地讀取/寫入PCIe設備,這聽起來像是危險的。 –

+0

我也在看。有什麼我需要做的,爲了讓我的設備出現在那裏?例如,我可以在我的驅動程序中創建哪些API調用? – user2205930

+0

也許看看VirtualBox驅動程序源代碼的想法。 –

回答

0

您可以使用諸如register_chrdevdevice_create功能註冊的設備。考慮kernel source for /dev/null and /dev/mem

static int __init chr_dev_init(void) 
{ 
    int minor; 

    if (register_chrdev(MEM_MAJOR, "mem", &memory_fops)) 
     printk("unable to get major %d for memory devs\n", MEM_MAJOR); 

    mem_class = class_create(THIS_MODULE, "mem"); 
    if (IS_ERR(mem_class)) 
     return PTR_ERR(mem_class); 

    mem_class->devnode = mem_devnode; 
    for (minor = 1; minor < ARRAY_SIZE(devlist); minor++) { 
     if (!devlist[minor].name) 
      continue; 

     /* 
     * Create /dev/port? 
     */ 
     if ((minor == DEVPORT_MINOR) && !arch_has_dev_port()) 
      continue; 

     device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor), 
        NULL, devlist[minor].name); 
    } 

    return tty_init(); 
} 

fs_initcall(chr_dev_init); 
+0

是的,我最終爲我的PCIe設備創建了一個字符設備驅動程序。我會推薦其他人閱讀第3章的Linux設備驅動程序手冊以瞭解更多信息。它已經過時了,但你可以選擇一些基本知識來讓你走。 – user2205930

2

如果你只是想從內核空間將內存導出到用戶空間並獲得中斷,想想UIO driver

有了它,所有的訪問都將通過/ dev/uioX文件完成。你可以對其執行mmap()來導出內存,並且你可以讀取(用阻塞讀取)來「捕捉」中斷。

UIO非常適合PCIe,在內核中有already is a driver

相關問題