我正在移植/调试设备驱动程序(由另一个内核模块使用)并面临死胡同,因为 dma_sync_single_for_device() 因内核 oops 而失败。
我不知道该功能应该做什么,谷歌搜索并没有真正的帮助,所以我可能需要全面了解这些东西。
问题是,从哪里开始?
哦,是的,如果相关的话,代码应该在 PowerPC 上运行(而 linux 是 OpenWRT)
编辑:最好是在线资源(书籍需要几天才能交付:)
我正在移植/调试设备驱动程序(由另一个内核模块使用)并面临死胡同,因为 dma_sync_single_for_device() 因内核 oops 而失败。
我不知道该功能应该做什么,谷歌搜索并没有真正的帮助,所以我可能需要全面了解这些东西。
问题是,从哪里开始?
哦,是的,如果相关的话,代码应该在 PowerPC 上运行(而 linux 是 OpenWRT)
编辑:最好是在线资源(书籍需要几天才能交付:)
在线的:
图书:
基本 Linux 设备驱动程序 (仅前 4-5 章)
有用的资源:
Linux 交叉参考(所有内核的可搜索内核源)
dma_sync_single_for_device
在文件中调用dma_sync_single_range_for_cpu
了一点,这是源文档(我假设即使这是用于 arm 的接口和行为是相同的):
/**
380 * dma_sync_single_range_for_cpu
381 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
382 * @handle: DMA address of buffer
383 * @offset: offset of region to start sync
384 * @size: size of region to sync
385 * @dir: DMA transfer direction (same as passed to dma_map_single)
386 *
387 * Make physical memory consistent for a single streaming mode DMA
388 * translation after a transfer.
389 *
390 * If you perform a dma_map_single() but wish to interrogate the
391 * buffer using the cpu, yet do not wish to teardown the PCI dma
392 * mapping, you must call this function before doing so. At the
393 * next point you give the PCI dma address back to the card, you
394 * must first the perform a dma_sync_for_device, and then the
395 * device again owns the buffer.
396 */
Linux Device Drivers book的章节(与Understanding the Linux Kernel 同一系列,由@Matthew Flaschen 推荐)可能有用。
您可以从LWN 网站下载各个章节。第 16 章讨论 DMA。