Как запустить операцию 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 ответ
У вас здесь есть несколько вопросов, поэтому я буду отвечать на них по одному:
- Должен ли я написать новый драйвер или вызвать некоторые вызовы функций API?
Если в существующем драйвере есть такая функция, доступная из пространства пользователя, да, вы должны использовать их - они будут самым простым вариантом. Если они еще не существуют, вам придется написать драйвер, потому что вы не можете получить прямой доступ к ядру DMA ядра из пространства пользователя. Вам нужен водитель, чтобы помочь вам в этом.
- Должна ли это быть пользовательская программа или модуль?
Это должен быть модуль для доступа к низкоуровневым функциям ядра. Используя в качестве примера включенный код, вы не можете вызвать "dma_map_single" из пространства пользователя или получить доступ к структуре устройства устройства PCI. Для этого вам необходимо находиться в пространстве ядра, для чего требуется либо модуль драйвера, либо статический драйвер ядра.
- Где я могу получить более подробную информацию об устройстве?
(Я предполагаю, что вы имели в виду Grep.) Вам нужно будет взять руководство программиста для устройства, к которому вы хотите получить доступ. Обычные руководства пользователя не будут иметь требуемый уровень детализации (адреса регистров, битовые комбинации и т. Д.), Поэтому вам, возможно, придется обратиться к производителю за руководством по написанию драйверов. Вы также можете найти примеры в исходном коде ядра. Проверьте http://lxr.free-electrons.com/ для поиска, актуальный список всего источника ядра. Если вы заглянете в /drivers/, возможно, вам удастся найти несколько примеров для начала.