Ошибка mmap() для устройства UIO (uio_pci_generic)

Я пытаюсь связаться с пользовательским устройством PCIe в Linux. У меня не было опыта программирования с использованием системных вызовов и написания драйверов устройств 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, Если я получу доступ к устройству с помощью sysFS, изменив #define PCI_FILE "/sys/bus/pci/devices/0000:08:00.0/resource0" все работает.

Итак, насколько я понял, я мог бы mmap() на устройство /dev/uio0, но оно выдает ошибку. Возможно ли в mmap() символьное устройство? В чем будет проблема?

Здесь нет maps каталог под /sys/class/uio/ui0/, Это индикатор проблемы?

0 ответов

uio_pci_generic Драйвер не включает карту памяти.

Если вы все еще хотите это сделать, вы можете проверить раздел 5 этой страницы.

Я думаю, что если вы добавите это, файл карты будет доступен.

Другие вопросы по тегам