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