我是Linux驱动程序开发的新手。我想在指定的目标地址触发DMA read
操作,但我没有关于如何操作的基本概念。我应该为我的声卡写一个新的驱动程序吗?或者只是调用当前声卡驱动程序提供的一些API(如果有的话)?
我可以想象我想要的就是这样(来自LDD3 Ch15),
int dad_transfer(struct dad_dev *dev, int write, void *buffer,
size_t count)
{
dma_addr_t bus_addr;
/* Map the buffer for DMA */
dev->dma_dir = (write ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
dev->dma_size = count;
bus_addr = dma_map_single(&dev->pci_dev->dev, buffer, count,
dev->dma_dir);
dev->dma_addr = bus_addr;
/* Set up the device */
writeb(dev->registers.command, DAD_CMD_DISABLEDMA);
writeb(dev->registers.command, write ? DAD_CMD_WR : DAD_CMD_RD);
writel(dev->registers.addr, cpu_to_le32(bus_addr));
writel(dev->registers.len, cpu_to_le32(count));
/* Start the operation */
writeb(dev->registers.command, DAD_CMD_ENABLEDMA);
return 0;
}
但这应该是什么,用户空间程序还是模块?我可以在哪里获取更多特定于设备的详细信息,以便了解registers
应该写入哪些内容以及如何编写?
答案 0 :(得分:1)
你有几个问题埋在这里,所以我会一次拿一个:
如果现有的驱动程序具有可从用户空间访问的功能,是的,您应该使用它们 - 它们将是最简单的选项。如果它们尚不存在,则必须编写驱动程序,因为您无法直接从用户空间访问内核的DMA引擎。你需要一个司机来帮助你。
它必须是一个模块才能访问低级内核功能。使用您提供的代码作为示例,您无法调用" dma_map_single"来自用户空间或访问PCI设备的设备结构。您需要在内核空间中执行此操作,这需要驱动程序模块或静态内核驱动程序。
(我假设您的意思是Grep。)您必须获得要访问的设备的程序员指南。普通用户的手册不具备您需要的详细程度(注册地址,位模式等),因此您可能需要联系制造商以获取驱动程序编写者的指南。您也可以在内核源代码中找到一些示例。检查http://lxr.free-electrons.com/以获取整个内核源代码的可搜索,最新列表。如果您查看/ drivers /,您可能会找到一些示例来帮助您入门。