2016-09-18 83 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