Implementación del controlador de dispositivo PCIe Linux (quiero acceder a los registros de mi tarjeta desde el controlador del kernel)
Estoy escribiendo un controlador de dispositivo para acceder a la memoria en un FPGA en una tarjeta PCIe.
La tarjeta arranca y se prueba / se encuentra: -
/ proc / iomem
80000000-840fffff : PCI Bus #03
80000000-83ffffff : 0000:03:00.0
84000000-840fffff : 0000:03:00.0
Así que leyendo ldd / etc. Codifiqué una llamada arequest_mem_region
en el80000000
, y solicitó un puntero a través deioremap_nocache
1) ¿Necesitorequest_mem_region
así como unioremap_nocache
, ¿no puedo usar solo el último?
/ proc / iomem Afterinsmod
controlador de mi dispositivo: -
80000000-840fffff : PCI Bus #03
80000000-83ffffff : 0000:03:00.0
80000000-8003ffff : fp2
84000000-840fffff : 0000:03:00.0
2) ¿No me parece bien ...?
e todos modos, las lecturas no funcionan (no está codificado como a continuación, tiene cheques, etc.): -
#define BAR_ADDR 0x80000000
void *base = ioremap_nocache(BAR_ADDR, 0x40000);
void *address = base + KNOWN_REG_LOCATION;
int data = ioread32(address);
printk("fp2: address:0x%08x, data:0x%08x\n", address, data);
Salidas: -
address:0xfd500000, data:0xffffffff
Puedo leer elx80000000+KNOWN_REG_LOCATION
desde mmap userspace.
3) He intentado__raw_readl
/readl
sin suerte también.
4) ¿Puedo leer en la dirección asignada actualmentex80000000
?