基于linux5.15.5的IMX 参考手册 --- 15

Posted chocolate2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于linux5.15.5的IMX 参考手册 --- 15相关的知识,希望对你有一定的参考价值。

基于linux5.15.5的IMX 参考手册 — 15

第七章音频
7.1 Advanced Linux Sound Architecture (ALSA) on a Chip (ASoC) Sound
7.1.1 ALSA声音驱动程序介绍
高级Linux声音架构 (ALSA)是目前Linux系统中最流行的体系结构,它为Linux操作系统提供音频和MIDI功能。
ALSA具有以下显著特点:
•高效支持所有类型的音频接口,从消费声卡到专业多通道音频接口。
•完全模块化的声音驱动程序。
•SMP和线程安全设计。
•用户空间库(alsa-lib),以简化应用程序编程并提供更高级别的功能。
•支持老的开放声音系统(OSS) API,为大多数OSS程序提供二进制兼容。
ALSA片上系统(ASoC)层是为SoC音频设计的。ASoC层的总体项目目标是为芯片处理器上的嵌入式系统和便携式音频编解码器提供更好的ALSA支持。
ASoC层还提供以下特性:
•独立编解码器。允许在其他平台和机器上重用编解码器驱动程序。
•轻松设置CODEC和SoC之间的I2S/PCM音频接口。每个SoC接口和CODEC都将其音频接口功能注册到核心。
•动态音频电源管理(DAPM)。DAPM是一种ASoC技术,旨在最小化音频子系统的功耗,无论什么音频用例处于活动状态。DAPM保证在任何时候都保持最低的音频功率状态,并且对用户空间的音频组件完全透明。DAPM是移动设备或具有复杂音频需求的设备的理想选择。
•弹出和点击减少。按正确的顺序打开/关闭CODEC(包括使用数字静音)可以减少弹出和点击。当改变电源状态时,ASoC向编解码器发出信号。
•特定机器的控制。允许机器添加控制到声卡,例如,音量控制扬声器放大器。

ASoC基本上将嵌入式音频系统分为三个部分:
•机器驱动 – 处理任何特定于机器的控制和音频事件,例如在播放开始时打开外部放大器。
•平台驱动程序 – 包含该平台的音频DMA引擎和音频接口驱动程序(例如,I2S、AC97、PCM)。
•独立于CODEC驱动程序平台,包含音频控制、音频接口功能、CODEC DAPM定义和CODEC I/O功能。
有关ASoC的更多详细信息,请参阅Linux操作系统源代码树中的Linux内核文档,网址为Linux/documentation/sound/alsa/soc,网址为www.alsa-project.org/main/index.php/ASoC。
7.1.2 SoC声卡
目前,立体声CODEC(WM8958、WM8960、WM8962和WM8524)、7.1 CODEC(cs42888)和AM/FM CODEC(si4763)驱动器使用ASoC架构实现。

这些声卡驱动程序是独立内置的。立体声声卡支持立体声播放和捕获。7.1声卡最多支持八个声道的音频播放。启用ASRC时,7.1声卡仅支持2或6声道音频播放。AM/FM声卡支持无线电PCM捕获。
7.1.2.1立体声CODEC功能
立体声CODEC支持以下功能:
•回放和捕获的采样率为8 KHz、32 KHz、44.1 KHz、48 KHz和96 KHz
•通道:
-播放:支持双通道。
-捕获:支持两个通道。
•音频格式:
-回放:
◦ SNDRV_PCM_FMTBIT_S16_LE
◦ SNDRV_PCM_FMTBIT_S20_3LE
◦ SNDRV_PCM_FMTBIT_S24_LE
-捕获:
◦ SNDRV_PCM_FMTBIT_S16_LE
◦ SNDRV_PCM_FMTBIT_S20_3LE
◦ SNDRV_PCM_FMTBIT_S24_LE
7.1.2.2 7.1音频编解码器功能
•回放和录制的采样率:

  • 48 KHz, 96 KHz, 192 KHz
    -回放:5.512 k、8 k、11.025 k、16 k、22 k、32 k、44.1 k、48 k、64 k、88.2 k、96 k、176.4 k、192 k(启用ASRC)
    •通道:
    -播放:2、4、6、8通道
    -播放(启用ASRC):2、6个通道
    -捕获:2、4个通道
    •音频格式:
    -播放:
    ◦ SNDRV_PCM_FMTBIT_S16_LE
    ◦ SNDRV_PCM_FMTBIT_S20_3LE
    ◦ SNDRV_PCM_FMTBIT_S24_LE
    -播放(启用ASRC):
    ◦ SNDRV_PCM_FMTBIT_S16_LE
    ◦ SNDRV_PCM_FMTBIT_S24_LE
    -捕获:
    ◦ SNDRV_PCM_FMTBIT_S16_LE
    ◦ SNDRV_PCM_FMTBIT_S20_3LE
    ◦ SNDRV_PCM_FMTBIT_S24_LE
    7.1.2.3 AM/FM编解码器功能
    •支持的捕获采样率:48 KHz
    •支持的通道:
    -捕获:支持两个通道。
    •支持的音频格式:
    -捕获:SNDRV_PCM_FMTBIT_S16_LE
    7.1.2.4声卡信息

使用命令aplay-l和arecord-l可以如下列出注册的声卡信息。例如,立体声声卡注册为卡0。

root@ /$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: wm8962audio [wm8962-audio], device 0: HiFi wm8962-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0

7.1.3硬件操作
下面几节描述ASoC驱动程序的硬件操作。
7.1.3.1立体声音频编解码
立体声音频编解码器由I2C接口控制。音频数据通过DMA通道从用户数据缓冲区传输到/从SSI FIFO。DMA通道是根据音频采样位来选择的。AUDMUX用于设置SSI端口和与编解码器连接的输出端口之间的路径。编解码器工作在主模式,并提供BCLK和LRCLK。BCLK和LRCLK可根据音频采样速率进行配置。
WM8958、WM8960和WM8962 ASoC编解码驱动程序根据ASoC架构导出音频记录/播放/混合器API。
编解码器驱动程序是通用的和硬件无关的代码,它配置编解码器以提供音频捕获和播放。
它不包含特定于目标平台或机器的代码。CODEC驱动程序处理:
•CODEC DAI和PCM配置
•使用I2C的CODEC控制I/O
•混音器和音频控制
•CODEC音频操作
•DAC数字静音控制
WM8958、WM8960和WM8962编解码器在模块初始化时被注册为I2C客户端。api通过结构snd_soc_dai_ops导出到上层。
耳机的插入/移除可以通过GPIO中断信号检测到。
缺省情况下,SSI双FIFO功能处于开启状态。
7.1.3.2 7.1音频编解码器
7.1音频编解码器包括8通道DAC和4通道ADC,通过I2C接口控制。音频数据通过DMA通道从用户数据缓冲器传输到ESAI fifo。DMA通道是根据音频采样位来选择的。编解码器工作在从模式,因为ESAI提供BCLK和LRCLK。BCLK和LRCLK可根据音频采样速率进行配置。ESAI最多支持8个音频输出端口。当启用ASRC时,7.1音频编解码器通过ASRC支持2或6通道回放。在i.MX 6 Sabre ARD板上,使用带有4个音频端口的CS42888编解码器,每个端口接收两通道I2S格式(网络模式)的数据,提供8通道的播放功能。该编解码器也有2个音频输出端口连接到ESAI,提供4通道的录音功能。
编解码器驱动程序是通用的和硬件无关的代码,它配置编解码器以提供音频捕获和播放。它不包含特定于目标平台或机器的代码。编解码器驱动程序处理:
•编解码DAI和PCM配置
•使用I2C的编解码器控制I/O
•混音器和音频控制
•编解码音频操作
•DAI数字静音控制
当模块初始化时,CS42888编解码器被注册为I2C客户机。api通过结构snd_soc_dai_ops导出到上层。
7.1.3.3 AM / FM编解码器
AM/FM编解码器是一个虚拟编解码器,它只有一个连接到调谐器设备的PCM接口。音频数据通过DMA通道从用户数据缓冲区传输到或从SSI FIFO传输。DMA通道是根据音频采样位来选择的。AUDMUX用于设置SSI端口和与编解码器连接的输出端口之间的路径。编解码器工作在主模式,因为它提供BCLK和LRCLK。BCLK和LRCLK可根据音频采样速率进行配置。

7.1.4软件操作
下面几节描述ASoC驱动程序的软件操作。
7.1.4.1 ASoC驱动源结构
imx-pcm-dma.c文件由stereo ALSA SoC驱动、7.1 ALSA SoC驱动和其他CODEC驱动共享。该文件负责预分配DMA缓冲区和管理DMA通道。
立体声编解码器通过SSI接口连接到CPU。fsl_si.c为立体声ALSA SoC注册CPU DAI驱动程序,并配置片上SSI接口。wm8962.c注册立体声CODEC和hifi DAI驱动程序。立体声编解码器的直接硬件操作在wm8994.c、wm8960.c和wm8962.c中。Imx-wm8958.c、imx-wm8960.c和imx-wm8962.c是机器层代码,用于创建驱动设备和注册立体声声卡。
多通道编解码器通过ESAI接口与CPU连接。fsl_esai.c为立体声ALSA SoC注册CPU DAI驱动程序,并配置片上ESAI接口。cs42888.c注册多通道CODEC和hifi DAI驱动程序。多通道编解码器的直接硬件操作在cs42888.c中。Imx-cs42888.c是创建驱动设备和注册立体声声卡的机器层代码。
AM/FM编解码器通过SSI接口与CPU连接。fsl_si .c为立体声ALSA SoC注册CPU DAI驱动程序,并配置片上SSI接口。si476 .c注册调谐器CODEC和调谐器DAI驱动程序。对编解码器的直接硬件操作在si476 .c中。Imx-si476x.c是创建驱动设备和注册声卡的机器层代码。
7.1.4.2声卡注册
编解码器具有相同的注册序列:

  1. 编解码驱动程序注册编解码驱动程序、DAI驱动程序及其操作函数。
  2. 平台驱动程序注册PCM驱动程序、CPU DAI驱动程序及其操作功能,为PCM组件预分配缓冲区,并根据需要设置播放和捕获操作。
    3.机器层在编解码器和CPU之间创建DAI链接,注册声卡和PCM设备。
    7.1.4.3设备打开
    ALSA驱动程序的作用如下:
    •为要执行的操作分配一个空闲子流。
    •打开底层硬件设备。
    •分配硬件功能到ALSA运行时信息(运行时结构包含所有硬件、DMA和打开的子流的软件功能)。
    •配置DMA读写通道进行操作。
    •配置CPU DAI和CODEC DAI接口。
    •配置CODEC硬件。
    •触发传输。
    第一次触发后,后续的DMA读/写操作由DMA回调配置。
    7.1.4.4绑定设备树
    参考以下文件:
    • Documentation/devicetree/bindings/sound/fsl,ssi.txt
    • Documentation/devicetree/bindings/sound/fsl-sai.txt
    • Documentation/devicetree/bindings/sound/fsl,esai.txt
    • Documentation/devicetree/bindings/sound/fsl,asrc.txt
    • Documentation/devicetree/bindings/sound/wm8962.txt
    • Documentation/devicetree/bindings/sound/wm8960.txt
    • Documentation/devicetree/bindings/sound/wm8994.txt
    • Documentation/devicetree/bindings/sound/cs42xx8.txt
    • Documentation/devicetree/bindings/sound/imx-audmux.txt
    • Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt
    • Documentation/devicetree/bindings/sound/imx-audio-cs42888.txt
    • Documentation/devicetree/bindings/sound/imx-audio-si476x.txt
    7.1.4.5源代码结构
    下表显示了sound/ SoC /fsl中的立体声编解码器SoC驱动源。

    下表列出了AM/FM编解码器SoC驱动源文件。这些文件在sound/soc目录下。

    下表显示了多通道ADC SoC驱动程序的源文件。

    7.1.4.6菜单配置选项
    此模块提供了以下Linux内核配置选项。
    •SoC音频支持WM8958, WM8960和WM8962编解码器。在menuconfig中,这个选项是可用的:
-> Device Drivers
 -> Sound card support
 -> Advanced Linux Sound Architecture
 -> ALSA for SoC audio support
 -> SoC Audio for Freescale CPUs
 -> SoC Audio support for i.MX boards with wm8962 (or wm8958, wm8960)

• SoC音频支持i.MX cs42888。在menuconfig中,这个选项是可用的:

-> Device Drivers
 -> Sound card support
 -> Advanced Linux Sound Architecture
 -> ALSA for SoC audio support
 -> SoC Audio for Freescale CPUs
 -> SoC Audio support for i.MX boards with cs42888

• SoC音频支持AM/FM。在menuconfig中,这个选项是可用的:

-> Device Drivers
 -> Sound card support
 -> Advanced Linux Sound Architecture
 -> ALSA for SoC audio support
 -> SoC Audio for Freescale CPUs
 -> SoC Audio support for i.MX boards with si476x

7.2异步采样速率转换器(ASRC)
7.2.1介绍
异步采样率转换器(ASRC)将一个信号的采样率转换为一个不同采样率的信号。
ASRC支持多达10个通道的并发采样率转换。每个通道的采样率转换与一对传入和传出采样率相关。ASRC最多支持三个采样速率对同时进行采样。
7.2.1.1硬件操作
ASRC包括以下特性:
•支撑比(Fsin/Fsout)范围在1/24到8之间。
•设计在44.1 KHz, 32 KHz, 48 KHz和96 KHz之间的速率转换。
•其他输入采样率在8 KHz到100 KHz的范围内也被支持,但性能较差(详见IC规范)。
•在30 KHz到100 KHz范围内的其他输出采样率也被支持,但性能较差。
•自动调节以减缓传入和传出采样率的变化。
•允许采样时钟抖动。
•主要为实时流媒体音频使用而设计。当输入采样时钟不可用时,可用于非实时流音频的使用。
•在任何使用情况下,输出采样时钟必须被激活。
•在实时流媒体音频的情况下,输入和输出时钟都需要可用和激活。
•在非实时流音频的情况下,可以通过在ASRC接口寄存器中设置理想比率值来避免输入采样率时钟。
ASRC支持轮询、中断和DMA模式,但为了更好的性能,只在平台中使用DMA模式。ASRC支持以下DMA通道:
•外围设备到外围设备,例如:ASRC到ESAI
•内存到外设,例如:内存到ASRC
•外设到内存,例如:ASRC到内存
有关更多信息,请参阅与SoC相关的应用程序处理器文档中的ASRC章节。
7.2.2软件操作
ASRC驱动程序作为音频系统中的辅助组件,其实现依赖于平台中的用例。
目前ASRC主要用于两种场景。
•内存> ASRC >内存,ASRC由用户应用程序或ALSA插件控制。
•内存> ASRC >外设,ASRC直接由其他ALSA驱动控制。

如上图所示,ASRC流接口为用户空间提供了接口。ASRC在/dev/mxc_asrc下注册自己,并在插入模块时创建proc文件/proc/driver/asrc。Proc用于跟踪每个对的通道号。如果没有使用所有的通道对,用户可以通过proc文件调整通道数。总通道应该是10个,否则调整后的值不能正确保存。
7.2.2.1内存到ASRC到内存的顺序
•打开/dev/mxc_asrc设备
•请求ASRC pair - ASRC_REQ_PAIR
•配置ASRC对ASRC_CONIFG_PAIR
•启动ASRC - ASRC_START_CONV
•将原始音频数据(待转换)写入用户维护的输入缓冲区。用输入/输出缓冲区的长度和地址填充asrc_convert_buffer结构。驱动将根据输出缓冲区的大小将输出数据复制到用户维护的输出缓冲区地址。重复此步骤,直到转换完所有数据。-ASRC_CONVERT
•停止ASRC转换- ASRC_STOP_CONV
•释放ASRC pair - ASRC_RELEASE_PAIR
•关闭/dev/mxc_asrc设备
7.2.2.2内存到ASRC到外设的顺序
7.1音频编解码器驱动程序涉及到内存到ASRC到外设音频路径。在7.1音频声卡中,指定了一个名为“cs42888audio [cs42888-audio], device 1: HiFi-ASRC-FE (*)”的新设备,用于ASRC播放和捕获。下面的步骤显示了调用ASRC到内存到外设的流程:
•声音设备(PCM)已注册并开始启用ALSA驱动中的DMA通道
•请求ASRC pair - fsl_asrc_request_pair
•配置ASRC pair - fsl_asrc_config_pair
•使能DMA通道从内存到ASRC和从ASRC到内存
•启动DMA通道和启动ASRC转换- fsl_asrc_start_pair
•当音频数据播放完成,停止DMA通道和ASRC - fsl_asrc_stop_pair
•释放ASRC pair - fsl_asrc_release_pair
7.2.2.3源代码结构
下表列出了sound/soc/fsl中可用的源文件。
7.2.2.4菜单配置选项
菜单配置选项如下:

-> Device Drivers
 -> Sound card support
 -> Advanced Linux Sound Architecture
 -> ALSA for SoC audio support
 -> SoC Audio for Freescale i.MX CPUs
 -> Asynchronous Sample Rate Converter (ASRC) module support

那么ASRC驱动程序只能配置内置模块。
7.2.2.5绑定设备树
ASRC M2M的设备树绑定功能如下:
•compatible:兼容列表,必须包含“fsl,imx6q-asrc”。
•reg:设备寄存器集的偏移量和长度。
•interrupts:包含asrc中断。
•clocks:为clock-names中的每个条目包含一个条目。
•clock-names:必须包含“mem”、“ipg”、“asrck”和“dma”。(一般SPBA时钟使用"dma"。)
•dmas:通用的dma设备树绑定,如文档/devicetree/bindings/dma/dma.txt所述。
•dma-names:必须定义六个dma, “txa”, “rxa”, “txb”, “rxb”, “txc”, “rxc”。
•fsl,clk-map-version:不同SOC的映射关系不同。此版本号可用于指示时钟映射信息。
•fsl,clk-channel-bits:通道位信息。
ASRC P2P的设备树绑定功能如下:
•compatible:兼容列表,必须包含“fsl,imx6q-asrc-p2p”。
•fsl,p2p-rate:后端(I2S)播放和记录的有效采样速率。
•fsl,p2p-width:后端(I2S)播放和记录的有效样本宽度。
•fsl,asrc-dma-rx-events:包含三个用于ASRC Rx的SDMA事件号。
•fsl,asrc-dma-tx-events:包含三个用于ASRC Tx的SDMA事件号。
7.2.2.6编程接口(导出的API和ioctl)
ASRC导出API允许ALSA驱动程序使用ASRC服务。
下面的ASRC ioctl用于用户空间应用程序:

ASRC_REQ_PAIR:应用ASRC驱动程序中的一对。一旦分配了一对,ASRC核心时钟就被启用。
ASRC_CONFIG_PAIR:配置ASRC pair分配。User负责提供结构asrc_config中定义的参数。asrc_config中的条目列出如下:
•pair:由IOCTL分配的ASRC pair (ASRC_REQ_PAIR)。
•channel_num:通道号。
•buffer_num:输入和输出缓冲区使用所需的缓冲区数量。输入/输出缓冲区在ASRC驱动程序内部分配。
用户负责将其重新映射到用户空间。
•dma_buffer_size:输入和输出缓冲区的缓冲区大小。缓冲区大小应该以页面大小为单位。通常使用4k字节。
•input_sample_rate:输入采样率。输入采样率应在5.512k、8k、11.025k、16k、22k、32k、44.1k、48k、64k、88.2k、96k、176.4k、192k。
•output_sample_rate:输出采样率。输出采样率应在32k, 44.1k, 48k, 64k, 88.2k, 96k, 176.4 4k 192k。
•input_word_width:输入音频数据的字宽。输入数据字宽可为16位或24位。
•output_word_width:输出音频数据的字宽。输出数据字宽可为16位或24位。
•inclk:输入时钟源可以是ESAI RX时钟,SSI1 RX时钟,SSI2 RX时钟,SPDIF RX时钟,MLB_clock, ESAI TX时钟,SSI1 TX时钟,SSI2 TX时钟,SPDIF TX时钟,ASRCLK1时钟,NONE。如果使用除了NONE的时钟,用户应该确保时钟是可用的。
•outclk:输出时钟源与输入时钟源相同。
ASRC_CONVERT:根据ASRC_CONFIG_PAIR设置的参数将输入数据转换为输出数据。驱动程序将从input_buffer_vaddr中复制input_buffer_length字节数据进行转换。转换完成后,驱动根据ASRC生成的数据号填充output_buffer_length,并将output_buffer_length复制到output_buffer_vaddr。但是,在调用ASRC_CONVERT之前,User负责根据输入采样率和的比值填充output_buffer_length输出采样率。如果生成的缓冲区大小大于用户填充的output_buffer_size,驱动程序将只复制用户填充的output_buffer_size到output_buffer_vaddr。如果生成的缓冲区大小小于用户填充的output_buffer_size(差值应该小于64字节),调用ASRC_CONVERT将失败。
•input_buffer_vaddr:输入缓冲区的虚拟地址。
•output_buffer_vaddr:输出缓冲区的虚拟地址。
•input_buffer_length:输入缓冲区的长度(字节)。
•output_buffer_length:输出缓冲区长度(字节)。
ASRC_START_CONV:启动ASRC pair转换。
ASRC_STOP_CONV:停止ASRC pair转换。
ASRC_STATUS:查询ASRC pair状态。

以上是关于基于linux5.15.5的IMX 参考手册 --- 15的主要内容,如果未能解决你的问题,请参考以下文章

基于linux5.15.5的IMX 参考手册 ---20

基于linux5.15.5的IMX 参考手册 --- 7

基于linux5.15.5的IMX 参考手册 --- 19

基于linux5.15.5的IMX 参考手册 ---21

基于linux5.15.5的IMX 参考手册 --- 6

基于linux5.15.5的IMX 参考手册 --- 14