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

Posted chocolate2018

tags:

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

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

7.3 HDMI音频
7.3.1介绍
HDMI音频在视频的HDMI概述一章中有介绍。更多细节请参见HDMI音频。
7.4索尼/飞利浦数字接口(S/PDIF)
7.4.1介绍
索尼/飞利浦数字接口(S/PDIF)音频模块是一个立体声收发器,允许处理器接收和传输数字音频。S/PDIF收发器允许同时处理S/PDIF通道状态(CS)和用户(U)数据。频率测量块允许S/PDIF RX部分从传入S/PDIF流派生接收时钟。
7.4.1.1 S / PDIF概述
下图为S/PDIF接口框图。

7.4.1.2硬件概述
S/PDIF由两部分组成:
•S/PDIF接收器从每个S/PDIF帧提取音频数据,并将数据放入S/PDIF Rx左和右FIFOs中。通道状态和用户位也从每个帧中提取并放在相应的寄存器中。
S/PDIF接收机提供了一个旁路选项,直接将S/PDIF输入信号传输到S/PDIF发射机。
对于S/PDIF发射机,音频数据由处理器通过SPDIFTxLeft和SPDIFTxRight寄存器提供。通道状态位是通过相应的寄存器提供的。S/PDIF发射机以双相标记格式(IEC958)生成S/PDIF输出位流,包括音频数据、通道状态和用户位。
在S/PDIF发射机中,IEC958双相位流在S/PDIF发射时钟的两端产生。S/PDIF发送时钟由S/PDIF内部时钟分配器产生,源来自S/PDIF块外部。
S/PDIF接收器可以从S/PDIF流中恢复S/PDIF Rx时钟。图30显示了S/PDIF收发器的时钟结构。
7.4.1.3软件概述
S/PDIF驱动程序设计在ALSA片上系统(ASoC)层下。S/PDIF的ASoC驱动程序为Tx提供一个播放设备,为Rx提供一个捕获设备。播放输出音频格式可以是线性PCM数据或16位、20位和24位音频的压缩数据。允许的采样比特率为44.1,48或32 KHz。捕获输入音频格式可以是线性的。PCM数据或压缩24位数据,允许的采样比特率为16至96 KHz。驱动程序为PCM和压缩数据传输提供相同的接口。
7.4.1.4 ASoC层
ASoC层将嵌入式平台的音频驱动程序划分为可重用的独立层。ASoC将音频驱动程序分为编解码驱动程序、机器层、DAI(数字音频接口)层和平台层。Linux内核文档在Linux / documentation /sound/alsa/soc中对这些层有一些简明的描述。对于S/PDIF驱动,我们能够重用平台层(imx-pcm-dma.c),它是ssi立体声编解码器驱动程序使用的,也是通用的虚拟编解码器驱动程序,用于DAI链接创建而没有真正的编解码器。
7.4.2 S/PDIF Tx驱动
S/PDIF Tx驱动支持以下特性。
•32、44.1和48 KHz采样率。
•带符号的16位和24位小Endian样本格式。由于S/PDIF SDMA特性,24位输出示例文件必须在每帧的每个通道中有32位。只有24个lsdb是有效的。
•在ALSA子系统中,支持的格式定义为S16_LE和S24_LE。
•立体声播放。
•通过iecset或amixer查询信息。
设备ID可以通过使用’aplay -l’工具来确定,列出播放音频设备。
例如:

root@ ~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: imxspdif [imx-spdif], device 0: S/PDIF PCM snd-soc-dummy-dai-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0

•ALSA实用程序为用户空间提供了一个操作和使用ALSA驱动程序的通用方法

#aplay -Dplughw:0,0 audio.wav

• “iecset”实用程序提供了一个设置或转储IEC958状态位的通用方法。
#iecset -c 0
7.4.2.1驱动程序设计
在S/PDIF回放之前,配置、中断、时钟和通道寄存器被初始化。在S/PDIF播放过程中,通道状态位是固定的。DMA和中断被启用。S/PDIF在左、右通道分别有16个TX样本FIFOs。当两个fifo都为空时,如果启用了空中断,则会生成一个空中断。如果在20.8μs(1/48000)内未重新填充数据,则会生成欠载运行中断。如果每次只为每个通道填充16个样本fifo,则可以避免溢出。如果使能自动重同步功能,硬件会检查左右FIFO是否同步,如果不同步,则将右侧FIFO的填充指针设置为与左侧FIFO的填充指针相等,并产生中断。
7.4.2.2提供的用户界面
除了普通的PCM操作接口外,S/PDIF发射机驱动程序为用户提供了一个ALSA混音控制接口。它为用户提供了将S/PDIF通道状态码写入驱动程序的接口,以便它们可以在S/PDIF流中发送。该接口的输入参数为IEC958数字音频结构,如下图所示,只使用status成员:

struct snd_aes_iec958 
unsigned char status[24]; /* AES/IEC958 channel status bits */
unsigned char subcode[147]; /* AES/IEC958 subcode bits */
unsigned char pad; /* nothing */
unsigned char dig_subframe[4]; /* AES/IEC958 subframe bits */
;

7.4.3 S/PDIF Rx驱动程序
S/PDIF Rx驱动程序支持以下特性:
•16、32、44.1、48、64和96 KHz的接收采样率
•有符号24位小端样例格式。由于S/PDIF SDMA特性,PCM记录帧中的每个通道位长度为32位,只有24个lsb有效
在ALSA子系统中,支持的格式定义为S24_LE。
•立体声记录。
•设备ID可以通过使用’arecord -l’来确定,列出记录设备。
例如:

root@ ~$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: cs42888audio [cs42888-audio], device 0: HiFi CS42888-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: imxspdif [imx-spdif], device 0: S/PDIF PCM snd-soc-dummy-dai-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0

•ALSA实用程序为用户空间提供了一个操作和使用ALSA驱动程序的通用方法。

#arecord -Dplughw:1,0" -c 2 -r 44100 -f S24_LE record.wav

“iecset”实用程序提供了一个设置或转储IEC958状态位的通用方法。
#iecset -c 1
7.4.3.1驱动程序设计
在驱动程序从S/PDIF接收器FIFO读取数据帧之前,它必须等待内部DPLL被锁定。利用高速系统时钟,内部DPLL可以从输入位流中提取位时钟(高级脉冲)。当这个内部DPLL被锁定时,PhaseConfig Register的LOCK位被设置,驱动程序配置中断、时钟和SDMA通道。
之后,驱动程序可以同时接收音频数据、通道状态、用户位和有效位。
对于信道状态接收,在两个寄存器中总共接收48个信道状态位。当用户应用程序发出请求时,驱动程序读取它们。
对于用户位接收,用户通道接收有两种模式:CD和非CD。模式由USyncMode (CDText_Control寄存器的第1位)决定。用户可以调用声音控制接口来设置模式(见表82),但无论模式是什么,驱动程序都以相同的方式处理用户位。对于S/PDIF Rx,硬件块将Q位从用户位复制到QChannel寄存器,并将用户位放入UChannel寄存器。驱动程序为U位和Q位分配两个队列缓冲区。U位队列缓冲区的大小是96x2字节,Q位队列缓冲区的大小是12x2字节,队列缓冲区在U/Q Full, Err和Sync中断处理程序中填充。这意味着当S/PDIF驱动器正在读取新的U/Q比特时,用户可以获得先前的就绪U/Q位。
对于有效的比特接收,S/PDIF Rx硬件块在接收时触发中断并设置中断状态。为用户提供了一个声音控制接口来获取这个有效位的状态。
7.4.3.2提供用户界面
S/PDIF Rx驱动程序为用户应用程序提供如下表所示的接口。

  1. mode列显示接口属性:r(读)或w(写)
  2. 接口的声音控制类型由snd_ctl_xxx() alsa-lib函数调用
    用户应用程序可以按照图31中的程序流使用S/PDIF Rx驱动程序。首先,应用程序打开S/PDIF Rx PCM设备,等待DPLL锁定输入位流,并获取输入采样率。如果需要设置USyncMode,请在读取U/Q位前设置。接下来,设置硬件参数,包括通道数,格式和从驱动程序获得的捕获采样率。然后,调用prepare和trigger启动S/PDIF Rx流读取。最后,调用read函数获取数据。在读取过程中,应用程序可以从驱动读取U/Q位和通道状态,并有效的无效位。

    7.4.4源代码结构
    下表列出了驱动程序的源文件。

    7.4.4.1菜单配置选项
    该模块提供了以下Linux内核配置:
    在菜单配置中启用以下模块:
    •CONFIG_SND_IMX_SPDIF - S/PDIF驱动的配置选项:
•Device Drivers -> Sound card support -> Advanced Linux Sound Architecture -> ALSA for SoC audio support -> SoC Audio for Freescale i.MX CPUs -> SoC Audio support for i.MX boards with S/PDIF

7.4.4.2设备树绑定
参考以下文件:
• Documentation/devicetree/bindings/sound/fsl,spdif.txt
• Documentation/devicetree/bindings/sound/imx-audio-spdif.txt
7.4.4.3中断和异常
S/PDIF Tx/Rx硬件块有许多中断来指示成功、异常和事件。
驱动程序处理以下中断:
•DPLL Lock and Loss Lock-保存DPLL锁定状态;这用于获取Rx采样率
•U/Q Channel Full和overflow /underrun-将U/Q通道寄存器数据放入队列缓冲区,并更新队列缓冲区写指针
•U/Q Channel sync -保存U/Q数据准备读出的缓冲区ID
•U/Q通道错误-重置U/Q队列缓冲区
7.4.5单元测试准备
为了准备运行单元测试,执行以下操作:
•通过在PC上安装M-Audio Transit驱动程序来安装M-Audio Transit USB声卡。
•在您的PC上安装wavab工具。
7.4.5.1 Tx测试步骤
•将光线插入M-Audio传输的[line|optical]端口。
•启动wavab,按下工具栏上的录制按钮,设置录制文件名、采样率和通道号,然后录制。
•同时,在机上使用以下命令播放一个wave文件:
#aplay -D hw:[card id],[pcm id] audioXXkYYS.wav
播放结束后,在wavab中停止录制。
•在wavab中播放录制的WAV文件进行检查。
7.4.5.2 Rx测试步骤
•将光线插入M-Audio传输的[光口]
•启动wavab,打开一个测试WAV文件:audioXXkYYS.wav循环播放
•同时,在机上使用以下命令记录一个WAV文件。录制完成后,您可以在板卡或PC上的其他声卡上播放录制WAV文件。

#arecord -D hw:[card id],[pcm id] -c 2 -d 20 -r [sample rate in Hz] -f S24_LE record.wav

7.5音频混合器(AUDMIX)
7.5.1介绍
许多应用程序需要混合两个或更多的音频以获得不同的效果。两个音频流混合成一个单一的流可以用音频混合器完成。音频混合器有两个输入串行音频接口。它们由两个同步音频接口(SAI)模块驱动。每个输入串行接口以时分复用方式在其帧内携带8个音频通道。混合器将两个接口对应通道的音频样本混合成一个样本。在混合之前,可以根据配置对两个输入的音频样本进行衰减。音频混合器的输出也是一个串行音频接口。与输入接口一样,它具有相同的时分复用帧格式。这个输出被用来驱动音频编解码器的串行DAC TDM接口,也被与正常音频SAI模块的接收路径一起发送到外部引脚,由CPU进行回读。
音频混合器的输出可以从以下三种流中选择:
•串行音频输入1
•串行音频输入2
•混合音频
混音操作独立于音频采样率,但两个音频输入流必须具有相同的音频采样率和TDM帧中相同数量的信道,才能进行混音。
7.5.2框图
下图显示了Audio Mixer块的高级视图。

7.5.3硬件概述
混合器块有两个串行音频输入接口,用于两个音频流。其中一个用于正常音频,另一个用于安全音。串行音频时分复用帧可以包含8个32位采样帧。前六个样品是三个立体声DAC。
每个DAC为左右通道取两个样本。最后两个样品是额外的,以备将来使用。在音频混音应用中,两个音频输入流必须具有相同的通道数和帧率。框架格式如下图所示。

输入TDM帧从其自己的接口位时钟中的帧脉冲开始被反串行化为32位采样。每个样本通过衰减器。衰减器降低音频信号的电平。这个过程称为衰减。通过将音频采样与衰减值相乘来实现信号的衰减。衰减值定义衰减器输出端的音频信号电平。可以启用或禁用衰减。如果禁用,音频样本将在不修改的情况下传递。如果启用,则根据定义不同时间衰减值的配置进行衰减(称为衰减曲线)。
两个音频流有两个独立的衰减器。两个衰减器的输出用于混合。混合是通过添加来自两个衰减器的相应通道的样品来完成的。结果给出了混合样本值。然后量化得到所需的音频样本宽度。量化样本四舍五入形成输出样本。在量化样本的LSB上进行舍入。最后的样本然后被串行化并以相同的帧格式传输,就像具有选定位时钟的输入接口一样。
7.5.4软件概述
音频混音器驱动程序设计在ALSA片上系统(ASoC)层。AudioMixer的ASoC驱动程序为AudioMixer输入提供两个播放设备和一个捕获设备来捕获AudioMixer输出。播放音频格式为线性PCM 16位、24位或32位宽音频。采集的音频格式为线性PCM音频数据,支持16位、18位、20位、24位或32位宽。
7.5.4.1用户界面
通过使用amixer -c 工具从用户空间访问Audio Mixer接口。以下Audio Mixer控件暴露在用户空间中。



7.5.4.2源代码结构
下表列出了驱动程序的源文件。

7.5.4.3菜单配置选项
此模块提供了以下Linux内核配置:

• CONFIG_SND_IMX_AMIX - Configuration option for the Audio Mixer Driver
• Device Drivers -> Sound card support -> Advanced Linux Sound Architecture -> ALSA for SoC audio support -> SoC Audio for Freescale i.MX CPUs -> SoC Audio support for i.MX boards with AMIX

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

基于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