Приветствую! Нужно написать приложение, которое работает с устройством через драйвер 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()?