linux_sound_alsa_ALSA体系SOC子系统中数据流分析

本文深入分析了Linux ALSA体系中的数据流,从Codec到DMA,再到内存交互。首先,介绍了如何通过DMA和内存进行交互,接着探讨了PCM接口的配置,包括采样率、位数和通道数。然后,详细阐述了录音和放音过程中数据的传输路径,从mic到codec的ADC,再到CPU FIFO,最后通过DMA传输到内存。在放音路径中,数据从音频文件经解码,通过ALSA接口snd_pcm_writei传递,经DMA到达codec的DAC,最终驱动speaker。文章强调了配置的匹配性,如CPU FIFO与codec ADC/DAC的位宽、DMA传输与FIFO深度的关系等,并提供了计算音频文件大小的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

    linux中,无论是oss还是alsa体系,录音和放音的数据流必须分析清楚。先分析alsa驱动层,然后关联到alsa库层和应用层。

 

链接分析:

    core/pcm_native.c文件中.mmap = snd_pcm_mmap调用snd_pcm_mmap_data(substream, file, area);进一步调用substream->ops->mmap(substream, area);根据soc/pxa/pxa3xx-pcm.c文件中.mmap = pxa3xx_pcm_mmap,可知dma_mmap_writecombine(, ,runtime->dma_addr,);函数被调用。上一章分析过soc/pxa/pxa3xx-pcm.c文件中pxa3xx_pcm_hw_params()函数会创建链表,根据dma_buff_phys = runtime->dma_addr;和dma_desc->dsadr = dma_buff_phys;可知runtime->dma_addr为dma内存端地址,且此地址由alsa库层传递进来。又根据dma_desc->dtadr = prtd->params->dev_addr和soc/pxa/pxa3xx-ac97.c文件中.dev_addr = __PREG(PCDR),可知dma外设端地址为ac97控制器中fifo读写寄存器PCDR。至此,第一条链路建立完毕:FIFO通过DMA和内存交互。待续1

    ac97接口或者i2s或者pcm接口可以将cpu和codec(wm9714/alc5620/alc5621)连接起来,配置好格式:pcm接口必须配置采样率、采样位数、通道数和传送格式;i2s接口必须配置采样率、采样位数、通道数和对齐方式;

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值