2016-09-18 115 views
1

我想從一個的PCIe板,其提供了1GB存儲器與用戶BAR0存取存儲器。 目前我只用讀,寫我的字符設備驅動程序,這是非常緩慢(1MB/s的讀取和16MB/s的寫入)在8倍的PCIe第3代的功能。是否可以MMAP PCI BAR內存?

static ssize_t 
MPD_read(
    struct file *filp, 
    char *buffer, 
    size_t bufferSize, 
    loff_t *offset) 
{ 
    unsigned long unusedBytes = copy_to_user(
     (void *) buffer, 
     MPD_AdapterBoard.bars[ 0 ].barHWAddress, 
     bufferSize); 
    return 0; 
} 

static ssize_t 
MPD_write(
    struct file *filp, 
    const char *buffer, 
    size_t bufferSize, 
    loff_t *offset) 
{ 
    unsigned long unusedBytes = copy_from_user(
     MPD_AdapterBoard.bars[ 0 ].barHWAddress, 
     (void *) buffer, 
     bufferSize); 
    return 0; 
} 

是否可以使用MMAP(與.mmap文件操作)來獲得更多的速度? 或者DMA是唯一的選擇?

在此先感謝!

/Jesko

回答

0

我發現它是如何工作的:

static int 
    MPD_mmap(
    struct file *filp, 
    struct vm_area_struct *vma) 
{ 
    unsigned long offset; 

    offset = vma->vm_pgoff << PAGE_SHIFT; 
    if ((offset + (vma->vm_end - vma->vm_start)) > MPD_AdapterBoard.bars[ 0 ].barSizeInBytes) 
    { 
     return -EINVAL; 
    } 

    offset += (unsigned long) MPD_AdapterBoard.bars[ 0 ].mmioStart; 

    vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 

    if (io_remap_pfn_range(vma, vma->vm_start, offset >> PAGE_SHIFT, vma->vm_end - vma->vm_start, vma->vm_page_prot)) 
    { 
     return -EAGAIN; 
    } 
    return 0; 
} 

注意:這是一項正在進行的工作,因此錯誤檢查是相當有限的。

希望能幫到這裏的人,完整的代碼可以從這裏下載,包括一個測試程序:https://github.com/jesko42/minipci