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.

[参考译文] TLV320ADC3140:配置和内核错误

Guru**** 2455990 points
Other Parts Discussed in Thread: TLV320ADC3140, ADC3140EVM-PDK

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1321953/tlv320adc3140-configuration-and-kernel-errors

器件型号:TLV320ADC3140
主题中讨论的其他器件:ADC3140EVM-PDK

大家好!  

一段时间以来、我已经尝试 通过 Linux 内核驱动程序将 TLV320ADC3140与 Raspberry Pi 一起使用。 我正在使用连接到 Raspberry Pi 4的 ADC3140EVM-PDK 评估模块(www.ti.com/.../ADC3140EVM-PDK)。  我阅读了一些资源、包括音频论坛中的帖子: https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1044970/tlv320adc5140-device-tree-on-raspberry-pi

tlv320adcx140 内核模块在设备上编译并通过设备树重叠进行配置:

/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2837", "brcm,bcm2836", "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";

    fragment@0 {
        target = <&i2s_clk_consumer>;
        __overlay__ {
            status = "okay";
        };
    };
    
    fragment@1 {
        target = <&i2c1>;
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            status = "okay";

            ti_codec: tlv320adc3140@4c {
                compatible = "ti,tlv320adc3140";
                reg = <0x4c>;
                #sound-dai-cells = <0>;
                ti,mic-bias-source = <0>;
                ti,gpi-config = <0 0 0 0>;
                ti,gpio-config = <2 2>;
                ti,gpo-config-1 = <0 0>;
                ti,gpo-config-2 = <0 0>;
                reset-gpios = <&gpio 4 0>;
            };
        };
    };

    fragment@2 {
        target = <&sound>;
        __overlay__ {
            compatible = "simple-audio-card";
            i2s-controller = <&i2s_clk_consumer>;
            status = "okay";

            simple-audio-card,name = "TI";
            simple-audio-card,format = "i2s";
            simple-audio-card,bitclock-master = <&codec_dai>;
            simple-audio-card,frame-master = <&codec_dai>;

            cpu_dai: simple-audio-card,cpu {
                sound-dai = <&i2s_clk_consumer>;
                dai-tdm-slot-num = <2>;
                dai-tdm-slot-width = <32>;
            };

            codec_dai: simple-audio-card,codec {
                sound-dai = <&ti_codec>;
            };
        };
    };
};

当我引导系统时、大部分时间似乎正确加载了模块、探测工作正常、并且 ALSA 接口 可用。 然而,不时,特别是 每当开始录音,奇怪的事情开始发生。 我会定期通过 I2C 收到以下写入寄存器的错误:

[    4.229373] tlv320adcx140-codec 1-004c: ASoC: error at snd_soc_component_update_bits on tlv320adcx140-codec.1-004c for register: [0x00000007] -5
[    4.229600] tlv320adcx140-codec 1-004c: ASoC: error at snd_soc_component_update_bits on tlv320adcx140-codec.1-004c for register: [0x00000013] -5

在以下中、内核停止、器件无法再使用:

[ 4.229836] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000018
[ 4.229853] Mem abort info:
[ 4.229856] ESR = 0x0000000096000005
[ 4.229861] EC = 0x25: DABT (current EL), IL = 32 bits
[ 4.229866] SET = 0, FnV = 0
[ 4.229871] EA = 0, S1PTW = 0
[ 4.229875] FSC = 0x05: level 1 translation fault
[ 4.229879] Data abort info:
[ 4.229883] ISV = 0, ISS = 0x00000005
[ 4.229887] CM = 0, WnR = 0
[ 4.229891] user pgtable: 4k pages, 39-bit VAs, pgdp=0000000041fcc000
[ 4.229897] [0000000000000018] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000
[ 4.229912] Internal error: Oops: 0000000096000005 [#1] PREEMPT SMP
[ 4.229920] Modules linked in: tlv320adcx140(O) binfmt_misc regmap_i2c hci_uart snd_soc_simple_card snd_soc_simple_card_utils brcmfmac btbcm snd_soc_bcm2835_i2s bluetooth rpivid_hevc(C) brcmutil snd_soc_core bcm2835_codec(C) bcm2835_v4l2(C) raspberrypi_hwmon bcm2835_isp(C) bcm2835_mmal_vchiq(C) v4l2_mem2mem videobuf2_dma_contig videobuf2_vmalloc snd_compress videobuf2_memops snd_bcm2835(C) snd_pcm_dmaengine videobuf2_v4l2 snd_pcm videobuf2_common ecdh_generic ecc snd_timer libaes videodev mc snd raspberrypi_gpiomem vc_sm_cma(C) nvmem_rmem uio_pdrv_genirq uio batman_adv bridge stp llc cfg80211 rfkill i2c_dev drm dm_mod drm_panel_orientation_quirks backlight fuse ip_tables x_tables ipv6 i2c_bcm2835
[ 4.230035] CPU: 1 PID: 9 Comm: kworker/u8:0 Tainted: G C O 6.1.0-rpi8-rpi-v8 #1 Debian 1:6.1.73-1+rpt1
[ 4.230045] Hardware name: Raspberry Pi 4 Model B Rev 1.5 (DT)
[ 4.230050] Workqueue: events_unbound deferred_probe_work_func
[ 4.230065] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 4.230072] pc : adcx140_pwr_ctrl+0x8c/0xfc [tlv320adcx140]
[ 4.230092] lr : adcx140_pwr_ctrl+0x84/0xfc [tlv320adcx140]
[ 4.230103] sp : ffffffc00806b990
[ 4.230107] x29: ffffffc00806b990 x28: 0000000000000000 x27: ffffff8042b88080
[ 4.230118] x26: ffffffeb4ff34000 x25: 0000000000000001 x24: 0000000000000080
[ 4.230127] x23: ffffff80440d1d80 x22: 0000000000000001 x21: 0000000000000000
[ 4.230136] x20: 00000000000000e0 x19: ffffff80440d1d80 x18: 00000000fffffffd
[ 4.230145] x17: 0000000000000000 x16: ffffffeb793fad10 x15: ffffffc00806b590
[ 4.230154] x14: 0000000000000001 x13: 2930347830202c62 x12: 3778302865746972
[ 4.230163] x11: 775f70616d676572 x10: 0000000000001a30 x9 : ffffffeb78fb37fc
[ 4.230172] x8 : ffffff8040271a90 x7 : 0000000000000000 x6 : 000000000e3ec98d
[ 4.230181] x5 : 0040001000000020 x4 : 0000000000000000 x3 : 00000000fffffffb
[ 4.230190] x2 : 0000000000000000 x1 : ffffff8040270000 x0 : 00000000fffffffb
[ 4.230200] Call trace:
[ 4.230205] adcx140_pwr_ctrl+0x8c/0xfc [tlv320adcx140]
[ 4.230217] adcx140_set_dai_fmt+0x210/0x22c [tlv320adcx140]
[ 4.230228] snd_soc_dai_set_fmt+0x34/0xa0 [snd_soc_core]
[ 4.230311] snd_soc_runtime_set_dai_fmt+0x5c/0x150 [snd_soc_core]
[ 4.230356] snd_soc_bind_card+0x638/0xb80 [snd_soc_core]
[ 4.230399] snd_soc_register_card+0xf8/0x110 [snd_soc_core]
[ 4.230444] devm_snd_soc_register_card+0x54/0xb0 [snd_soc_core]
[ 4.230488] asoc_simple_probe+0x20c/0x3bc [snd_soc_simple_card]
[ 4.230499] platform_probe+0x70/0xcc
[ 4.230508] really_probe+0xc4/0x2e0
[ 4.230514] __driver_probe_device+0x80/0x120
[ 4.230520] driver_probe_device+0xe0/0x164
[ 4.230526] __device_attach_driver+0xc0/0x13c
[ 4.230532] bus_for_each_drv+0x84/0xe0
[ 4.230541] __device_attach+0xa4/0x1a0
[ 4.230546] device_initial_probe+0x1c/0x2c
[ 4.230552] bus_probe_device+0xa4/0xb0
[ 4.230557] deferred_probe_work_func+0x90/0xd0
[ 4.230563] process_one_work+0x200/0x474
[ 4.230572] worker_thread+0x74/0x43c
[ 4.230579] kthread+0x110/0x114
[ 4.230586] ret_from_fork+0x10/0x20
[ 4.230595] Code: 531a6442 9400025a 2a0003e3 34000140 (f9400ea0) 
[ 4.230602] ---[ end trace 0000000000000000 ]---

我想知道我的操作有什么问题、或者 内核模块代码中是否有错误、或者是否存在某些配置错误。  

如果有人可以在这里提供帮助或分享使用 CHIP 系列和 Raspberry Pi SBC 的成功案例、那太棒了。

谢谢
乔纳斯

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

    请提供内核版本。  尝试  regmap_update_bits 、而不是 SND_SoC_component_update_bits  

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

    我正在运行最新的 Raspberry Pi 版本`bookworm`、运行此内核:

    $ uname -a
    Linux workshop-coelbe-jonas 6.1.0-rpi8-rpi-v8 #1 SMP PREEMPT Debian 1:6.1.73-1+rpt1 (2024-01-25) aarch64 GNU/Linux

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

    如果您仍然遇到这个问题、我建议使用以下代码 lpa-android-drivers/pcmdevice-linux-driver - Unnamed repository;编辑此文件"description"来命名存储库。

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

    即使将所有调用替换为 regmap_update_bits、该错误仍然存在。 现在、我将签出新的实现。  

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

    我遇到的编译模块的第一个问题是一些内核版本依赖性、这对于 Raspberry Pi 内核来说是不同的、因为这是一个分支。 我已经通过在相应的故障位置更改 IF 宏(在本例中为6.2.0至6.1.0版本)解决了这一问题、例如

    #if KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE
    		FW_ACTION_UEVENT
    #else
    		FW_ACTION_HOTPLUG
    #endif

    第二个问题是器件树覆层。 我已经尝试加载随库提供的一个(genericstereaudioocodec.dts ),它不编译。 我设计的镀层如下所示:


    /dts-v1/;
    /plugin/;
    
    / {
        compatible = "brcm,bcm2708";
    
        fragment@0 {
            target = <&sound>;
            __overlay__ {
                compatible = "simple-audio-card";
                simple-audio-card,name = "TI";
                status="okay";
    
                capture_link: simple-audio-card,dai-link@0 {
                    format = "i2s";
    
                    // Set RasPi to I2S slave
                    bitclock-master = <&r_codec_dai>;
                    frame-master = <&r_codec_dai>;
    
                    r_cpu_dai: cpu {
                        sound-dai = <&i2s>;
                        // TDM slot configuration for stereo
                        dai-tdm-slot-num = <2>;
                        dai-tdm-slot-width = <32>;
                    };
    
                    r_codec_dai: codec {
                        sound-dai = <&codec_in>;
                    };
                };
            };
        };
    
        fragment@1 {
            target = <&i2c1>;
            __overlay__ {
                #address-cells = <1>;
                #size-cells = <0>;
                status = "okay";
    
                codec_in: adc3140@4c {
                    compatible = "ti,adc3140";
    				reg = <0x4c>;
                    reset-gpios = <&gpio 4 0>;
    
                    #address-cells = <1>;
                    #size-cells = <0>;
                    #sound-dai-cells = <0>;
                    status = "okay";
    
                };
            };
        };
    
        fragment@2 {
            target = <&i2s>;
            __overlay__ {
                #sound-dai-cells = <0>;
                status = "okay";
            };
        };
    };

    编解码器驱动程序似乎已加载、但在初始化器件时、内核日志中再次出现错误消息:


    [    3.966342] pcmdevice-codec 1-004c: primary-device = 0x4c
    [    3.966384] pcmdevice-codec 1-004c: Looking up irq-gpio property failed -22
    [    3.967219] pcmdevice-codec 1-004c: Direct firmware load for adc3140-1dev-reg.bin failed with error -2
    [    3.968047] pcmdevice-codec 1-004c: Failed to read adc3140-1dev-reg.bin, no side-effect on driver running
    [    3.968070] pcmdevice-codec 1-004c: Firmware init complete

    尝试记录样本时、将出现以下内核消息、并且记录不成功:

    [  112.402622] pcmdevice-codec 1-004c: pcmdevice_hw_params: Capture
    [  112.402641] pcmdevice-codec 1-004c: pcmdevice_hw_params: BCLK rate = 2116800 Channel = 2Sample rate = 44100 slot width = 24
    [  112.402947] bcm2835-i2s fe203000.i2s: I2S SYNC error!
    [  112.403125] pcmdevice-codec 1-004c: conf_no should be less than 0

    您有任何提示吗?

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

     从此链接下载 adc3140-1dev-reg.json

    jsn - lpaa-android-drivers/pcmdevice-linux-driver -未命名的存储库;编辑此文件"说明"以命名存储库。

    并在此处下载 regbin 工具和工具指南文档。

    tool - lpa-android-drivers/pcmdevice-linux-driver - Unnamed repository;编辑此文件'description'以命名存储库。 

    将 json 文件转换为 bin 文件。

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

    感谢提示。 我手上没有窗户,所以我尝试使用葡萄酒,这失败了。 之后,我安装了 Windows ,这也失败了:

    tool/regbin_parser.exe -i jsn/adc3140-1dev-reg.json
    File size not match, 8859 2064261152
    main Bin loading requested: 0

    我不太了解误差输出、这里有什么作用?

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

    嗨、Guy

    regbin_parser.exe 是 bin 文件的解析工具。

    您必须使用 Non_Integrated_Bin_Tool_1.3.7.zip 将 Jason 文件转换为 bin 文件

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

    啊、我明白了。 阅读指南也有帮助一点... 抱歉。 固件现已加载、但仍未达到预期效果。 在加载该模块时、正确加载了这些固件、我假设:

    [    3.700094] pcmdevice-codec 1-004c: primary-device = 0x4c
    [    3.700129] pcmdevice-codec 1-004c: Looking up irq-gpio property failed -22
    [    3.701675] pcmdevice-codec 1-004c: pcmdev: regbin_ready start
    [    3.701693] pcmdevice-codec 1-004c: ndev = 1
    [    3.701697] pcmdevice-codec 1-004c: nconfig = 2
    [    3.701701] pcmdevice-codec 1-004c: img_sz = 540 total_config_sz = 248 offset = 292
    [    3.701820] pcmdevice-codec 1-004c: Firmware init complete

    不过、在尝试录制时、仅会导致输入/输出错误:

    $ arecord -f S24_LE -D "hw:0" -c2 -r 48000                             
    Recording WAVE 'stdin' : Signed 24 bit Little Endian, Rate 48000 Hz, Stereo
    RIFF$?WAVEfmt ??data?arecord: pcm_read:2221: read error: Input/output error

    和以下相应的内核消息:

    [ 3277.752317] pcmdevice-codec 1-004c: pcmdevice_hw_params: Capture
    [ 3277.752335] pcmdevice-codec 1-004c: pcmdevice_hw_params: BCLK rate = 2304000 Channel = 2Sample rate = 48000 slot width = 24
    [ 3277.752639] bcm2835-i2s fe203000.i2s: I2S SYNC error!
    [ 3277.752817] pcmdevice-codec 1-004c: select_cfg_blk: profile_conf_id = 0
    [ 3277.752822] pcmdevice-codec 1-004c: select_cfg_blk: conf 0, block type:PRE_POWER_UP	 device idx = 0x00
    [ 3287.806239] pcmdevice-codec 1-004c: select_cfg_blk: profile_conf_id = 0
    [ 3287.806257] pcmdevice-codec 1-004c: select_cfg_blk: conf 0, block type:PRE_SHUTDOWN	 device idx = 0x00

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

    请使用示波器测量 I2S 时钟。 在 DTS 中、TLV320ADC3140 将被设置为主器件、对吗?

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

    我在 git.ti.com 中发现 json 文件可能与您的要求不匹配。 您能否列出您想要录制的音频规格? 例如采样率、位宽、bck clk 和 MCLK。 谢谢。

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

    在当前的 DTS ADC314被设置为主器件、是的。 我已经使用示波器进行了测量、在 BCLK 或 FSYNC 上没有看到任何时钟信号。  

    具体配置现在无关紧要、我只想让使用板载模拟麦克风运行的 ADC3140EMV-PDK 作为快速原型。 因此、如果另一种配置开箱即用、那也没问题。  

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

    我已将您的请求转给我们的硬件专家。 他们将为您提供支持。 如果您想获取  ADC3140EMV-PDK、我想您会从 www.ti.com 购买一个。

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

    我 已购买   ADC3140EMV-PDK。 我只使用包含  TLV320ADC3140的系统上部 、使用板上的测试点将此板连接到 Raspberry Pi。 我认为 这里的硬件不是问题。  

    接线应该是直接的,所以我也很确定那里没有什么问题,只是为了确保:

    • RPI GPIO 2 (SDA)<> ADC3140 SDA
    • RPI GPIO 3 (SCL)<>ADC3140 SCL
    • RPI GPIO 4 <> ADC3140 SHDNz (复位)
    • RPI GPIO 18 (I2S CLK)<>ADC3140 BCLK
    • RPI GPIO 19 (I2S FS)<>ADC3140 FSYNC
    • RPI GPIO 20 (DIN)<> ADC3140 DOUT

    我是否有其他方法确认与芯片的通信正常工作?

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

    尊敬的 Jonas:

    下面我附加了一个脚本、该脚本将 EVM 设置为在主模式下运行、并将板载麦克风作为输入。 您可以使用 PPC3 (屏幕底部的 I2C 监控器)将其加载到 EVM。

    e2e.ti.com/.../ADC3140_5F00_Master_5F00_OnboardMic.cfg

    确保 J14、15和16已连接、并且 MCLK 已连接到 GPIO1。 我还假设 MCLK 将是12.288MHz、格式为标准 I2S。 这些应该足够简单、可以根据需要进行更改。 如果您需要有关 EVM 的进一步帮助、请告诉我。

    此致、
    J·麦克弗森