如何在PCI声卡上触发DMA操作

时间:2014-03-03 07:11:57

标签: driver dma pci soundcard

我是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应该写入哪些内容以及如何编写?

1 个答案:

答案 0 :(得分:1)

你有几个问题埋在这里,所以我会一次拿一个:

  1. 我应该编写新的驱动程序还是调用一些API函数调用?
  2. 如果现有的驱动程序具有可从用户空间访问的功能,是的,您应该使用它们 - 它们将是最简单的选项。如果它们尚不存在,则必须编写驱动程序,因为您无法直接从用户空间访问内核的DMA引擎。你需要一个司机来帮助你。

    1. 这应该是用户空间程序还是模块?
    2. 它必须是一个模块才能访问低级内核功能。使用您提供的代码作为示例,您无法调用" dma_map_single"来自用户空间或访问PCI设备的设备结构。您需要在内核空间中执行此操作,这需要驱动程序模块或静态内核驱动程序。

      1. 我在哪里可以获得更多特定于设备的详细信息?
      2. (我假设您的意思是Grep。)您必须获得要访问的设备的程序员指南。普通用户的手册不具备您需要的详细程度(注册地址,位模式等),因此您可能需要联系制造商以获取驱动程序编写者的指南。您也可以在内核源代码中找到一些示例。检查http://lxr.free-electrons.com/以获取整个内核源代码的可搜索,最新列表。如果您查看/ drivers /,您可能会找到一些示例来帮助您入门。