【发布时间】:2016-02-22 06:10:13
【问题描述】:
我正在编写一个内核模块,它将分配一些一致的内存并返回相应的虚拟和物理地址。
我将模块注册为cdev,使用dma_alloc_coherent() 分配空间,我想使用dma_common_mmap() 映射它。
dma_common_mmap() 需要指向struct device 的指针:我怎样才能获得它?
【问题讨论】:
标签: linux-kernel device-driver dma
我正在编写一个内核模块,它将分配一些一致的内存并返回相应的虚拟和物理地址。
我将模块注册为cdev,使用dma_alloc_coherent() 分配空间,我想使用dma_common_mmap() 映射它。
dma_common_mmap() 需要指向struct device 的指针:我怎样才能获得它?
【问题讨论】:
标签: linux-kernel device-driver dma
void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int flag);
这个函数处理缓冲区的分配和映射。前两个参数是设备结构和所需缓冲区的大小。 该函数在两个地方返回 DMA 映射的结果。该函数的返回值是缓冲区的内核虚拟地址,驱动程序可以使用该地址。 同时,相关的总线地址在 dma_handle 中返回。
【讨论】:
看看
int cdev_device_add(struct cdev *cdev, struct device *dev)
您可以在以下位置找到一个工作示例
linux-source/drivers/gpio/gpiolib.c
【讨论】: