This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM3358:TLV320AIC3104的音频捕获失败

Guru**** 2563250 points
Other Parts Discussed in Thread: AM3358, TLV320AIC3104

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/627416/linux-am3358-audio-capture-with-tlv320aic3104-fails

器件型号:AM3358
主题中讨论的其他器件: TLV320AIC3104

工具/软件:Linux

我需要同步立体声音频输出和输入。

我在 BeagleBone Black 卡(AM3358处理器)上使用 Linux 内核4.4.3.83-ti-rt-r119、其中 TLV320AIC3104音频编解码器连接到 McASP0和 I2C2端口。 我´m 使用 snd_soc_Davinci_McASP、snd_soc_tlv320aic31x 和 snd_soc_simple_card 驱动程序而无需修改。 立体声音频回放效果很好、alsamixer 控件使用编解码器的数据表来实现完美的效果。 但是、我无法在 Linux 中获取有关用户土地应用程序的任何声音输入。 下面是我要做的:

首先、我在引导期间加载以下设备树。

//
*版权所有(C) 2012 Texas Instruments Incorporated - http://www.ti.com/
*
此程序是免费软件;您可以根据

免费软件基金会*发布的 GNU 通用公共许可证版本2的条款重新分发和/或修改*。
//
/dts-v1/;

#include "am33xx.dtsi"
#include "am335x-bone-common.dtsi"

/*#include "am33xx-overlay-edma-fix.dtsi"*
/&spi0{
status ="oke";
}

;&SPI1{
status ="oke";
};}

;&McASP1
status ="oke"{="};{"}
TDM-SLOTS =<2>;
};

// pruss:挑选一个:*//

*
/etc/modprobe.d/pruss-blacklist.conf

*黑名单 uio_pruss
*/

#include "am33xx-pruss-rproc.dtsi"

//
*/etc/modprobe.d/pruss-blacklist.conf
*
黑名单 pruss
*黑名单 pruss_intc
*黑名单 pruss_rstro *
//

*#include "am33xx_mutro_mux_pinuminu_pinos"



{#motrx pinu_pinu33xx:}pinu_pinuotruss
pinctrl-single、pins =<
0x190 0x20 /* BCLK P9.31 MUX_MODE0 (McASP0_aclkx)、INPUT_PULLDOWN *
0x194 0x20 /* WCLK P9.29 MUX_MODE0 (McASP0_FSX)、INPUT_PULLDOWN *
0x198 0x20 /* DIN P9.30 MUX_MODE0 (McASP0_axr0)、INPUT_PULLDOWN *
0x19c 0x02 // DOUT P9.28 MUX_Mode2 (McASP0_axr2)、output_pulldown */
0x1ac 0x00 //* MCLK P9.25 MUX_MODE0 (McASP0_ahclkx),output_pulldown)*/
>;
};
}

;&i2c2{
#address-cells =<1>;
#size-cells =<0>;
时钟频率=<100000 >;
状态="确定";
pinctrl-names ="默认";
pinctrl-0 =<&i2c2_pines>;//这些是在 AM335x-bone-common.dtsi、P9.19和 P9.20中定义的*

/ tlv320aic3104:tlv320aic3104@18{
#sound-di-cells =<0>;
兼容="ti、tlv320aic3104";
reg =<0x18>;
AVDD-SUPPLY =<&ldo2_reg>;// AM335x-bone-common.dtsi 中定义的3.3V 稳压器
IOVdd-supply =<&ldo2_reg>;
DRVDD-SUPPLY =<&ldo2_reg>;
DVDD-SUPPLY =<&ldo2_reg>;
};
}

;&McASP0{
#sound-di-cells =<0>;
status ="正常";
pinctrl-names ="默认值";
pinctrl-0 =<&M motro_sio_pines>;
op-mode =<0>; /* mcasp_iis_mode */
tdm-slots =<2>;
num-serializer =<16>;
serial-dir =</* 0:非活动、1:TX、2:Rx *
2 0 1 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0
0 >;

TX-num-evt =<1>;
Rx-num-evt =<1>;

/*中断=<80>、<81>;*/
/*中断名称="TX"、"Rx";*

///* DMA =<EDMA 8 2>、*
/* <&EDMA 92>;*
//* dma-names ="TX"、"Rx";*/
};

&ldo3_reg{
reguler-min-microvolt =<1800000>;
reguler-max-microvolt =<1800000>;
reguler-always-on-on;
};

&mmc1{
VMmcc-supply =<&vmmcmmctr-max-volt =<&mctrl =<&mctrl




=<&trlcsd>
;默认
值="mmccsrand_decond-nations";rand_define-control-rand_decond-rands ="mmcus/incrand_define-control-rand_defintrl

};

&CPU0_opp_table{
//
*所有 PG 2.0芯片可能不支持1GHz,但早期的一些
芯
片* BeagleBone Black 具有 PG 2.0芯片,可保证*支持1GHz OPP,因此在该电路板上启用 PG 2.0。
*/
oppnitro@1000000000{
opp-support-HW =<0x06 0x0100>;
};
};

/{
型号="TI AM335x BeagleBone Green";
兼容="ti、AM335x-bone-green"、"ti、AM335x-bone-blone-blue"、"ti、AM335x-bone-bone-bone-bone-bone"、"amxx"

CLK_McASP0_FIXED:CLK_McASP0_FIXED{
#clock-cells =<0>;
兼容="固定时钟";
时钟频率=<24576000>;
};

clk_McASP0:CLK_McASP0{
#clock-cells =<0>;
兼容="GPIO-GATE -时钟";
时钟=<&clk_McASP0_FIXED>;
ENABLE-GPIO =<&GPIO1 27 GPIO_ACTIVE_HIGH>;//在 GPIO1_27上启用 BeagleBone Black Clk *}
;

声音{
兼容="简单音频卡";
simple-audio-card、name ="Motro Audio";
simple-audio-card、小工具=
"耳机"、"耳机插孔"、
"线路"、"插孔线路";
简单音频卡,路由=
"耳机插孔"、"HPLOUT"、
"耳机插孔"、"HPROUT"、
"LINE1L"、"插孔中的线路"、
"LINE1R"、"插孔中的线路";
simple-audio-card、format ="DSP_b";
simple-audio-card、bitclock-master =<&sound_master>;
simple-audio-card、frame-master =<&sound_master>;
简单音频卡、位时钟反转;

简单音频卡、CPU{
Sound-Dai =<&McASP0>;
};

sound_master:simple-audio-card、codec{
#sound-di-cells =<0>;
sound-dai =<&tlv320aic3104>;
时钟=<&clk_McASP0>;
时钟名称="MCLK";
};
};
};

然后、我加载模块:

modprobe snd_soc_tlv320aic3x                            
modprobe snd_soc_Davinci_McASP                          
modprobe snd_soc_simple_card                            

然后、我使用`alsactl restore`加载 alsamixer 值。 以下是 asound.state 文件的内容(由`alsactl store`创建):

Station.Audio{
CONTL.1{
iface 混音器
名称"PCM 播放音量"
值0 127.
值1 127.
注释{
访问"重新写入"
键入 integer
计数2
范围"0 - 127"
DBmin -6350
DBmax 0
dbvalue.0
dbvalue.1 0
}
}
control.2{
iface 混音器
名称"左行混频器 PGAR 旁路音量"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
control.3{
iface 混音器
名称"左行混频器 DACR1播放音量"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
control.4{
iface 混音器
名称"右侧线路混合器 PGAL 旁路音量"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
Control.5{
iface 混音器
名称"右侧线路混合器 DACL1播放音量"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
control.6{
iface 混音器
名称"左 HP 混频器 PGAR 旁路音量"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
CONTL.7{
iface 混音器
名称"Left HP Mixer DACR1 Playback Volume"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
control.8{
iface 混音器
名称"右侧 HP 混频器 PGAL 旁路音量"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
control.9{
iface 混音器
名称"右侧 HP 混音器 DACL1播放音量"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
control.10{
iface 混音器
名称"Lleft HPCom Mixer PGAR Bypass Volume"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
control.11{
iface 混音器
名称"Lleft HPCom Mixer DACR1 Playback Volume"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
control.12{
iface 混音器
名称"右 HPCOM 混频器 PGAL 旁路音量"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
control.13{
iface 混音器
名称"Right HPCom Mixer DACL1 Playback Volume"
值0
注释{
访问"重新写入"
键入 integer
计数1
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
}
}
control.14{
iface 混音器
名称"线路 PGA 旁路音量"
值0
值1 0
注释{
访问"重新写入"
键入 integer
计数2
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
dbvalue.1-9999999
}
}
control.15{
iface 混音器
名称"线路 DAC 回放音量"
值0 118
值1 118
注释{
访问"重新写入"
键入 integer
计数2
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0
dbvalue.1 0
}
}
control.16{
iface 混音器
名称"HP PGA 旁路音量"
值0
值1 0
注释{
访问"重新写入"
键入 integer
计数2
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
dbvalue.1-9999999
}
}
control.17{
iface 混音器
名称"HP DAC 播放音量"
值0 118
值1 118
注释{
访问"重新写入"
键入 integer
计数2
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0
dbvalue.1 0
}
}
Control.18{
iface 混音器
名称'HPCOM PGA 旁路音量'
值0
值1 0
注释{
访问"重新写入"
键入 integer
计数2
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
dbvalue.1-9999999
}
}
control.19{
iface 混音器
名称'HPCOM DAC 回放音量'
值0
值1 0
注释{
访问"重新写入"
键入 integer
计数2
范围"0 - 118"
DBmin -9999999
DBmax 0
dbvalue.0-9999999
dbvalue.1-9999999
}
}
control.20{
iface 混音器
名称"线路播放开关"
值0为 true
Value.1 true
注释{
访问"重新写入"
键入 Boolean
计数2
}
}
control.21{
iface 混音器
名称“HP 回放开关”
值0为 true
Value.1 true
注释{
访问"重新写入"
键入 Boolean
计数2
}
}
control.22{
iface 混音器
名称'HPCOM 回放开关'
值0 false
Value.1错误
注释{
访问"重新写入"
键入 Boolean
计数2
}
}
control.23{
iface 混音器
名称'AGC 开关'
值0 false
Value.1错误
注释{
访问"重新写入"
键入 Boolean
计数2
}
}
control.24{
iface 混音器
名称"左 AGC 目标级别"
值'-5.5dB'
注释{
访问"重新写入"
枚举类型
计数1
项目0 '-5.5dB'
项目1 '-8dB'
项目2 '-10dB'
项目3 '-12dB'
项目4 '-14dB'
项目5 '-17dB'
项目6 '-20dB'
item.7'-24dB'
}
}
control.25{
iface 混音器
名称"右 AGC 目标级别"
值'-5.5dB'
注释{
访问"重新写入"
枚举类型
计数1
项目0 '-5.5dB'
项目1 '-8dB'
项目2 '-10dB'
项目3 '-12dB'
项目4 '-14dB'
项目5 '-17dB'
项目6 '-20dB'
item.7'-24dB'
}
}
control.26{
iface 混音器
名称"左 AGC 攻击时间"
值"8ms"
注释{
访问"重新写入"
枚举类型
计数1
项目0 "8ms"
项目1'11ms'
项目2 "16ms"
item.3'20ms'
}
}
control.27{
iface 混音器
名称"正确的 AGC 攻击时间"
值"8ms"
注释{
访问"重新写入"
枚举类型
计数1
项目0 "8ms"
项目1'11ms'
项目2 "16ms"
item.3'20ms'
}
}
control.28{
iface 混音器
名称"左 AGC 衰减时间"
值'100ms'
注释{
访问"重新写入"
枚举类型
计数1
项目0 "100ms"
项目1'200ms'
项目2 "400ms"
item.3'500ms'
}
}
control.29{
iface 混音器
名称"右 AGC 衰减时间"
值'100ms'
注释{
访问"重新写入"
枚举类型
计数1
项目0 "100ms"
项目1'200ms'
项目2 "400ms"
item.3'500ms'
}
}
control.30{
iface 混音器
名称"强调开关"
值0 false
Value.1错误
注释{
访问"重新写入"
键入 Boolean
计数2
}
}
control.31{
iface 混音器
名称"PGA 捕获音量"
值0 60.
值1 60.
注释{
访问"重新写入"
键入 integer
计数2
范围"0 - 119"
DBmin 0
DBmax 5950
dbvalue.0 3000
dbvalue.1 3000
}
}
control.32{
iface 混音器
名称'PGA 捕捉开关'
值0为 true
Value.1 true
注释{
访问"重新写入"
键入 Boolean
计数2
}
}
control.33{
iface 混音器
名称"ADC HPF 切断"
Value.0被禁用
Value.1被禁用
注释{
访问"重新写入"
枚举类型
计数2
item.0被禁用
项目1 "0.0045xFs"
项目2 "0.0125xFs"
item.3'0.025xFs'
}
}
control.34{
iface 混音器
名称"输出驱动器加电时间"
值"0us"
注释{
访问"重新写入"
枚举类型
计数1
项目0 "0us"
项目1'10us'
第2项"100us"
项目3 "1ms"
项目4 "10ms"
项目5 "50ms"
项目6 "100ms"
项目7 "200ms"
项目8"400ms"
项目9 "800ms"
项目10 "2s"
第11项"4s"
}
}
control.35{
iface 混音器
名称"输出驱动器斜升步进"
值"0ms"
注释{
访问"重新写入"
枚举类型
计数1
项目0 "0ms"
项目1'1ms'
项目2'2ms'
item.3'4ms'
}
}
control.36{
iface 混音器
名称"左侧 DAC 多路复用器"
值 DAC_L1
注释{
访问"重新写入"
枚举类型
计数1
项目0 DAC_L1
项目1 DAC_L3
item.2 DAC_L2
}
}
control.37{
iface 混音器
名称"左 HPCOM 多路复用器"
值" HPLOUT 的输出"
注释{
访问"重新写入"
枚举类型
计数1
item .0 'HPLOUT 的输出电压'
第1项"恒定 VCM"
item.2单端
}
}
control.38{
iface 混音器
名称"右侧 DAC 多路复用器"
值 DAC_R1
注释{
访问"重新写入"
枚举类型
计数1
项目0 DAC_R1
项目1 DAC_R3
item.2 DAC_R2
}
}
control.39{
iface 混音器
名称'Right HPCom Mux'
值"高输出电压"
注释{
访问"重新写入"
枚举类型
计数1
itu.0 '高级输出的电势'
第1项"恒定 VCM"
项目2单端
项目3 " HPLCOM 的监听"
第4项"外部反馈"
}
}
control.40{
iface 混音器
名称"左侧线路1L 多路复用器"
单端值
注释{
访问"重新写入"
枚举类型
计数1
item.0单端
item.1差分
}
}
control.41{
iface 混音器
名称"左侧行1R 多路复用器"
单端值
注释{
访问"重新写入"
枚举类型
计数1
item.0单端
item.1差分
}
}
control.42{
iface 混音器
名称"右侧线路1L 多路复用器"
单端值
注释{
访问"重新写入"
枚举类型
计数1
item.0单端
item.1差分
}
}
control.43{
iface 混音器
名称"右行1R 多路复用器"
单端值
注释{
访问"重新写入"
枚举类型
计数1
item.0单端
item.1差分
}
}
control.44{
iface 混音器
名称"左 PGA 混频器线路1L 开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.45{
iface 混音器
名称"左 PGA 混频器线路1R 开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
Control.46{
iface 混音器
名称"左 PGA 混频器 Mic2L 开关"
值为 true
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.47{
iface 混音器
名称"左 PGA 混频器 Mic2R 开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.48{
iface 混音器
名称"右 PGA 混频器线路1R 开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.49{
iface 混音器
名称"右侧 PGA 混频器线路1L 开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.50{
iface 混音器
名称"右侧 PGA 混频器 Mic2L 开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.51{
iface 混音器
将"右侧 PGA 混频器 Mic2R 开关"命名为
值为 true
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.52{
iface 混音器
名称"左行混频器 PGAL 旁路开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.53{
iface 混音器
名称"左线路混合器 DACL1开关"
值为 true
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.54{
iface 混音器
名称"左行混频器 PGAR 旁路开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.55{
iface 混音器
名称"左行混频器 DACR1开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.56{
iface 混音器
名称"右侧线路混合器 PGAL 旁路开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.57{
iface 混音器
名称"右侧线路混合器 DACL1开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.58{
iface 混音器
名称"右侧线路混合器 PGAR 旁路开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.59{
iface 混音器
名称"右侧线路混合器 DACR1开关"
值为 true
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.60{
iface 混音器
名称"Left HP Mixer PGAL Bypass Switch"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.61{
iface 混音器
名称"Left HP Mixer DACL1 Switch"
值为 true
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.62{
iface 混音器
名称"Left HP Mixer PGAR Bypass Switch"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.63{
iface 混音器
名称"Left HP Mixer DACR1 Switch"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.64{
iface 混音器
名称"右侧 HP 混频器 PGAL 旁路开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
Control.65{
iface 混音器
将"右侧 HP 混频器 DACL1开关"命名为
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.66{
iface 混音器
名称"右侧 HP 混频器 PGAR 旁路开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.67{
iface 混音器
将"右侧 HP 混频器 DACR1开关"命名为
值为 true
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.68{
iface 混音器
名称"Lleft HPCOM Mixer PGAL Bypass Switch"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.69{
iface 混音器
名称"左 HPCOM 混频器 DACL1开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.70{
iface 混音器
名称"左 HPCOM 混频器 PGAR 旁路开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.71{
iface 混音器
名称"左 HPCOM 混频器 DACR1开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.72{
iface 混音器
名称"右 HPCOM 混频器 PGAL 旁路开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.73{
iface 混音器
名称"右 HPCOM 混频器 DACL1开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.74{
iface 混音器
名称"右 HPCOM 混频器 PGAR 旁路开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}
control.75{
iface 混音器
名称"右 HPCOM 混频器 DACR1开关"
值 false
注释{
访问"重新写入"
键入 Boolean
计数1
}
}

我没有 asound.conf 文件、如果有任何内容、我不知道该文件中应该包含什么内容。

此时、使用`aplay -c2 --test sine`播放立体声流效果很好。

尝试捕获音频输入会导致 I/O 错误。 下面是我正在使用的录制程序的代码:

#include 
#include 
#include 

int main (int argc、char * argv[])
{
int i;
int err;
char *缓冲区;
int buffer_frames = 128;
unsigned int rate = 44100;
snd_pcm_t * capture_handle;
snd_pcm_hw_params_t * hw_params;
snd_pcm_format_t format = snd_pcm_gor_t (s&r_gpcm_gor_1

)(s_dr_gor_gor_gor_1)、snd_snarg_gore_cams (s&r_gor_gor_gore_pcm_1)
fprintf (stderr、"无法打开音频设备%s (%s)\n"、
argv[1]、
snd_strerror (err));
退出(1);
}

fprintf (stdout、"音频接口已打开\n");

如果((err = snd_pcm_hw_params_malloc (&hw_params))< 0){
fprintf (stderr、"无法分配硬件参数结构(%s)\n"、
snd_strerror (err));
退出(1);
}

fprintf (stdout、"hw_params allocated\n");

if ((err = snd_pcm_hw_params_any (captate_handle、hw_params))< 0){
fprintf (stderr、"无法初始化硬件参数结构(%s)\n"、
snd_strerror (err));
退出(1);
}

fprintf (stdout、"hw_params initialized\n");

if ((err = snd_PCM_hw_params_set_access (captate_handle、hw_params、snd_PCM_access_rw_interleaved))< 0){
fprintf (stderr、"无法设置访问类型(%s)\n"、
snd_strerror (err));
退出(1);
}

fprintf (stdout、"hw_params access setted\n");

if ((err = snd_PCM_hw_params_set_format (capting_handle、hw_params、format))< 0){
fprintf (stderr、"无法设置样本格式(%s)\n"、
snd_strerror (err));
退出(1);
}

fprintf (stdout、"hw_params 格式已设置\n");

if ((err = snd_pcm_hw_params_set_rate_near (capte_handle、hw_params、&rate、0))< 0){
fprintf (stderr、"无法设置采样率(%s)\n"、
snd_strerror (err));
退出(1);
}

fprintf (stdout、"hw_params rate setted\n");

if ((err = snd_PCM_hw_params_set_channels (capting_handle、hw_params、2))< 0){
fprintf (stderr、"无法设置通道计数(%s)\n"、
snd_strerror (err));
退出(1);
}

fprintf (stdout、"hw_params channels seted\n");

if ((err = snd_PCM_hw_params (captate_handle、hw_params))< 0){
fprintf (stderr、"无法设置参数(%s)\n"、
snd_strerror (err));
退出(1);
}

fprintf (stdout、"hw_params setted\n");

snd_pcm_hw_params_free (hw_params);

fprintf (stdout、 "hw_params freed\n");

if ((err = snd_PCM_Prepare (captate_handle))< 0){
fprintf (stderr、"无法准备使用的音频接口(%s)\n"、
snd_strerror (err));
退出(1);
}

fprintf (stdout、"准备的音频接口\n");

buffer = malloc (128 * snd_PCM_format_width (format)/ 8 * 2);

fprintf (stdout、"分配的缓冲器\n");

for (i = 0;i < 10;++i){
if ((err = snd_PCM_READI (capture_handle、buffer、buffer_frames))!= buffer_frames){
fprintf (stderr、"从音频接口读取失败(%s)\n"、
ERR、snd_strerror (err));
退出(1);
}
fprintf (stdout、"读取%d 完成\n"、i);

int j;
对于(j = 0;j < buffer_frames;j++){
fprintf (stdout、"%i "、buffer[j]);
}
fprintf (stdout、"\n");
}

free (buffer);

fprintf (stdout、"buffer freed\n");

SND_PCM_Close (CAPTURE_Handle);
fprintf (stdout、"音频接口已关闭\n");

退出(0);
}

当我运行此程序时,snd_PCM_READI ()函数返回错误代码-5 (I/O 错误)。

当程序运行时、我可以在逻辑分析仪上正确地看到所有 MCASP 和 I2C 信号、因此这似乎不是硬件或编解码器配置错误、而是 McASP 驱动程序错误或错误配置?

我还尝试了一个使用 portaudio Asyncronous API 的简单程序、捕获回调永远不会被触发。 arecord 还为我提供了一个 I/O 错误。

请、是否有人可以提供一些有关如何解决此问题的建议? 例如、在哪个内核模块中以及在哪个函数中处理 Rx 中断? 我认为 Rx 中断处理不正确、或者根本没有请求。

请帮助,我在这里的想法已经过时了:)