主题中讨论的其他器件: 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 中断处理不正确、或者根本没有请求。
请帮助,我在这里的想法已经过时了:)