Linux kernel device driver to DMA into kernel space
LDD3 (p: 453) demostracionesdma_map_single
utilizando un búfer pasado como parámetro.
bus_addr = dma_map_single(&dev->pci_dev->dev, buffer, count, dev->dma_dir);
Q1: ¿De qué / de dónde viene este búfer?
kmalloc
?
Q2: ¿Por qué DMA-API-HOWTO.txt indica que puedo usar rawkmalloc
a DMA en?
Formhttp: //www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.tx
L: 51 Si adquirió su memoria a través del asignador de páginas kmalloc (), entonces puede DMA a / desde esa memoria utilizando las direcciones devueltas de esas rutinas.
L: 74 no puede tomar la devolución de una llamada kmap () y DMA a / desde eso.
Entonces puedo pasar la dirección devuelta dekmalloc
a mi dispositivo de hardware? O debería ejecutarvirt_to_bus
@ en él primero? O debería pasar esto adma_map_single
? Q3: Cuando se completa la transferencia de DMA, ¿puedo leer los datos en el controlador del kernel a través dekmalloc
dirección?
addr = kmalloc(...);
...
printk("test result : 0x%08x\n", addr[0]);
Q4: ¿Cuál es la mejor manera de llevar esto al espacio de usuario?
copy_to_user
?mmap la memoria de kmalloc?¿otros