Как запустить операцию DMA на звуковой карте PCI

Я новичок в разработке драйверов в 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 ответ

У вас здесь есть несколько вопросов, поэтому я буду отвечать на них по одному:

  1. Должен ли я написать новый драйвер или вызвать некоторые вызовы функций API?

Если в существующем драйвере есть такая функция, доступная из пространства пользователя, да, вы должны использовать их - они будут самым простым вариантом. Если они еще не существуют, вам придется написать драйвер, потому что вы не можете получить прямой доступ к ядру DMA ядра из пространства пользователя. Вам нужен водитель, чтобы помочь вам в этом.

  1. Должна ли это быть пользовательская программа или модуль?

Это должен быть модуль для доступа к низкоуровневым функциям ядра. Используя в качестве примера включенный код, вы не можете вызвать "dma_map_single" из пространства пользователя или получить доступ к структуре устройства устройства PCI. Для этого вам необходимо находиться в пространстве ядра, для чего требуется либо модуль драйвера, либо статический драйвер ядра.

  1. Где я могу получить более подробную информацию об устройстве?

(Я предполагаю, что вы имели в виду Grep.) Вам нужно будет взять руководство программиста для устройства, к которому вы хотите получить доступ. Обычные руководства пользователя не будут иметь требуемый уровень детализации (адреса регистров, битовые комбинации и т. Д.), Поэтому вам, возможно, придется обратиться к производителю за руководством по написанию драйверов. Вы также можете найти примеры в исходном коде ядра. Проверьте http://lxr.free-electrons.com/ для поиска, актуальный список всего источника ядра. Если вы заглянете в /drivers/, возможно, вам удастся найти несколько примеров для начала.

Другие вопросы по тегам