注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

DMA的使用  

2012-10-04 13:23:54|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
为了对上一节里面dma构架有一个更明确的认识,本节我们通过dma的使用来加深理解!

函数1:int s3c2410_dma_request(enum dma_ch channel,struct s3c2410_dma_client *client,void *dev)

s3c2410_dma_request   //获得对一个dma通道的控制
      chan = s3c2410_dma_map_channel(channel);  //根据虚拟的dma通道找到实际的dma通道,详见注释1
      chan->client = client;
      chan->in_use = 1; //标识通道在使用中
      if (!chan->irq_claimed) //如果没有申请中断就申请,写驱动的话,我们一般会自己注册中断函数的吧!
             request_irq(chan->irq, s3c2410_dma_irq, IRQF_DISABLED,client->name, (void *)chan);
总结:这个函数就是根据虚拟通道找到一个有权利使用又没有被别人使用的dma通道!如果没有注册中断的话,还会注册中断!

注释1:
static struct s3c2410_dma_chan *s3c2410_dma_map_channel(int channel)
{
struct s3c24xx_dma_order_ch *ord = NULL;
struct s3c24xx_dma_map *ch_map;
struct s3c2410_dma_chan *dmach;
int ch;

if (dma_sel.map == NULL || channel > dma_sel.map_size)
return NULL;

ch_map = dma_sel.map + channel;

/* first, try the board mapping */
         //还记得它吗?
if (dma_order) {
ord = &dma_order->channels[channel]; //根据虚拟通道找到dma_order中的某一个项
                //dma_channels是个全局变量,我们设置过,它是4
for (ch = 0; ch < dma_channels; ch++) {
int tmp;
if (!is_channel_valid(ord->list[ch])) //判断虚拟通道对应的实际通道是否有效
continue;

tmp = ord->list[ch] & ~DMA_CH_VALID; //让这个通道变得不再有效
if (s3c2410_chans[tmp].in_use == 0) { 
ch = tmp;
goto found; //如果通道有效且不在使用中,就跳到found处
}
}

if (ord->flags & DMA_CH_NEVER)
return NULL;
}

/* second, search the channel map for first free */

for (ch = 0; ch < dma_channels; ch++) {  //这个循环跟上面差不多,只不过遍历的地方不一样
if (!is_channel_valid(ch_map->channels[ch]))
continue;

if (s3c2410_chans[ch].in_use == 0) {
printk("mapped channel %d to %d\n", channel, ch);
break;
}
}

if (ch >= dma_channels)
return NULL;

/* update our channel mapping */

 found:
dmach = &s3c2410_chans[ch]; //将找到的实际通道给dmach
dmach->map = ch_map;           
dmach->req_ch = channel;        //申请的通道
s3c_dma_chan_map[channel] = dmach; //记录本虚拟通道对应的实际通道的使用信息

/* select the channel */

(dma_sel.select)(dmach, ch_map); //选择通道,也就是将将通道变得不再有效,针对map

return dmach;
}
       
  评论这张
 
阅读(1089)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017