第20章 Linux芯片级移植及底层驱动之dma engine驱动

20.9 dma engine驱动

    dma engine是一套通用的DMA(直接存储器存取)驱动框架,该框架为使用DMA通道的设备驱动提供了一套统一的API,而且也定义了用具体的DMA控制器实现这一套API的方法。

    对于使用DMA引擎的设备驱动而言,发起DMA传输的过程变得整洁了,如在sound子系统的sound/core/pcm_dmaengine.c中,会使用dmaengine进行周期性的DMA传输,相关的代码如清单20.27所

示。

代码清单20.27 dma engine API的使用

static int dmaengine_pcm_prepare_and_submit(struct snd_pcm_substream *substream)
{
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
struct dma_chan *chan = prtd->dma_chan;
struct dma_async_tx_descriptor *desc;
enum dma_transfer_direction direction;
unsigned long flags = DMA_CTRL_ACK;

direction = snd_pcm_substream_to_dma_direction(substream);

if (!substream->runtime->no_period_wakeup)
flags |= DMA_PREP_INTERRUPT;

prtd->pos = 0;
desc = dmaengine_prep_dma_cyclic(chan,
substream->runtime->dma_addr,
snd_pcm_lib_buffer_bytes(substream),
snd_pcm_lib_period_bytes(substream), direction, flags);//初始化一个具体的周期性的DMA传输描述符

if (!desc)
return -ENOMEM;

desc->callback = dmaengine_pcm_dma_complete;
desc->callback_param = substream;
prtd->cookie = dmaengine_submit(desc);

return 0;
}

int snd_dmaengine_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
{
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(su

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值