MMAP()错误UIO装置(uio_pci_generic)

问题描述 投票:0回答:1

我试图在Linux中进行通信的定制的PCIe设备。我没有使用系统调用和编写Linux设备驱动程序的编程经验。

我装uio_pci_generic驱动程序用于设备和作为字符设备生成的/ dev / uio0。然后,我写了下面的C程序转储从设备128K的数据文件。该器件具有唯一BAR0大小为128K。

#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>

#define MMBLOCK_SIZE (1024*128)
#define PCI_FILE "/dev/uio0"
#define BIN_FILE "dump.bin"

int main() {

    int f;
    FILE * fdumpptr;
    char *ptr;

    printf("PCI FILE: %s\n", PCI_FILE);
    printf("BIN FILE: %s\n", BIN_FILE);

    f = open(PCI_FILE, O_RDWR);

    fdumpptr = fopen("dump.bin","w");

    if(NULL == fdumpptr)
    {
        perror("Can't open BIN FILE");
        return 1;
    }

    if(-1 == f)
    {
        perror("Can't open PCI FILE");
        return 1;
    }
    else
    {
        printf("PCI FILE opened successfully\n");
    }

    ptr = mmap(NULL, MMBLOCK_SIZE, PROT_READ, MAP_SHARED, f, 0);

    if (MAP_FAILED == ptr)
    {
        perror("Can't do memory map on PCI FILE");
        return 1;
    }
    else
    {
        printf("memory map succesfull\n");
    }

    if (MMBLOCK_SIZE == fwrite(ptr, 1, MMBLOCK_SIZE, fdumpptr))
    {
        printf("Content dumpped succesffully\n");
    }
    else
    {
        printf("Can't write dump file\n");
        return 1;
    }

    return 0;
}

然而mmap()返回MAP_FAILED。如果我改变#define PCI_FILE "/sys/bus/pci/devices/0000:08:00.0/resource0"一切正常访问使用SYSFS设备。

所以,据我了解,我可以的mmap()在/ dev / uio0设备,但它给出了一个错误。是否有可能mmap()的字符设备?会是什么问题呢?

目前正在maps没有/sys/class/uio/ui0/目录。这是一个问题的指标?

mmap
1个回答
-1
投票

uio_pci_generic驱动程序不包括存储器映射。

如果您仍然想这样做,你可以检查this page第5。

我认为你会添加此之后,映射文件将可用。

© www.soinside.com 2019 - 2024. All rights reserved.