LINUX.ORG.RU

Работа с устройством через uio_pci_generic


0

1

Приветствую! Нужно написать приложение, которое работает с устройством через драйвер uio_pci_generic. Связал устройство по venid\devid с драйвером. dmesg пишет, что все хорошо: uio_pci_generic 0000:04:0c.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16. Пытаюсь получить доступ к памяти устройства через mmap():

uint32_t *UioMap(int devnum, int map_num)
{
    char *u = (char *) calloc(64, 1);
    sprintf(u, "/sys/class/uio/uio%d/device/resource%d", devnum, map_num);
    int fd = open(u, O_RDONLY);  
    if(fd < 0)
    {
        fprintf(stderr,"Error on open!\n");
        return NULL;
    }
    else fprintf(stderr,"fd = %d\n", fd);
    void* map_addr = mmap(NULL,
            map_sizes[map_num],
            PROT_READ,
            MAP_SHARED,
            fd,
            0);
    if(map_addr == MAP_FAILED)
    {
        perror("mmap");
    }
    return (uint32_t *) map_addr;
}

вроде mmap() проходит - ошибок не выдает, указатели «валидные», но в папке /sys/class/uio/uio0/ не появляются каталоги mapX, ну и при обращении к памяти по указателям происходит segfault. Кто-нибудь использовал функционал этого драйвера в жизни? Может надо какие-то хитрые параметры давать mmap()?

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.