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.

[参考译文] PCMD3140:如何在 Linux 中的 PCMD3140IRTER 上配置语音活动检测 (VAD)

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1585191/pcmd3140-how-to-configure-voice-activity-detection-vad-on-pcmd3140irter-in-linux

器件型号: PCMD3140

我有一个四通道 PDM 输入编解码器 PCMD3140IRTER、我想启用语音活动检测 (VAD)。 我注意到、在您网站的驱动程序部分、驱动程序似乎不支持它: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/sound/soc / codecs/tlv320adcx140.c

通读数据表时、它引用了以下文档:
www.ti.com/.../sbaa490a.pdf
第 10 页的示例 2 开始、我尝试从中获取灵感、将 VAD 功能添加到驱动程序中

w 9C 00 00 #转至页 0
w 9C 02 81 #通过 I2C 写入 P0_R2 来唤醒器件、退出睡眠模式
D 10 #等待 16ms
w 9c 00 00 #转至第 9 页
w 9c 50 00 72 59 dc #–7dB 阈值
w 9C 00 00 #转至页 0
w 9c 3c 40 #通道 1 配置为数字麦克风 PDM 输入
W 9c 41 40 #通道 2 配置为数字麦克风 PDM 输入
W 9c 73 C0 #输入通道 1 和 2 已启用
W 9c 74 C0 # ASI 输出通道 1 和 2 已启用
W 9c 21 21 # GPIO1 作为 IRQ
W 9c 22 41 # GPO1 作为 PDM CLK
w 9c 2b 45 # GPI1 作为 Ch1/2 DMIC 数据
w 9c 20 00 # GPI1 负边沿作为 Ch1
w 9c 00 01 #转至第 1 页
W 9c 1e 00 #通道 1 作为 VAD 输入、用户模式、内部时钟
w 9c 1f 00 #在记录模式下禁用 VAD
w 9c 00 00 #转到第 0 页
W 9c 75 21 #启用 VAD

但是、我注意到了不一致的地方:脚本说要转到第 9 页、但在数据表中、我在第 9 页上找不到任何用户可访问的寄存器、并且命令中出现错误w 9c 00 00 # go to page 9 (00!= 09)。 我尝试了第 9 页和第 0 页、但这两种情况下都没有获得所需的结果。

即使使用示波器并将这些命令添加到驱动程序后、我也看不到 GPIO1 上有任何中断活动、即使我在器件树中包含了以下内容:

pcmd3140_codec: pcmd3140_codec@4e {
    compatible = "ti,tlv320adc3140";
    reg = <0x4e>;
    ti,pdm-edge-select = <1 1 1 1>;
    ti,gpi-config = <4 5 0 0>;
    ti,gpio-config = <2 1>;
    ti,gpo-config-1 = <4 1>;
    
    pcmd3140_port: port {
        #address-cells = <1>;
        #size-cells = <0>;

        pcmd3140_tx_endpoint: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&sai1a_endpoint>;
        };
    };
};

即使绕过驱动程序并使用该i2cset工具手动发出命令、也会得到相同的结果:

i2cset -y 0 0x4e 0x00 0x00 #转至页 0
i2cset -y 0 0x4e 0x02 0x81 #唤醒器件
睡眠 0.016 #等待 16ms
i2cset -y 0 0x4e 0x00 0x09 #转到第 9 页(从 0x00 更正)  
i2cset -y 0 0x4e 0x50 0x00 0x72 0x59 0xDC I #–7dB 阈值
i2cset -y 0 0x4e 0x00 0x00 #转至页 0
i2cset -y 0 0x4e 0x3C 0x40 #通道 1 配置为数字麦克风 PDM 输入
i2cset -y 0 0x4e 0x41 0x40 # Ch2 配置为数字麦克风 PDM 输入
i2cset -y 0 0x4e 0x73 0xC0 #输入通道 1 和 2 已启用
i2cset -y 0 0x4e 0x74 0xC0 # ASI 输出通道 1 和 2 已启用
i2cset -y 0 0x4e 0x21 # GPIO1 作为 IRQ
i2cset -y 0 0x4e 0x22 0x41 # GPO1 作为 PDM CLK
i2cset -y 0 0x4e 0x2B 0x45 # GPI1 作为 Ch1/2 DMIC 数据
i2cset -y 0 0x4e 0x20 0x00 # GPI1 负边沿作为通道 1
i2cset -y 0 0x4e 0x00 0x01 #转至第 1 页
i2cset -y 0 0x4e 0x1E 0x00 #通道 1 作为 VAD 输入、用户模式、内部时钟
在记录模式下禁用 i2cset -y 0 0x4e 0x1F 0x00 # VAD
i2cset -y 0 0x4e 0x00 0x00 #转至页 0
i2cset -y 0 0x4e 0x75 0x21 #启用 VAD

您能否提供任何指导或分享已包含 VAD 支持的驱动程序实施方案?

提前感谢。

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

    尊敬的 Mattia:

    用户还需要写入寄存器 0x33 来取消屏蔽中断、以便其可以置位。

    此致、

    Garret

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

    我尝试添加 i2cset -y 0 0x4e 0x33 0xE7 # INT_MASK0 不屏蔽位 4 和 3
    添加到命令序列中、该序列变为:

    i2cset -y 0 0x4e 0x00 0x00 #转至页 0
    i2cset -y 0 0x4e 0x02 0x81 #唤醒器件
    ...
    ...
    ...
    在记录模式下禁用 i2cset -y 0 0x4e 0x1F 0x00 # VAD
    i2cset -y 0 0x4e 0x00 0x00 #转至页 0
    i2cset -y 0 0x4e 0x33 0xE7 # INT_MASK0 不屏蔽位 4 和 3
    i2cset -y 0 0x4e 0x75 0x21 #启用 VAD

    但是、在使用示波器进行检查时、我仍然没有看到 GPIO1 上出现任何中断。  唯一的区别是 GPIO1 线路从高电平(寄存器设置为 0xFF)变为低电平(寄存器设置为 0xE7)、但该线路似乎一直保持低电平、不显示任何中断。

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

    谢谢你,加雷·戈德弗雷,你的支持。 我最终通过读取 INT_LTCH0 寄存器(地址= 0x36)的值来解决了该问题。 在表示生成中断的源的位中有一个 0 之前、它不会生成新中断。  读取寄存器后、它会自动返回到复位值[复位= 0x0]