Linux之DMA动态映射指南(二)

2014-11-24 10:38:54 · 作者: · 浏览: 1
consistent_using_dac = 0;
dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
} else {
printk(KERN_WARNING
"mydev: No suitable DMA available.\n");
goto ignore_this_device;
}


最后,如果你的设备只有低24位寻址能力,那么代码可能如下:


if (dma_set_mask(dev, DMA_BIT_MASK(24))) {
printk(KERN_WARNING
"mydev: 24-bit DMA addressing not available.\n");
goto ignore_this_device;
}


当调用dma_set_mask()成功时,会返回零。内核会保存输入的掩码值。以后再做DMA映射时就会用到该掩码信息。


有一个特殊情况我们需要在这里提 一下。如果设备支持多重功能(比如声卡支持播放和录音功能),不同的功能有不同的DMA寻址寻址限制,你可能想探测每个掩码然后选出一个机器可以处理的值。最后调用dma_set_mask()会成为最特别的掩码值,这点很重要。


下面给出伪代码来展示如何处理该问题。


#define PLAYBACK_ADDRESS_BITS DMA_BIT_MASK(32)
#define RECORD_ADDRESS_BITS DMA_BIT_MASK(24)

struct my_sound_card *card;
struct device *dev;

...
if (!dma_set_mask(dev, PLAYBACK_ADDRESS_BITS)) {
card->playback_enabled = 1;
} else {
card->playback_enabled = 0;
printk(KERN_WARNING "%s: Playback disabled due to DMA limitations.\n",
card->name);
}
if (!dma_set_mask(dev, RECORD_ADDRESS_BITS)) {
card->record_enabled = 1;
} else {
card->record_enabled = 0;
printk(KERN_WARNING "%s: Record disabled due to DMA limitations.\n",
card->name);
}