Как запустить операцию 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?


person qweruiop    schedule 03.03.2014    source источник


Ответы (1)


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

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

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

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

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

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

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

person skrrgwasme    schedule 23.09.2014