免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3397 | 回复: 7
打印 上一主题 下一主题

[硬件及驱动] 想开个帖子讨论下alsa-driver不知大家是否有兴趣? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-13 09:50 |只看该作者 |倒序浏览
本帖最后由 testh 于 2012-12-13 16:29 编辑

最近正在看这块有很多疑问,不知大家是否有兴趣一起讨论一下?
曾经加入了alsa-devel的邮件列表,但是里面基本都是对提交patch的讨论,对我这种小白级的问题都是直接忽略了,不知大家是否有意一起讨论一下原理框架部分?

欢迎msn实时联系bluewate@live.cn,请注明alsa.

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2012-12-13 11:33 |只看该作者
回复 1# testh
非常欢迎 LZ。可以先分享你的理解或者你的疑问

   

论坛徽章:
0
3 [报告]
发表于 2012-12-13 14:11 |只看该作者
本帖最后由 testh 于 2012-12-13 14:17 编辑

感谢版主支持。
先说下我的疑问吧,有很多,一个一个的说,先说第1个。
目前使用的是alsa-driver-1.0.24版。
目标为core/pcm_lib.c中的snd_pcm_update_hw_ptr0()这个函数。
这个函数在两个地方会被调用:
(1)在DMA的中断中会被调用。当DMA完成一次中断传输后,就会调用snd_pcm_period_elapsed(),然后再调用snd_pcm_update_hw_ptr0(),参数in_interrupt=1,是从中断中调用的;
(2)snd_pcm_update_hw_ptr()中调用,但参数in_interrupt=0,告诉snd_pcm_update_hw_ptr0()是在软件传输中调用的,非中断调用;

下图为借用的网上资料说明的alsa的buffer框架图。

资料链接地址为: http://blog.csdn.net/droidphone/article/details/7316061


结合此图,我理解的是图中的DMA Buffer即为 用户驱动中.pcm_new那里分配出来的dma缓冲区,开始我以为整个dma缓冲区就简单的映射为boundary,但是后来看代码越发的不对劲,现在理解为dma的缓冲区只能完整的映射为buffer那么大,就dma的size与buffer_size相同,这样的话,一个boundary里面就包含有若干个buffer,一个buffer即为一个dma缓冲区大小,它们之间的关系有点像虚拟内存的关系,实际的物理储存空间只有dma-buffer那么大,但是虚拟扩展出来的却有boundary那么大,因此在使用boundary的时候需要dma-buffer一步一步的向前移动。在一个buffer这么大的空间中又包含period个小块,一个小块表示dma中断一次完成的数据传输量,大小为period_size。

上面这段是我能够理解的,理解错误的地方烦请指针一下,下面是我结合snd_pcm_update_hw_ptr0()比较疑惑的地方:

(1)
  1. jdelta = jiffies - runtime->hw_ptr_jiffies;

  2. if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) {
  3.            delta = jdelta /
  4.                     (((runtime->period_size * HZ) / runtime->rate) + HZ/100);
  5.            /* move new_hw_ptr according jiffies not pos variable */
  6.            new_hw_ptr = old_hw_ptr;
  7.            hw_base = delta;
  8.            /* use loop to avoid checks for delta overflows */
  9.            /* the delta value is small or zero in most cases */
  10.            while (delta > 0) {
  11.                     new_hw_ptr += runtime->period_size;
  12.                     if (new_hw_ptr >= runtime->boundary)
  13.                              new_hw_ptr -= runtime->boundary;
  14.                     delta--;
  15.            }

  16.            /* align hw_base to buffer_size */
  17.            hw_ptr_error(substream,
  18.                          "hw_ptr skipping! %s"
  19.                          "(pos=%ld, delta=%ld, period=%ld, "
  20.                          "jdelta=%lu/%lu/%lu, hw_ptr=%ld/%ld)\n",
  21.                          in_interrupt ? "[Q] " : "",
  22.                          (long)pos, (long)hdelta,
  23.                          (long)runtime->period_size, jdelta,
  24.                          ((hdelta * HZ) / runtime->rate), hw_base,
  25.                          (unsigned long)old_hw_ptr,
  26.                          (unsigned long)new_hw_ptr);
  27.            /* reset values to proper state */
  28.            delta = 0;
  29.            hw_base = new_hw_ptr - (new_hw_ptr % runtime->buffer_size);
复制代码
这段是jiffies check的部分,我不太明白为什么使用 (hdelta * HZ) / runtime->rate) 的值 和 jdelta + HZ/100 的值来作比较。前者表示传输 hdelta这些数据所用的jiffies数,后者表示本次进入snd_pcm_update_hw_ptr0()和上次进入之间的时间差。根据这个推断,如果这个判断条件为真就认为硬件中断已经发生很多次了,通过他们的判断可以判断出来吗? 或者是我对(hdelta * HZ) / runtime->rate)的含义理解有误?另外不太明白为什么 jdelta还要再单独加上 HZ/100,是作为一个额外的时间补偿吗?

论坛徽章:
0
4 [报告]
发表于 2012-12-15 16:10 |只看该作者
看来没有人对这个感兴趣,我继续提问:
2. 在alsa中,no_period_wakeup 指的是什么情况?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
5 [报告]
发表于 2012-12-17 08:22 |只看该作者
回复 3# testh
没搞过这块,友情帮顶!

   

论坛徽章:
0
6 [报告]
发表于 2012-12-17 12:05 |只看该作者
谢谢楼上版主,要不搞一下

论坛徽章:
0
7 [报告]
发表于 2012-12-19 07:45 |只看该作者
正在看这一部份。多交流。

论坛徽章:
0
8 [报告]
发表于 2012-12-19 10:16 |只看该作者
回复 7# voiceshen


    可否具体些,你研究到哪部分了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP