Audio音频子系统

模块功能介绍

img_01.png

图表 8‑1 音频子系统硬件模块

1. audio有10个DMA模块, 其中DMA0-DMA4功能是从RAM搬移数据到fifo,DMA5-DMA9功能是从fifo搬数据到RAM中,每个DMA固定连接到DBUS中的一个FIFO上。

2. 5个BAIC(Basic Audio Interface Controller),BAIC0和ICODEC(Internal CODEC)相连支持单通道录放音。

3. dmic最大支持8通道,支持语音唤醒。

4. spdif(Sony Philips Digital Interconnect Format)。

5. DBUS可以把RFIFO和TFIFO动态连接在一起形成通路,所以通过DBUS的配置可以把DMA和其他子模块连接成数据流通路。

模块名支持协议支持通道数功能
BAIC0+ICODEC
1通道(限制于ICODEC) 录音/放音
BAIC1 I2S/LEFT/RIGHT/PCMA/PCMB/DSPA/DSPB 1/2通道 录音/放音
BAIC2 TDM1A/TDM1B/TDM2A/TDM2B/I2S7+1/LEFT7+1/RIGHT7+1 2/4/8通道 录音
BAIC3 TDM1A/TDM1B/TDM2A/TDM2B/I2S7+1/LEFT7+1/RIGHT7+1 2/4/8通道 放音
BAIC4 I2S/LEFT/RIGHT/PCMA/PCMB/DSPA/DSPB 1/2通道 录音/放音
DMIC PulseDensityModulation 1/2/4/6/8通道 录音
SPDIF BMC(BiphaseMarkCode) 2通道 录音/放音

软硬件模块对应关系

img_02.png

图表 8-2 音频子系统软硬件模块对应关系

数据通路输出端软硬件对应关系:

硬件名称软件名称
BAIC0_PLAYBACK LO0_MUX
BAIC1_PLAYBACK LO1_MUX
BAIC2_PLAYBACK LO2_MUX
BAIC3_PLAYBACK LO3_MUX
BAIC4_PLAYBACK LO4_MUX
DMA5 LO5_MUX
DMA6 LO6_MUX
DMA7 LO7_MUX
DMA8 LO8_MUX
DMA9 LO9_MUX
MIX_IN0 LO10_MUX
MIX_IN1 LO11_MUX

数据通路输⼊端软硬件对应关系:

硬件名称软件名称
DMIC_CAPTURE LI0
SPDIF_CAPTURE LI1
BAIC0_CAPTURE LI2
BAIC1_CAPTURE LI3
BAIC2_CAPTURE LI4
BAIC3_CAPTURE LI5
BAIC4_CAPTURE LI6
MIX0_OUT LI7
DMA0 LI8
DMA1 LI9
DMA2 LI10
DMA3 LI11
DMA4 L12

驱动源码位置

audio控制器源码位置:

module_drivers/sound/soc/ingenic/as-v2/

板级源码位置:

module_drivers/sound/soc/ingenic/board/

内部codec源码位置:

module_drivers/sound/soc/ingenic/icodec/

外部codec源码位置:

module_drivers/sound/soc/ingenic/ecodec/

设备树配置

设备树所在位置

内核dts文件路径:

kernel内核(version <= 5.10)dts文件路径:

module_drivers/dts-stage/x2000/x2000.dtsi

kernel内核(version > 5.10)dts文件路径:

module_driver/dts/x2000/x2000.dtsi

Audio控制器描述:

as:as {

compatible = "simple-bus";

 #address-cells = <1>;

 #size-cells = <1>;

 ranges = <>;

 as_platform: as-platform {

 compatible = "ingenic,as-platform";

 reg = <0x134d0000 0x114>, <0x134d1000 0x100>;

 reg-names = "dma", "fifo";

 ingenic,fifo-size = <4096>;

 interrupt-parent = <&core_intc>;

 interrupts = <IRQ_AUDIO>;

 ingenic,fth_quirk;

 };

 as_virtual_fe: as-virtual-fe {

 compatible = "ingenic,as-vir-fe";

 reg = <0x00000000 0x0>;

 ingenic,cap-dai-bm = <0xc>;

 ingenic,num-dais = <4>;

 };

 as_fmtcov: as-fmtcov {

 compatible = "ingenic,as-fmtcov";

 reg = <0x134d2000 0x28>;

 };

 as_fe_dsp: as-dsp {

 compatible = "ingenic,as-dsp";

 reg = <0x134d4000 0x30>;

 ingenic,li-port = <0 1 2 3 4 6 7 8 9 10 11 12>;

 ingenic,lo-port = <0 1 2 3 4 5 6 7 8 9 10 11>;

 ingenic,cap-dai-bm = <0x3e0>;

 ingenic,num-dais = <10>;

 };

 as_be_baic: as-baic {

 compatible = "ingenic,as-baic";

 reg = <0x134d5000 0x5000>;

 ingenic,num-dais = <5>;

 /* using dai-array to determine which BAIC to use */

 ingenic,dai-array = <0>, <1>, <2>, <3>, <4>;

 ingenic,dai-mode = <BAIC_3AND(BAIC_PCM_MODE, BAIC_DSP_MODE, BAIC_I2S_MODE)>,

 <BAIC_3AND(BAIC_PCM_MODE, BAIC_DSP_MODE, BAIC_I2S_MODE)>,

 <BAIC_4AND(BAIC_I2S_MODE, BAIC_TDM1_MODE, BAIC_TDM2_MODE, BAIC_NO_REPLAY)>,

 <BAIC_4AND(BAIC_I2S_MODE, BAIC_TDM1_MODE, BAIC_TDM2_MODE, BAIC_NO_RECORD)>,

 <BAIC_3AND(BAIC_PCM_MODE, BAIC_DSP_MODE, BAIC_I2S_MODE)>;

 ingenic,data-pin-num = <1>, <1>, <4>, <4>, <1>;

 ingenic,clk-split = <1>, <1>, <1>, <1>, <0>;

 ingenic,clk-rname = "div_i2s0","div_i2s0","div_i2s2","no_clk","mux_pcm";

 ingenic,clk-tname = "div_i2s1","div_i2s1","no_clk","div_i2s3","mux_pcm";

 ingenic,pcm-clk-parent = "div_i2s2";

 };

as_dmic: as-dmic {

 compatible = "ingenic,as-dmic";

 reg = <0x134da000 0x10>;

 ingenic,clk-name = "mux_dmic"

 ingenic,clk-parent = "ext";

 };

 as_aux_mixer: as-mixer {

 compatible = "ingenic,as-mixer";

 reg = <0x134dc000 0x8>;

 ingenic,num-mixers = <1>;

 };

 as_spdif: as-spdif {

 compatible = "ingenic,as-spdif";

 reg = <0x134db000 0x14>, <0x134db100 0x14>;

 reg-names = "out", "in";***

 ingenic,clk-name = "mux_spdif";

 ingenic,clk-parent = "div_i2s2";

 };

};

设备树默认配置

设备树默认编译会产生audio设备,并在module_drivers/dts-stage/x2000/halley5_v30.dts或module_drivers/dts/x2000/halley5_v30.dts下配置:

&as_be_baic {

 pinctrl-names = "default";

 pinctrl-0 = <&baic4_pd>;

};

&as_dmic {

 pinctrl-names = "default";

 pinctrl-0 = <&dmic_pc_4ch>;

};

&icodec {

 ingenic,spken-gpio = <&gpb 2 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

};

sound {

 compatible = "ingenic,x2000-sound";

 ingenic,model = "halley5_v30";

};

设备树自定义配置

用户可根据实际需求关闭audio设备,或配置ingenic,spken-gpio属性。

时钟树配置

img_03.png

时钟树配置注意事项:

1.当baic0和baic1同时录音或同时放音时,两设备必须配置相同的采样率,位宽,通道数。原因是因为baic0和baic1的录音使用同一个分频器,所以需要保持采样率的一致,baic0连接的icodec要求供应的工作时钟必须是采样率的256倍,所以baic1只能跟着baic0.

2.spdif选择父时钟尽量选择一个空闲时钟,如果和其他设备共享父时钟需要设置一个都能满足的频率(上图标红的箭头表示SDK中默认的父级时钟)。

频率的设置

由于除baic0外的其他baic1、baic2、baic3可以外接其他codec,不同的外部codec需要的Mclk和LRclk的比值不同,用户可以修改内核以下地方从而得到精准的采样率(以zebra板级文件为例)。

module_drivers/sound/soc/ingenic/boards/zebra.c

 bclk = params_rate(params) * sync_div;

 if (id == 0 || id == 1 || id == 2 ||id == 3)

 {

 /*for baic0: sysclk = 256 * sample_rate */

 sysclk = 256 * params_rate(params);

 }

 bclk_div = (sysclk + bclk - 1) / bclk;

 /* bclk div value must be even */

 if(bclk_div%2) {

 sysclk = (bclk_div+1)*bclk;

 bclk_div += 1;

 }

因为zebra板子使用的外部codec都支持Mclk/LRclk=256,所以使用同一条判断语句,用户可根据自己使用的外部codec支持的比例关系,进行单独的判断。

数据通路的设置

由于x2000的Audio是采用的模块化设计,有5个rxfifo和5个txfifo,以baic0为例,在使用时需要指定要使用哪个rxfifo以及txfifo,用户可在内核以下位置修改(以halley5为例):

module_drivers/sound/soc/ingenic/boards/halley5_v20.c

static const struct snd_soc_dapm_route audio_map[] = {

 /* Target control Source*/

 { "BAIC0 playback", NULL, "LO0_MUX" },

 { "BAIC4 playback", NULL, "LO4_MUX" },


 { "LI0", NULL, "DMIC capture" },

 { "LI2", NULL, "BAIC0 capture" },

 { "LI6", NULL, "BAIC4 capture" },

 #if 1

 { "LO0_MUX", NULL, "LI8"}, /* Speaker Playback: DMA0->LI8->BAIC0 Speaker*/

 { "LO5_MUX", NULL, "LI0"}, /* DMIC-> DMIC capture->LI0->LO6_MUX->DMA6*/

 { "LO6_MUX", NULL, "LI2"}, /* AMIC Capture: BAIC0 Capture->LI2->LO5_MUX->DMA5*/

 { "LO9_MUX", NULL, "LI6"}, /* PCMIN -> BAIC4 Capture -> LI6->LO9_MUX->DMA9*/

 { "LO4_MUX", NULL, "LI12"}, /* PCMOUT -> BAIC4 playback -> LO4_MUX->LI12->DMA4*/

 #endif

 { "LI8", NULL, "DMA0" },

 { "LI9", NULL, "DMA1" },

 { "LI10", NULL, "DMA2" },

 { "LI11", NULL, "DMA3" },

 { "LI12", NULL, "DMA4" },


 { "DMA5", NULL, "LO5_MUX"},

 { "DMA6", NULL, "LO6_MUX"},

 { "DMA7", NULL, "LO7_MUX"},

 { "DMA8", NULL, "LO8_MUX"},

 { "DMA9", NULL, "LO9_MUX"},


 { "MIX0", NULL, "LO10_MUX"},

 { "MIX0", NULL, "LO11_MUX"},

 { "LI7", NULL, "MIX0"},


 {"DMIC capture", NULL, "DMIC"},

 {"BAIC4 capture", NULL, "PCMIN"},

 {"PCMOUT", NULL, "BAIC4 playback"},

 };

用户可以仿照“#if...#endif”中的写法,连通自己使用的数据通路,建议使用下图中的数据通路。

img_04.png

内核编译配置

内核配置SND_ASOC_INGENIC,配置说明如下:

Symbol: SND_ASOC_INGENIC [=y]

Type : tristate

 Prompt: [AUDIO] ASoC support for Ingenic

 Location:

 -> Ingenic device-drivers Configurations

Defined at module_drivers/sound/soc/ingenic/Kconfig:1

Depends on: MACH_XBURST [=n] || MACH_XBURST2 [=y]

Selects: SND_SOC [=y] && SND [=y] && SOUND [=y]

Defined at module_drivers/sound/soc/ingenic/Kconfig:21 Prompt: Audio Version:

Depends on: SND_ASOC_INGENIC [=y]

Location:

-> Ingenic device-drivers Configurations

 -> [AUDIO] ASoC support for Ingenic (SND_ASOC_INGENIC [=y])

Selected by [m]:

- SND_ASOC_INGENIC [=y] && m

选择板级文件

Symbol: SND_ASOC_INGENIC_HALLEY5_V20 [=y]

Type : tristate

Defined at module_drivers/sound/soc/ingenic/Kconfig:222

Prompt: Audio support for x2000 halley5_v20 board

Depends on: <choice>

Location:

-> Ingenic device-drivers Configurations

-> [AUDIO] ASoC support for Ingenic (SND_ASOC_INGENIC [=y])

-> Ingenic Board Type Select

 -> SOC x2000 codec Type select (<choice> [=y])

Selects: SND_ASOC_INGENIC_AS_FE [=y] && SND_ASOC_INGENIC_AS_BAIC [=y] && SND_ASOC_INGENIC_ICDC_INNO [=y]

内核默认编译配置

内核默认配置audio驱动,配置界面如下:

img_05.png

img_06.png

内核自定义编译配置

用户可根据实际需求去掉该驱动的配置。

设备节点生成

驱动加载成功后生成以下节点:

/dev/snd/controlC0

/dev/snd/pcmC0D0p

/dev/snd/pcmC0D1p

/dev/snd/pcmC0D2p

/dev/snd/pcmC0D3p

/dev/snd/pcmC0D4p

/dev/snd/pcmC0D5c

/dev/snd/pcmC0D6c

/dev/snd/pcmC0D7c

/dev/snd/pcmC0D8c

/dev/snd/pcmC0D9c

/dev/snd/timer

10个pcmC0D*设备对应硬件的10个DMA设备

添加新的codec驱动

在需要添加新的codec驱动时,用户可以参考“module_drivers/sound/soc/ingenic/ecodec”下的驱动来编写自己的驱动代码,在使用的新的codec驱动代码时,需要在设备树中对应的控制下注册从属设备,例如

&i2c2 {

 status = "okay";

 clock-frequency = <100000>;

 timeout = <1000>;

 pinctrl-names = "default";

 pinctrl-0 = <&i2c2_pb>;

 ak4458: dac@0x10 {

 compatible = "asahi-kasei,ak4458";

 status = "okay";

 reg = <0x10>;

 reset-gpios = <&gpb 13 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

 mute-gpios = <&gpb 15 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

 };

 wm8594: adc@0x1a {

 compatible = "wlf,wm8594";

 status = "okay";

 reg = <0x1a>;

 reset-gpios = <&gpb 9 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

 mute-gpios = <&gpb 10 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

 pwdn-gpios = <&gpb 11 GPIO_ACTIVE_HIGH INGENIC_GPIO_NOBIAS>;

 };

 };

其中上述例子中的ak4458和wm8594就是所需要注册的外部codec。

需要在module_drivers/sound/soc/ingenic/boards/halley5_v20.c文件中添加新的codec相关内容,例如“module_drivers/sound/soc/ingenic/ecodec/wm8594.c”的如下内容:

static struct snd_soc_dai_driver wm8594_dai[] = {

 {

 .name = "wm8594-hifi",

 .id = 0,

 .playback = {

 .stream_name = "Playback",

 .channels_min = 1,

 .channels_max = 2,

 .rates = WM8594_RATES,

 .formats = WM8594_FORMATS,

 },

 .capture = {

 .stream_name = "Capture",

 .channels_min = 1,

 .channels_max = 2,

 .rates = WM8594_RATES,

 .formats = WM8594_FORMATS,

 },

 .ops = &wm8594_dai_ops,

 },

};

在kernel4.4.94版本关联新codec驱动的操作如下:

static struct snd_soc_dai_link x2000_dais[] = {

....................................................

[11] = {

 .name = "BAIC1",

 .stream_name = "BAIC1",

 .cpu_dai_name = "BAIC1",

 .codec_dai_name = "wm8594-hifi",

 .codec_name = "wm8594.2-001a",

 .ops = &baic_ops,

 .be_hw_params_fixup = NULL,

 .no_pcm = 1,

 .dpcm_capture = 1,

 .dpcm_playback = 1,

 },

......................................................

}

其中需要确保“.codec_dai_name”的内容和codec驱动中的“.name”字段内容保持一致。

而“codec_name”字段中的内容含义是“wm8594”为dts中定义的从设备的别名,“2”表示是i2c2控制器上的设备,“001a”表示的从设备地址。

在kernel5.10版本关联新codec驱动的操作如下:

SND_SOC_DAILINK_DEFS(baic1_bt,

 DAILINK_COMP_ARRAY(COMP_CPU("BAIC1")),

 DAILINK_COMP_ARRAY(COMP_CODEC(“wm8594.2-001a”, “wm8594-hifi”)));

static struct snd_soc_dai_link x2000_dais[] = {

....................................................

[13] = {

 .name = "BAIC1",

 .stream_name = "BAIC1",

 .ops = &baic_ops,

 .be_hw_params_fixup = NULL,

 .no_pcm = 1,

 .dpcm_capture = 1,

 .dpcm_playback = 1,

 SND_SOC_DAILINK_REG(baic1_bt),

 },

......................................................

}

在kernel5.10版本中新添加了许多定义dai_link相关内容的宏,用法可以参考上述例子。

另外需要注意外部codec的驱动代码中是否含有“struct snd_soc_dapm_widget”用于电源管理的widget组件,因为x2000的Audio音频子系统有10个DMA通道,这些DMA通道和baic控制器的数据连通是通过alsa的电源管理实现的,所以要保证整个电源管理的通路是完整的。

如果所使用的codec不需要电源管理,除正确执行1.4.5内容外请执行以下操作:

请配置以下文件

module_drivers/sound/soc/ingenic/boards/halley5_v20.c

以baic1为例,codec采用虚拟codec。

static const struct snd_soc_dapm_route audio_map[] = {

 /* Target control Source*/

 { "BAIC0 playback", NULL, "LO0_MUX" },

 { "BAIC1 playback", NULL, "LO1_MUX" },

 { "BAIC4 playback", NULL, "LO4_MUX" },



 { "LI0", NULL, "DMIC capture" },

 { "LI2", NULL, "BAIC0 capture" },

 { "LI6", NULL, "BAIC4 capture" },

 #if 1

 { "LO0_MUX", NULL, "LI8"}, /* Speaker Playback: DMA0->LI8->BAIC0 Speaker*/

 { "LO5_MUX", NULL, "LI0"}, /* DMIC-> DMIC capture->LI0->LO6_MUX->DMA6*/

 { "LO6_MUX", NULL, "LI2"}, /* AMIC Capture: BAIC0 Capture->LI2->LO5_MUX->DMA5*/

 { "LO9_MUX", NULL, "LI6"}, /* PCMIN -> BAIC4 Capture -> LI6->LO9_MUX->DMA9*/

 { "LO4_MUX", NULL, "LI12"}, /* PCMOUT -> BAIC4 playback -> LO4_MUX->LI12->DMA4*/

 { "LO1_MUX", NULL, "LI9"}, /* BAIC1 playback -> LO1_MUX->LI9->DMA1*/

 #endif

 { "LI8", NULL, "DMA0" },

 { "LI9", NULL, "DMA1" },

 { "LI10", NULL, "DMA2" },

 { "LI11", NULL, "DMA3" },

 { "LI12", NULL, "DMA4" },



 { "DMA5", NULL, "LO5_MUX"},

 { "DMA6", NULL, "LO6_MUX"},

 { "DMA7", NULL, "LO7_MUX"},

 { "DMA8", NULL, "LO8_MUX"},

 { "DMA9", NULL, "LO9_MUX"},



 { "MIX0", NULL, "LO10_MUX"},

 { "MIX0", NULL, "LO11_MUX"},

 { "LI7", NULL, "MIX0"},



 {"DMIC capture", NULL, "DMIC"},

 {"BAIC4 capture", NULL, "PCMIN"},

 {"PCMOUT", NULL, "BAIC4 playback"},

 {"i2s1", NULL, "BAIC1 playback"},

 };

 static const struct snd_soc_dapm_widget dapm_widgets[] = {

 SND_SOC_DAPM_INPUT("DMIC"),

 SND_SOC_DAPM_INPUT("PCMIN"),

 SND_SOC_DAPM_OUTPUT("PCMOUT"),

 SND_SOC_DAPM_OUTPUT("i2s1"),

 };

因为虚拟codec不存在电源管理使用的widget,在正确设置完数据通路后,尝试aplay放音会出现i/o错误的提示,原因时电源管理的链路不完整,导致数据无法从DMA传输到baic控制器,用户可以增加定义红色字体标注的内容,可以解决i/o错误的问题。

应用程序使用说明

asound.conf介绍

asound.conf配置文件,是alsa-lib的默认配置文件,路径在 /etc/,可以用来配置alsa库的一些附加功能。这个文件不是alsa库运行时所必须的,没有它alsa库也可以正常运行。asound.conf允许对声卡或者设备进行更高级的控制,提供访问alsa-lib中的pcm插件方法,允许你做更多的复杂的控制,比如可以把声卡组合成一个或者多声卡访问多个I/O。

在ALSA中,PCM插件扩展了PCM设备的功能和特性。插件可以自动处理诸如:命名设备、采样率转换、通道间的采样复制、写入文件、为多个输入/输出连接声卡/设备(不同步采样)、使用多通道声卡/设备等工作。

• 

1. hw插件

此插件直接与ALSA内核驱动程序通信,它是一种没有任何转换的原始通信。

通过此插件可以对pcm设备进行重命名操作。

例如:

# arecord -l

**** List of CAPTURE Hardware Devices ****

card 0: halley6 [halley6], device 0: i2s-ecodec dump_pcm_codec-0 []

 Subdevices: 1/1

 Subdevice #0: subdevice #0

card 0: halley6 [halley6], device 1: i2s-tloop dump_pcm_codec-1 []

 Subdevices: 1/1

 Subdevice #0: subdevice #0

# aplay -l

**** List of PLAYBACK Hardware Devices ****

card 0: halley6 [halley6], device 0: i2s-ecodec dump_pcm_codec-0 []

 Subdevices: 1/1

 Subdevice #0: subdevice #0

在使用arecord或者aplay进行录放音时,在指定设备时一般使用“hw:0,0”这种方法指定录放音所使用的设备,使用起来不够直观,可以通过hw插件对设备定义别名。例如:

pcm.amic {

 type hw

 card 0

 device 0

}

此例子中将“hw:0,0”进行了重命名操作,在录放音时可以使用以下方式:

# arecord -D amic-c 2 -f S16_LE -r 16000 -d 5 baic0_16000-32-1.wav

# aplay -D amic baic0_16000-32-1.wav

• 

2. slave插件

从属插件可以直接用字符串指定,也可以在一个复合配置节点内输入定义。还可以指定一些限制(如静态速率或通道数)。

例如:

pcm_slave.slave_rate48000Hz {

 pcm "hw:0,0"

 rate 48000

}

pcm.rate48000Hz {

 type plug

 slave slave_rate48000Hz

}

或者

pcm.rate48000Hz {

 type plug

 slave {

 pcm "hw:0,0"

 rate 48000

 }

}

上述例子可以理解为:定义了一个虚拟的pcm设备命名为rate48000Hz,该设备实际使用“hw:0,0”pcm设备且设定只支持48000Hz采样率。在使用rate48000Hz该pcm设备录放音时,硬件上仅支持48000采样率,也可以设置固定的格式位、宽通道数等。

• 

3. rate插件

该插件转换速率。输入和输出格式必须是线性的,常用于播放硬件不支持采样率数据位宽的音频文件。

例如:

pcm.rate_16000 {

 type rate

 slave {

pcm "hw:0,0"

 rate 16000

 format S8

 }

 }

该插件支持采样率和采样格式位宽的转换,不支持通道的转换。

• 

4. plug插件

该插件可根据要求转换通道,速率和格式,比rate插件多了通道转换的功能。

例如:

pcm.rate_48000 {

 type plug

 slave {

 pcm "hw:0,0"

 rate 16000

 format S8

 channels 1

 }

 }

• 

5. Soft Volume

此插件应用于软件音量的调整。

例如:

pcm.amic_record {

 type softvol

 slave {

 pcm "hw:0,0"

 }

 control {

 name "amic volume"

 }

 min_dB -51.0

 max_dB 30.0

}

在第一次使用 softvol 插件进行播放时才会生成对应的控件,即调音时需要先执行一次“arecord -D amic_record”(以上述定义为例),才可以通过amixer设置调整音量。

baic0+icodec录放音

• 

1. baic0+icodec录音

arecord命令录音(需要提前在驱动中设置数据通路可以参考8.4.5)

# arecord -D hw:0,6 -c 1 -f S32_LE -r 16000 -d 5 baic0_16000-32-1.wav

# arecord -D hw:0,6 -c 1 -f S16_LE -r 48000 -d 5 baic0_48000-16-1.wav

• 

2. baic0+icodec放音

aplay命令放音(需要提前在驱动中设置数据通路可以参考8.4.5)

# aplay -D hw:0,0 16000-32-1.wav

• 

3. 调整icodec录放音增益

# amixer cset name='ICODEC MICL GAIN' 31

# amixer cset name='ICODEC HPOUTL GAIN' 31

baic1录放音

• 

1. baic1录音

arecord命令录音(需要提前在驱动中设置数据通路可以参考8.4.5)

# arecord -D hw:0,7 -c 2 -f S32_LE -r 48000 -d 10 baic1_48000-32-2.wav

# arecord -D hw:0,7 -c 2 -f S16_LE -r 16000 -d 10 baic1_16000-16-2.wav

• 

2. baic1放音

aplay命令放音(需要提前在驱动中设置数据通路可以参考8.4.5)

# aplay -D hw:0,1 48000-16-2.wav

baic2录音

arecord命令录音(需要提前在驱动中设置数据通路可以参考8.4.5)

# arecord -D hw:0,8 -r 48000 -f S32_LE -c 8 -d 8 baic2_48000-32-8.wav

baic3放音

aplay命令放音(需要提前在驱动中设置数据通路可以参考8.4.5)

# aplay -D hw:0,2 48000-32-8.wav

baic4录放音

略

dmic录音

• 

1. dmic录音

dmic只能和DMA5连接成数据通路,arecord命令录音(需要提前在驱动中设置数据通路可以参考8.4.5)

# arecord -D hw:0,5 -c 2 -f S16_LE -r 16000 -d 10 dmic_16000-16-2.wav

# arecord -D hw:0,5 -c 4 -f S16_LE -r 48000 -d 10 dmic_48000-16-4.wav

# arecord -D hw:0,5 -c 6 -f S16_LE -r 16000 -d 10 dmic_16000-16-6.wav

# arecord -D hw:0,5 -c 8 -f S16_LE -r 16000 -d 10 dmic_16000-16-8.wav

• 

2. 调整dmic录音增益

# amixer cset name='DMIC Volume' 31

spdif录放音

• 

3. spdif放音

aplay命令放音(需要提前在驱动中设置数据通路可以参考8.4.5)

# aplay -D hw:0,4 48000-16-2.wav

• 

4. spdif录音

arecord命令录音(需要提前在驱动中设置数据通路可以参考8.4.5)

# arecord -D hw:0,9 -c 2 -f S16_LE -r 48000 -d 10 spdif_48000-16-2.wav

使用注意事项

1. 录音位宽为24bit时,录音数据在内存用32bit存放,有效数据存放在低24bit,使用上位机播放时需要预处理,如果使用x2000设备播放不需要预处理。

2. spdif 录音数据由音频数据和音频信息组成,播放前需要预处理,spdif具体格式请阅读PM手册。