此外、每当我尝试将时钟(McASP1_ACLKR (位时钟)- P9_42)与示波器连接时、我都看不到任何脉冲。 似乎该引脚上没有适当的时钟信号。 我该如何进行调试和修复?
有什么想法吗?
Parag
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
我尝试将 I2S 麦克风(https://www.adafruit.com/product/3421)与 BeagleBone Black 连接。 我遵循了文章(http://www.ti.com/lit/an/sprac97/sprac97.pdf)、并按照文章中的建议更新了器件树和 Linux 内核。
器件树的 I2S 组件(用于麦克风)作为 dtsi 包含在主器件树源代码中。 dtsi 的内容如下所示
&am33xx_pinmux {
mcasp1_pins: mcasp1_pins {
pinctrl-single,pins = <
/* sink must enable receivers */
0x1a0 0x23
/* P9_42 mcasp1_aclkx - bit clock */
0x1a4 0x23
/* P9_27 mcasp1_fsx - frame sync */
0x1a8 0x23
/* P9_41 mcasp1_axr0 - i2s input */
>;
};
};
&mcasp1 {
#sound-dai-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&mcasp1_pins>;
status = "okay";
op-mode = <0>;
tdm-slots = <2>;
num-serializer = <4>;
serial-dir = < /* 1 TX 2 RX 0 unused */
2 0 0 0
>;
rx-num-evt = <1>;
tx-num-evt = <1>;
};
/ {
pcm5102a: pcm5102a {
#sound-dai-cells = <0>;
compatible = "ti,pcm5102a";
status = "okay";
};
sound1: sound@1 {
compatible = "simple-audio-card";
simple-audio-card,name = "PCM5102a";
simple-audio-card,format = "i2s";
simple-audio-card,bitclock-master = <&sound1_master>;
simple-audio-card,frame-master = <&sound1_master>;
simple-audio-card,bitclock-inversion;
simple-audio-card,cpu {
sound-dai = <&mcasp1>;
};
sound1_master: simple-audio-card,codec {
#sound-dai-cells = <0>;
sound-dai = <&pcm5102a>;
clocks = <&mcasp1_fck>;
clock-names = "mclk";
};
};
};
I have also compiled the kernel with a new driver pcm5102 as suggested in the document. Finally, I see the driver listed in the output of the arecord command.
root@arm:/sys/class/gpio# arecord -l **** List of CAPTURE Hardware Devices **** card 0: PCM5102a [PCM5102a], device 0: davinci-mcasp.0-pcm5102a-hifi pcm5102a-hifi-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0
但是、每当我尝试录制音频时、我都无法获取任何音频数据。 音频文件是格式、但无论我尝试录制音频的时间长短、文件大小始终为44字节。 显然、文件中没有数据。
使用 arecord 命令进行记录时出现错误、如下所示
arecord -d 10 -Dhw:0,0 -f dat audio.wav Recording WAVE 'audio.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo arecord: pcm_read:2032: read error: Input/output error
此外、每当我尝试将时钟(McASP1_ACLKR (位时钟)- P9_42)与示波器连接时、我都看不到任何脉冲。 似乎该引脚上没有适当的时钟信号。 我该如何进行调试和修复?
有什么想法吗?
Parag
您好 Parag、
[引用用户="Parag Sharma"] McASP1_PINS:McASP1_PINS{pinctrl-single、PINS =</* SINK 必须启用接收器*/ 0x1a0 0x23 // P9_42 McASP1_aclkx -位时钟*/[/QUERE]
[报价用户="Parag Sharma"]简单音频卡,位时钟主设备=<&sound1_MASTER>;[/quot]
[引用 user="Parag Sharma"] sound1_master:simple-audio-card、codec{#sound-di-cells =<0>;sound-dai =<&pcm5102a>;时钟=<&McASP1_fck>;时钟名称="MCLK";};
[引用 USER="Parag Sharma]此外、每当我尝试使用示波器连接时钟(McASP1_ACLKR (位时钟)- P9_42)时、我都看不到任何脉冲。 似乎该引脚上没有适当的时钟信号。 我可以做什么来进行调试和修复?
您将 AM335x McASP1模块配置为从器件、因此需要提供从 PCM5102A 虚拟编解码器到 AM335x 引脚 B12 McASP0_ACLKR.McASP1_aclkx 的位时钟
在用户空间(使用 devmem2或 omapconf 工具)中检查寄存器 CONF_McASP0_ACLKR/0x44E109A0中的值是否正确。
您提供的链路的位时钟方案为:
PCM1864 ADC --> C5517 DSP J29_Pin3 --> AM335x McASP1 P9_42/B12
您的位时钟方案应该是:
Adafruit MIC -> AM335x McASP1 P9_42/B12
另请检查以下指针以了解音频调试指南:
processors.wiki.ti.com/.../Linux_Core_Audio_User's_Guide
此致、
帕维尔
您好、Pavel
我根据 processors.wiki.ti.com/.../Sitara_Linux_Audio_DAC_Example 配置了 McASP0和器件树
我看到 BCLK 和 Fsclk 上的时钟输出和数据正在传输中,但是
当我尝试在捕获模式下配置它时、位时钟存在、但它不是所需的形式、并且 fssclk 完全丢失。
请建议解决方案。
// *版权所有(C) 2012 Texas Instruments Incorporated - http://www.ti.com/ * 此程序是免费软件;您可以根据 免费软件基金会*发布的 GNU 通用公共许可证版本2的条款重新分发和/或修改*。 // /dts-v1/; #include "am33xx.dtsi" #include "am335x-bone-common.dtsi" &ldo3_reg{ reguler-min-microvolt =<1800000>; reguler-max-microvolt =<3300000>; reguler-always on; }; &mmc1{ VMMC-supply =< 1800000> };pinam3300000> ;}pinmuxx pinmuxx pinmuxx: McASP0_Pins{ pinctrl-single、Pins =< 0x190 (PIN_OUTPUT_PULLUP | MUX_MODE0)/* McASP0_aclkx */ 0x194 (PIN_OUTPLOW_PULLUP | MUX_MODE0)/* McASP0_FSX* / 0x198 (PIN_INPUT_PULLUP | M0* =默认 值);"McASP0_MODE0 = 0 = 0;</INCINCINCINCINCINCINCning_MODE0 = 0;*= 0 =";McASP0 ="INCINCning_MODE0 = 0 = 0 =";McASP0 =";McASP0 =" /* mcsp_iis_mode */ tdm-slots =<2>; /* 16串行器*/ serial-dir =</* 0:非活动、1:TX、2:Rx */ 2 1 0 >; TX-num-evt =<32>; rx-num-evt =<32>; }; /{ pcm5102a ={pcmti、pcm5102a;}音频兼容:pcmti ={pcmta-cmti、p5102a} TI、模型="TI PCM5102A"; TI、音频编解码器=<&pcm5102a>; TI、McASP-控制器=<&McASP0>; TI、编解码器时钟速率=<24000000>; }; };
您好、Pavel 我使用的是 ti-processor-sdk-linux-am335x-evm-04.03.00.05
我要使用的 DTS 是
将其从更改为
Sound{compatible ="ti、pcm5102a-evm-audio";
更改为
Sound{compatible ="简单音频卡";
原因:
sh-3.2# arecord -l arecord:device_list:268:找不到声卡... sh-3.2# aplay -l aplay:device_list:268:找不到声卡...
使用 pcm5102A-EVM-AUDIO 可以实现这一点
SH-3.2# aplay -l ****回放硬件设备列表**** 卡0:PCM5102A [TI PCM5102A],设备0:捕获 pcm5102a-hifi-0[] 子设备:1/1 子设备#0 :子设备#0 sh-3.2# arecord -l ****捕获硬件设备列表** 卡0:PCM5102A 子设备#0: TI Sub设备#PCM5102a] 子器件#0
使用 pcm5102A-EVM-AUDIO 可以为播放提供两个时钟
和 BCLK
但记录显示:
(arecord -DHW:0、0 -f dat asdd.wav)
FSCLK 的示例
BCLK
[引用用户="AJINKYA Prabhu"]
将其从更改为
Sound{compatible ="ti、pcm5102a-evm-audio";
更改为
Sound{compatible ="简单音频卡";
原因:
sh-3.2# arecord -l arecord:device_list:268:找不到声卡... sh-3.2# aplay -l aplay:device_list:268:找不到声卡...
[/报价]
这是因为您只更改了"兼容"、但这还不够。 如 sprac97.pdf 中所述、您应该在 DTS 中更改更多内容
4.2.3.1简单音频卡
PCM5102A 器件驱动程序和 AM335X 处理器之间的管道过程通过简单音频卡器件树绑定在器件树中完成。 有关可用的简单音频卡设备树属性的更多信息、请参阅以下内核文档:
Documentation/devicetree/bindings/sound/simple-card.txt
pcm5102a:pcm5102a{
#sound-di-cells =<0>;
兼容="ti、pcm5102a";
状态="正常";
};
Sound1:声音@1{
兼容="简单音频卡";
simple-audio-card、name ="PCM5102a";
simple-audio-card、format ="I2S";
simple-audio-card、bitclock-master =<&sound1_master>;
simple-audio-card、frame-master =<&sound1_master>;
简单音频卡、位时钟反转;
简单音频卡、CPU{
Sound-Dai =<&McASP1>;
};
Sound1_MASTER:简单音频卡、编解码器{
#sound-di-cells =<0>;
sound-dai =<&pcm5102a>;
时钟=<&McASP1_Fck>;
时钟名称="MCLK";
};
[引用用户="AJINKYA Prabhu"]
使用 pcm5102A-EVM-AUDIO 可以实现这一点
SH-3.2# aplay -l ****回放硬件设备列表**** 卡0:PCM5102A [TI PCM5102A],设备0:捕获 pcm5102a-hifi-0[] 子设备:1/1 子设备#0 :子设备#0 sh-3.2# arecord -l ****捕获硬件设备列表** 卡0:PCM5102A 子设备#0: TI Sub设备#PCM5102a] 子器件#0
使用 pcm5102A-EVM-AUDIO 可以为播放提供两个时钟
[/报价]
谁应该提供 FS 和 BCLK 信号? 是 AM335x 器件吗?
请提供 arecords 和 aplay 命令的完整控制台日志。 还提供 McASP 引脚多路复用寄存器和 McASP 模块寄存器的寄存器转储。
对此,
帕维尔
这是文档中提到的更改之后的器件树:
// *版权所有(C) 2012 Texas Instruments Incorporated - "="">www.ti.com/.../a> * 此程序是免费软件;您可以根据 免费软件基金会*发布的 GNU 通用公共许可证版本2的条款重新分发和/或修改*。 // /dts-v1/; #include "am33xx.dtsi" #include "am335x-bone-common.dtsi" &ldo3_reg{ 稳压器最小微伏=<1800000>; 稳压器最大值微伏=<3300000>; 电脑控制器常开; }; &mmc1{ VMMC-SUPPLY =<&ldo3_reg>; }; &am33xx_pinmux{ McASP1_PINS:McASP1_PINS{ pinctrl-single、pins =< /*接收器必须启用接收器*/ 0x1a0 0x23 /* P9_42 McASP1_aclkx -位时钟* 0x1a4 0x23 /* P9_27 McASP1_FSX -帧同步* 0x1a8 0x23 /* P9_41 McASP1_axr0 - I2S 输入*/ >; }; }; &McASP1{ #sound-di-cells =<0>; pinctrl-names ="default"; pinctrl-0 =<&McASP1_PINs>; 状态="正常"; OP-MODE =<0>; TDM-SLOTS =<2>; num-serializer =<4>; serial-dir =</* 1 TX 2 RX 0未使用*/ 2 0 0 0 0 >; Rx-num-evt =<1>; tx-num-evt =<1>; }; /{ pcm5102a:pcm5102a{ #sound-di-cells =<0>; 兼容="ti、pcm5102a"; 状态="正常"; }; Sound1:声音@1{ 兼容="简单音频卡"; simple-audio-card、name ="PCM5102a"; simple-audio-card、format ="I2S"; simple-audio-card、bitclock-master =<&sound1_master>; simple-audio-card、frame-master =<&sound1_master>; 简单音频卡、位时钟反转; 简单音频卡、CPU{ Sound-Dai =<&McASP1>; }; Sound1_MASTER:简单音频卡、编解码器{ #sound-di-cells =<0>; sound-dai =<&pcm5102a>; 时钟=<&McASP1_Fck>; 时钟名称="MCLK"; }; }; };
aplay 和 arecord 的控制台日志:
SH-3.2# aplay aj.wav 播放波'aj.wav':有符号16位小端字节序、速率48000Hz、立体声 [36.741784] DaVincia-McASP 4803c000.McASP:流具有比在 McASP 中启用的通道更多的通道(2) [36.755080] DaVinciASP 4803c3c000.McASP:ASHW:无法 设置为13000:params :无法安装 params:1361:params: RW_interleaved 格式:S16_LE 子格式:STD SAMPLE_BITS:16 FRAME_BITS:32 个通道 :2速率:48000 周期_时间:125000 周期_大小:6000 周期_字节:24000 周期:4 缓冲区_时间:50000 缓冲区_大小:24000 缓冲区_字节:96000 周期_时间:0
SH-3.2# arecord -DHW:0、0 -d 10 -f dat asd.wav 录制波'asd.wav:有符号16位小端序、速率48000 Hz、立体声 arecord:PCM_Read:2096:读取错误:输入/输出错误
SH-3.2# arecord -l ****捕获硬件设备列表**** 卡0:PCM5102a [PCM5102A],设备0:Davinci-McAP.0-pcm5102a-hifi pcm5102a-hiF-0 [] 子设备:1/1 子设备#0:子设备#0
SH-3.2# aplay -l ****回放硬件设备列表**** 卡0:PCM5102a [PCM5102A],设备0:Davinci-McAP.0-pcm5102a-hifi pcm5102a-hiF-0 [] 子设备:1/1 子设备#0:子设备#0
1) 1)如何解决输入/输出误差?
当10秒内没有数据从硬件流向 ALSA 时、就会发生 arecord I/O 错误。 发生这种情况的一个可能原因是主器件(在您的情况下为 AM335x 器件)未提供 FSYNC 和 BCLK。 如果没有它们、外部编解码器不会移动 axr0引脚上的任何数据。 我建议您确保 AM335x 能够正确地提供 BCLK/FYSNC。
另请参见以下文档:
www.ti.com/.../sprac10.pdf
6.7音频录制期间出现输入/输出错误
2)您建议进行哪些更改以使 AM335x 成为主设备?
Sound1:声音@1{
兼容="简单音频卡";
simple-audio-card、name ="PCM5102a";
simple-audio-card、format ="I2S";
simple-audio-card、bitclock-master =<&sound1_master>;
simple-audio-card、frame-master =<&sound1_master>;
简单音频卡、位时钟反转;
Sound1_MASTER:简单音频卡、CPU{
Sound-Dai =<&McASP1>;
};
简单音频卡、编解码器{
#sound-di-cells =<0>;
sound-dai =<&pcm5102a>;
时钟=<&McASP1_Fck>;
时钟名称="MCLK";
};
};
你好,Pavel,
输入/输出误差似乎消失了、但我在 BCLK 上仍然没有获得正确的时钟、在 LRCLK 上没有时钟
以及当我尝试执行该操作时
omapconf show McASP1
它为我提供了:
硬件平台: 通用 AM33XX (平展器件树) AM3358 ES2.1 GP 器件(未知性能 ZCZ 封装(1.0GHz) )错误:I2C 读取失败 错误:I2C 读取失败 错误:I2C 读取失败错误 :TPS65217C ES1.2 错误:I2C 读取失败 未知音频 IC
您能为此建议一个解决方案吗?
[引用用户="AJINKYA Prabhu"]
命令时的输出
arecord -d 10 -DHW:0、0 -f dat audio.wav
文件是创建的、但记录的持续时间不是很长、我想、由于-d 10会告诉它记录10秒
但这会有什么问题呢?
[/报价]
使用此命令、您可以设置48kHz 帧同步和1.536MHz 位时钟。 您是否观察到这些频率(48kHz FS 和1.536MHz BCLK)?
请提供 McASP1引脚多路复用值和 McASP1寄存器的寄存器转储。 您可以使用 devmem2工具或 omapconf 工具从用户空间获取这些文件。 有关更多信息、请参阅以下指针:
3个 McASP 寄存器设置
[引用用户="AJINKYA Prabhu"]
输入/输出误差似乎消失了、但我在 BCLK 上仍然没有获得正确的时钟、在 LRCLK 上没有时钟
以及当我尝试执行该操作时
omapconf show McASP1
它为我提供了:
硬件平台: 通用 AM33XX (平展器件树) AM3358 ES2.1 GP 器件(未知性能 ZCZ 封装(1.0GHz) )错误:I2C 读取失败 错误:I2C 读取失败 错误:I2C 读取失败错误 :TPS65217C ES1.2 错误:I2C 读取失败 未知音频 IC
您能为此建议一个解决方案吗?
[/报价]
实际上、我建议您仅在用户空间(devmem2或 omapconf)中转储控制模块 McASP1 Pinmux 寄存器。 而 McASP1模块寄存器应在内核内部使用 printk 进行检查。 有关更多信息、请参阅以下 e2e 线程:
此致、
帕维尔
1)这是我运行时得到的结果
devmem2 0x4803c000
0x4803c000用于 McASP 1
/dev/mem 已打开。[3042.065890]未处理故障:非线性蚀刻上的外部中止(0 [3042.074752] PgD = dc54c000 [3042.077470][b6f38000]*PgD=9a108831、*Pte=4803c303、*ppte=480333bca38000 映射地址处的内存。 [3042.085144]审核:type=1701审核(1522080492.952:4):auid=4294967295 uid=0 gi7 总线错误(转储内核)
2)我应该在内核中打印什么?
3)我应该在 ,CPU 节点内添加一个时钟节点吗?
am33xx_pinmux{(am33xx_pinmux)} McASP1_PINS:McASP1_PINS{ pinctrl-single、pins =< /*接收器必须启用接收器*/ 0x1a0 0x23 /* P9_42 McASP1_aclkx -位时钟* 0x1a4 0x23 /* P9_27 McASP1_FSX -帧同步* 0x1a8 0x23 /* P9_41 McASP1_axr0 - I2S 输入*/ >; }; }; &McASP1{ #sound-di-cells =<0>; pinctrl-names ="default"; pinctrl-0 =<&McASP1_PINs>; 状态="正常"; OP-MODE =<0>; TDM-SLOTS =<2>; num-serializer =<4>; serial-dir =</* 1 TX 2 RX 0未使用*/ 2 0 0 0 0 >; Rx-num-evt =<1>; tx-num-evt =<1>; }; /{ pcm5102a:pcm5102a{ #sound-di-cells =<0>; 兼容="ti、pcm5102a"; 状态="正常"; }; Sound1:声音@1{ 兼容="简单音频卡"; simple-audio-card、name ="PCM5102a"; simple-audio-card、format ="I2S"; simple-audio-card、bitclock-master =<&sound1_master>; simple-audio-card、frame-master =<&sound1_master>; 简单音频卡、位时钟反转; Sound1_MASTER:简单音频卡、CPU{ Sound-Dai =<&McASP1>; }; 简单音频卡、编解码器{ #sound-di-cells =<0>; sound-dai =<&pcm5102a>; 时钟=<&McASP1_Fck>; 时钟名称="MCLK"; }; }; };
[引用用户="AJINKYA Prabhu"]
1)这是我运行时得到的结果
devmem2 0x4803c000
0x4803c000用于 McASP 1
/dev/mem 已打开。[3042.065890]未处理故障:非线性蚀刻上的外部中止(0 [3042.074752] PgD = dc54c000 [3042.077470][b6f38000]*PgD=9a108831、*Pte=4803c303、*ppte=480333bca38000 映射地址处的内存。 [3042.085144]审核:type=1701审核(1522080492.952:4):auid=4294967295 uid=0 gi7 总线错误(转储内核)
[/报价]
这是预期的。 请勿在用户空间中转储 McASP1模块寄存器。
[引用 user="AJINKYA Prabhu"]2)内核中应该打印什么?
McASP1模块寄存器、起始地址为0x4803C000
[引用 user="AJINKYA Prabhu"]3)我是否应该在 CPU 节点内添加时钟节点?
我在 DTS 提取中看不到 CPU 节点、因此我无法进行注释。
[引用 user="AJINKYA Prabhu"]我想知道从哪里可以获取 McASP1模块寄存器? 在哪个文件中以及我 应该在哪里编辑 printk 语句以获取 McASP1模块寄存器的值?
在 McASP 驱动程序的 McASP_START_Rx ()函数末尾转储 McASP1寄存器:
Linux 内核/sound/soc/co/Davinci/Davinci-McAP.c
有关详细信息、请参阅以下 e2e 线程:
[引用用户="AJINKYA Prabhu"]
此外,
/sys/kernel/debug
为空,缺少 pinctrl 目录。
[/报价]
您不需要/sys/kernel/debug. 只需使用 devmem2读取 McASP1控制模块 Pinmux 寄存器并提供结果。
这里是我用于转储寄存器值的代码
printk ("0x%x\n"、McASP->base);
printk ("McASP_START_Rx:DaVinci_MCASP_TXFMCTL_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_TXFMCTL_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_RXFMCTL_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_RXFMCTL_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_TXFMT_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_TXFMT_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_RXFMT_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_RXFMT_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_ACLKXCTL_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_ACLKXCTL_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_ACLKRCTL_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_ACLKRCTL_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_Pdir_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_Pdir_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_RXMASK_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_RXMASK_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_TXMASK_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_TXMASK_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_RXTDM_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_RXTDM_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_TXTDM_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_TXTDM_REG));
下面是上述代码的输出
[636.578439] 0xfa03c000
[636.5808080807] McASP_START_Rx:DaVinci_MCASP_TXFMCTL_REG:0x13
[636.586399] McASP_START_Rx:DaVinci_MCASP_RXFMCTL_REG:0x113
[636.592079] McASP_START_Rx:DaVinci_MCASP_TXFMT_REG:0x10074
[636.59759] McASP_START_Rx:DaVinci_MCASP_RXFMT_REG:0x18070
[636.603439] McASP_START_Rx:DaVinci_MCASP_ACLKXCTL_REG:0x180060
[636.609467] McASP_START_Rx:DaVinci_MCASP_ACLKRCTL_REG:0x20
[636.615147] McASP_START_Rx:DaVinci_MCASP_Pdir_REG:bb4000000
[636.621001] McASP_START_Rx:DaVinci_MCASP_RXMASK_REG:0xFFFF
[636.626680] McASP_START_Rx:DaVinci_MCASP_TXMASK_REG:0xFFFF
[636.632360] McASP_START_Rx:DaVinci_MCASP_RXTDM_REG:0x3
[636.637691] McASP_START_Rx:DaVinci_MCASP_TXTDM_REG:0x0
你好,Pavel,
我打印了这些值
printk ("0x%x\n"、McASP->base);
printk ("McASP_START_Rx:DaVinci_MCASP_TXFMCTL_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_TXFMCTL_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_RXFMCTL_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_RXFMCTL_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_TXFMT_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_TXFMT_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_RXFMT_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_RXFMT_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_ACLKXCTL_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_ACLKXCTL_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_ACLKRCTL_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_ACLKRCTL_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_Pdir_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_Pdir_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_RXMASK_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_RXMASK_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_TXMASK_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_TXMASK_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_RXTDM_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_RXTDM_REG));
printk ("McASP_START_Rx:DaVinci_MCASP_TXTDM_REG:0x%x \n"、McASP_GET_reg (McASP、DaVinci_MCASP_TXTDM_REG));
转储
[6.578439] 0xfa03c000 [636.5808080807] McASP_START_Rx:Davinci_MCBSP_TXFMCTL_REG:0x13 [636.586399] McASP_START_Rx:DaVinci_MCBSP_RXFMCTR_REG:0x6367_RXCCEST_RXCCADDR_64_START :0x6367_CCADDR_RX64_RXCC_RXCC_RXCC_RXCCTR_RXCC_RXCC_R_RXCC_RX64_RXCC_R_RXCC_RXCC_R_RX64_RXCC_RXCC_RXCC_R_RXCC_RX64_R_RXCC_RXCC_R_RXCC_R_RXCC_R_RXCC_R64_R_R_RXCC_RXCC_RX64_R_RXCC_RXCC_RXCC_RXCC_RXCC_RXCC_R_RX64_R_RXCC_RXCC_R_RXCC_RXCC_R_RX64_R_RXCC_RXCC_RXCC
[引用 USER="Parag Sharma]*引脚104 (44e109a0.0)00000003 pinctrl-single
引脚105 (44e109a4.0) 00000003 pinctrl 单路
引脚106 (44e109a8.0) 00000023 pinctrl-single *
[/报价]
[引用 user="Parag Sharma"]&am33xx_pinmux{
McASP1_PINS:McASP1_PINS{
pinctrl-single、pins =<
/*接收器必须启用接收器*/
AM33XX_IOPAD (0x9a0、PIN_OUTPUT 下拉| MUX_MODE3)/* P9_42 McASP1_aclkx -位时钟*
AM33XX_IOPAD (0x9a4、PIN_OUTPUT 下拉| MUX_MODE3)/* P9_27 McASP1_FSX -帧同步*
AM33XX_IOPAD (0x9a8、PIN_INPUT_PULLDOWN | MUX_MODE3)/* P9_41 McASP1_axr0 - I2S 输入*
>;[/报价]
请将引脚 McASP1_aclkx 和 McASP1_FSX 从输出更改为输入/输出、因为我们有重定时要求。 如需更多信息、请查看 AM335x TRM、第22.2.3节 McASP 引脚列表
[引用用户="Parag Sharma"[54.532208] DaVinci_MCASP_GBLCTLX_REG:0x1f [/引用]
这看起来不好。 您能否检查您的流程是否通过设置 McASP_START_Rx()函数中的 TX 信号?
静态空 McASP_START_Rx (结构 DaVinci_McASP * McASP)
{
/*开始时钟*/
McASP_SET_ctl_reg (McASP、DaVinci_MCASP_GBLCTLR_REG、RXHCLKRST);
McASP_SET_ctl_reg (McASP、DaVinci_MCASP_GBLCTLR_REG、RXCLKRST);
/*
*当 Async =0时、发送和接收部分运行
*与发送时钟和帧同步同步。 我们需要制造的
*确保在开始接收时已启用 TX 信号。
*
if (McASP_IS 同步(McASP)){
printk ("启用 TX 信号\n");
McASP_SET_ctl_reg (McASP、DaVinci_MCASP_GBLCTLX_REG、TXHCLKRST);
McASP_SET_ctl_reg (McASP、DaVinci_MCASP_GBLCTLX_REG、TXCLKRST);
}
我在 McASP_Is_synchronous 函数中添加了一些日志
静态 bool McASP_IS 同步(结构 DaVinci_McASP * McASP)
{
u32 rxfmctl = McASP_GET_reg (McASP、DaVinci_MCASP_RXFMCTL_REG);
printk ("Davinci_MCBSP_RXFMCTL_REG:0x%x\n"、rxfmctl);
u32 aclkxctl = McASP_GET_reg (McASP、DaVinci_MCASP_ACLKXCTL_REG);
printk ("Davinci_MCBSP_ACLKXCTL_REG:0x%x\n"、aclkxctl);
printk ("TX_异 步0x%x\n"、TX_异 步);
printk ("aclkxctl & TX_异 步0x%x\n"、aclkxctl & TX_异 步);
printk ("AFSRE 0x%x\n"、AFE");
printk ("输出:0x%x\n"、!(aclkxctl 和 TX_异 步)&& rxfmctl 和 AFESR);
return!(aclkxctl & TX_异 步)&& rxfmctl & AFE;
}
日志显示为
[103.785057] DaVinci_MCBSP_RXFMCTL_REG:0x113
[103.789342] DaVinci_MCBSP_ACLKXCTL_REG:0x18006f
[103.793975] TX_异 步0x40
[103.796601] aclkxctl & TX_异 步0x40
[103.800187] AFE0x2
[103.802463] 输出:0x0
问题出在哪里? 为什么该函数返回0而不是1?
Parag、
DTS 文件似乎是正确的、您在这里有"op-mode =<0>;"。 0表示 I2S 模式(ASYNC=0)、1表示 DIT/SPDIF 模式(ASYNC=1)。 您需要调试 Davinci-McASP/c 文件以查看是否以及为何选择 DIR/SPDIF 模式(而不是 I2S)。
McASP1{
OP-MODE =<0>;
}
静态结构 DaVinci_McASP_pdata * DaVinci_McASP_Set_pdata_fin_of (结构平台设备*开发)
{
RET = of _property_read_u32 (np、"op-mode"、&val);
如果(RET >= 0)
pdata -> op_mode = val;
}
静态 int Davinci_McASP_HW_params (struct snd_PCM_Substream *子流、struct snd_PCM_HW_params * params、struct snd_soc_dai * cpu_dai)
{
IF (McASP->op_mode =Davinci_MCASP_DIT_MODE)
RET = McASP_DIT_HW_param (McASP、params_rate (params));
其他
RET = McASP_I2S_HW_param (McASP、子流->流、通道);
}
静态 int McASP_I2S_HW_param (struct Davinci_McASP * McASP、int 流、int 通道)
{
McASP_CLR_BITS (McASP、DaVinci_MCASP_ACLKXCTL_REG、TX_异 步);//异 步= 0
}
/* S/PDIF */
静态 int mcasp_dit_hw_param (struct davinci_mcasp * mcasp、unsigned int rate)
{
/*设置 TX 时钟控件:div = 1,内部*/
McASP_SET_BITS (McASP、DaVinci_MCASP_ACLKXCTL_REG、ACLKXE | TX_异 步);//异 步= 1
}
您好、Pavel、
感谢你的帮助。
我最后尝试了 TI SDK 附带的 Linux 内核以及 TI SDK 本身提供的 RFS、大多数事情(包括位时钟、数据输出等)似乎在第一个实例中正常工作。
但是 、我在 P9_27 (McASP1_FSX)的帧同步上仍然看不到正确的信号。 我只能看到、该引脚上的信号在开始录制时从高电平变为低电平、但不会改变。 无波。 假设我使用的是单个通道(arecord 命令中的通道数默认为1)、是否符合预期。
甚至当我尝试使用进行记录时
arecord -f dat -DHW:1、0 -c 2 /tmp/audio.wav
我仍然在 P9_27上看不到适当的高电平低电平信号。 保持平坦。
此外、录制的文件还包含一些数据、但记录的内容是什么。 它完全无声。
Parag、
根据我的理解、McASP1_aclkx 引脚上具有正确和预期的时钟信号。 但您在 McASP1_FSX 引脚上看不到正确和预期的信号。
请将此 McASP1_FSX 引脚从输出更改为输入/输出。 我们有重定时要求。 如需更多信息、请查看 AM335x TRM、第22.2.3节 McASP 引脚列表
您可能会观察到不需要的 FSX 信号、因为它还取决于从 McASP1_axr0引脚接收到的数据。 请参阅时序图:
AM335x 数据表:图7-86。 McASP 输入时序
AM335x TRM:22.3.3.1.2内部集成音频(I2S)格式
"我看到的是、该引脚上的信号在开始录制时从高电平变为低电平、但不会改变。 无波。"
如果在 McASP1_axr0上没有接收到正确的音频数据位、则该 FSX 信号将保持低电平。 您需要接收所有音频数据位直到 LSB。
您的麦克风是否仅需要这两个时钟信号(位时钟和帧同步)? 由于音频编解码器还需要一个 MCLK、而 MCLK 可由 AHCLKX 引脚提供。
此致、
帕维尔
Pavel、
使 framesync 引脚输入/输出意味着什么?
当前配置是
AM33XX_IOPAD (0x9a4、 PIN_OUTPUT 下拉| MUX_MODE3)/* P9_27 McASP1_FSX -帧同步*
如果将其修改为
AM33XX_IOPAD (0x9a4、 PIN_INPUT_PULLUGD | PIN_OUTPUT_PULLUGD | MUX_MODE3)
我还意识到我也得到了正确的电炸锅。 我在示波器上没有看到下面的写入频率:(。 我得到的 framesync freq 为46kz (对于单声道声音、即 c = 1)
使用以下命令:arecord -fdat -DHW:1、0 -c 1 -d 100 /tmp/audio.wav
通道数= 2时、频率在46khz 时仍然保持不变。 我认为这是不对的。 c = 1时的频率不应为48kz、c = 2时的频率不应为96kHz?
然而,记录的内容似乎全部是垃圾:(
另一个有趣的现象是、即使没有进行记录、数据引脚上记录的信号也是方波。 当我开始使用 arecord 进行录制时、信号会显示信号中的一些微小变化、但它们似乎与周围实际发出的声音不符。
[引用 user="Parag Sharma"]使 framesync 引脚输入/输出意味着什么?
这些信号(aclkx、FSX)也用作重定时或同步数据的输入。 关联的 CONF_ _ _RXACTIVE 对于这些信号、必须设置为1以使能返回模块的输入。 还建议在每个信号上串联一个33欧姆电阻(靠近处理器)、以避免信号反射。
[引用用户="Parag Sharma"]
当前配置是
AM33XX_IOPAD (0x9a4、 PIN_OUTPUT 下拉| MUX_MODE3)/* P9_27 McASP1_FSX -帧同步*
如果将其修改为
AM33XX_IOPAD (0x9a4、 PIN_INPUT_PULLUGD | PIN_OUTPUT_PULLUGD | MUX_MODE3)
[/报价]
AM33XX_IOPAD (0x9a4、 PIN_INPUT 下拉| MUX_MODE3)
然后检查 RXACTIVE 位是否设置为1。 请参阅 AM335x TRM 第9.2.2节"焊盘控制寄存器"
[引用 user="Parag Sharma"]此外,我刚刚意识到我也获得了正确的框架锁。
如果您从 AM335x McASP 获得了正确的位时钟和帧同步输出、那么您应该重点关注外部麦克风的配置、似乎此麦克风不能正常工作、因此不能在 AXR 引脚上提供正确的音频数据。 您应该与外部麦克风文档和支持团队合作。
您还可以将 AM335x McASP AXR 配置为输出、以用于测试目的。 您可以使用示波器探测音频数据线和时钟、以查看 AM335x McASP 驱动程序是否正常工作。 然后由外部麦克风提供正确的音频数据。
此致、
帕维尔