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.

[参考译文] TLV320AIC3254:TLV32x4驱动程序导致的内核错误和引导故障

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1268784/tlv320aic3254-kernel-errors-and-boot-failures-due-to-tlv32x4-driver

器件型号:TLV320AIC3254
主题中讨论的其他器件:TLV320AIC3204

您好!  

我们正在我们的某个产品中使用您的编解码器、并已使用提供的 Linux 驱动程序成功将其集成到 Ubuntu 22.04.3中。 但是、驱动程序中存在一个错误、导致出现"原子调度"以及尝试写入不存在的存储器等错误。 由于客户的要求、我们无法自行选择使用自定义内核来修补驱动程序。 我们可以采取其他任何步骤来解决此问题、还是必须等待补丁? 导致引导问题。  

当我们禁用驱动程序(这将禁用我们的音频功能)时、引导问题将消失。  

以下是我收集的有关此问题的一些日志:  

[ 10.027250]错误:原子调度:systemd-udevd/432/0x00000002

[ 10.045960]错误:原子调度:systemd-udevd/432/0x00000000

[ 10.074657]错误:原子调度:systemd-udevd/432/0x00000002

[ 10.083558]错误:原子调度:systemd-udevd/432/0x00000000

[10.101876] 无法处理从虚拟地址0000000000000078的不可读内存中读取的内核

[ 10.111066]内存中止信息:

[ 10.113894] ESR = 0x000096000004

[ 10.117693] EC = 0x25:DABT (电流 EL)、IL = 32位

[ 10.123079] SET = 0、FNV = 0

[ 10.126172] EA = 0、S1PTW = 0

[10.129352]  FSC = 0x04:0级转换故障

[ 10.134297]数据中止信息:

[ 10.137212] ISV = 0,ISS = 0x00000004

[10.141098]  CM = 0,WNR = 0

[10.144104] 用户 ptable:4K 页,48位 Vas,pgdp=0000000102ef0000

[ 10.150639][0000000000000078] PgD=000000000000、p4d=000000000000

[10.157532] 内部错误:Oops:96000004[#1]抢占 SMP

[ 10.163185] Modules linked in:snd_soc_tlv320aic32x4_spi brcmfmac snd_soc_simple_card (+) brcmutil snd_soc_t                                                                lv320aic32x4_i2c cfg80211 snd_soc_BCM2835_I2S snd_soc_tlv320aic32x4 snd_soc_simple_card_utils snd_BCM2835 (CE)                                                                 SND_SoC_CORE snd_compress snd_seq_midi ac97_BUS raspberrypi_hwmon snd_seq_midi_event snd_pcm_dmaengine snd_raw                                                                MIDI SND_PCM SND_SEQ BCM2835_CODEC (CE) BCM2835_ISP (CE) v4l2_mem2mem BCM2835_v4l2 (CE) BCM2835_mmal_vchiq (CE) SN                                                                d_seq_device videbuf2_vmalloc snd_timer videbuf2_dma_contig videbuf2_memops v4l2 videobuf2_common                                                                 SND 视频开发 BCM2835_gpiomem MC VC_SM_CMA (CE) rpivid_mem uio_pdrv_genirq nvmem_rmem uio sch_FQ_codel rtc_ds13                                                                07 drm pstore_blk ramoops adle_Solomon pstore_zone ip_tables x_tables autofs4 btrfs blake2b_generic zstd_compr                                                                ESS RAID10 raid456 async_raid6_recov async_memcpy async_pq async_XOR async_tx XOR XOR_neon raid6_pq libcrc32c                                                                 RAID1 raid0多路径线性 uas usb_storage rtc_pcf85063 dwc2角色 i2c_mux_pinctrl udc_core crct10dif_ce i2c                                                                mux (_mux)

[ 10.163386] i2c_BCM2835 phy_generic AES_ARM64

[10.255713] CPU: 3 PID: 432 Comm: systemd-udevd dicted: G    WC E  5.15.0-1035-raspi #38-ubuntu

[ 10.265335] Hardware name: Raspberry Pi Compute Module 4 Rev 1.1 (DT)

[10.271866] pstate:204000c5 (nzCv daif +pan -uaO -tco -dit -ssbs BTYPE=-)

[10.278931] PC : pick_next_task_fair+0x1F4/0x490

[ 10.283618] lr : pick_next_task_fair+0x1f0/0x490

[10.288298] sp : ff80000869b130

[10.291656] x29:ff80000869b130 x28:ff80000869bd60 x27:0000000000000030

[10.298901] x26:ffff4767bef7f800 x25:ffffba53cdc2d5f8 x24:ffff4766c459a000

[10.306144] x23:000000000000 x22:ff4767bef7f700 x21:000000000000

[ 10.313388] x20:000000000000 x19:000000000000 x18:000000000000

[10.320632] x17:202020202020452020 x16:4357202020202020 x15:2047203A646574

[ 10.327875] x14:000000000000 x13:38613178302f3461 x12:3178302b636e7473

[10.335117] x11:000000000000 x10:000000000000000a x9:ffba53cd4c8c98

[ 10.342360] x8 : 000000000000000a x7 : 00000000000000000001 x6 : 0000000000000126

[10.349602] x5:ff4766c8b6d800 x4:0000000001674174 x3:ffba53ce565c80

[ 10.356846] x2 : 000000000000 x1 : ffba53ce565c80 x0 : 00003ddd1465

[10.364090] 呼叫跟踪:

[ 10.366567] pick_next_task_fair+0x1F4/0x490

[ 10.370898] __schedule+0x1d8/0x8b0

[10.374436]  SCHEDULE+0x70/0x170

[ 10.377709] SCHEDULE_TIMEOUT+0xa0/0x1c4

[ 10.381687] WAIT_FOR_COMPENSATION_TIMEOUT+0x88/0x110

[ 10.386634] BCM2835_i2c_xfer+0xe8/0x3a4 [i2c_BCM2835]

[ 10.391853] __i2c_transfer+0xa4/0x4b0

[ 10.395656] i2c_transfer+0x68/0x130

[ 10.399281] regmap_i2c_read+0x64/0xb0

[ 10.403083] _regmap_raw_read+0xb4/0x270

[ 10.407062] _regmap_BUS_read+0x4c/0x84

[ 10.410952] _regmap_read+0x80/0x200

[ 10.414578] _regmap_update_bits+0xd4/0x110

[ 10.418822] _regmap_select_page+0xb8/0x160

[ 10.423064] _regmap_raw_read+0x10c/0x270

[ 10.427132] _regmap_BUS_read+0x4c/0x84

[ 10.431022] _regmap_read+0x80/0x200

[ 10.434647] _regmap_update_bits+0xd4/0x110

[ 10.438890] regmap_update_bits_base+0x6c/0xa0

[ 10.443398] clk_aic32x4_bdiv_set_parent+0x34/0x40 [SND_SoC_tlv320aic32x4]

[ 10.450381] clk_core_set_parent_nolock+0x158/0x3b0

[ 10.45531] clk_set_parent+0x48/0x180

[ 10.459133] aic32x4_component_prob+0x6c/0x1b0 [SND_SoC_tlv320aic32x4]

[ 10.465849] snd_soc_component_probed+0x30/0x84 [snd_soc_core]

[ 10.471737(2006) SoC_Probe_component+0x1dc/0x374 [SND_SoC_CORE]

[ 10.477445] snd_soc_bind_card+0x27c/0x7c0 [snd_soc_core]

[ 10.482977] SND_SoC_REGISTER_CARD+0xFC/0x114 [SND_SoC_CORE]

[ 10.488778] devm_snd_soc_register_card+0x54/0xb0 [snd_soc_core]

[ 10.494927] aSOC_simple_prob+0x1fc/0x3f0 [SND_SoC_simple_card]

[ 10.501028] platform_probe+0x70/0x110

[ 10.504831] REALITY_PROT+0xd0/0x490

[ 10.508458] __driver_probe_device+0x148/0x190

[ 10.512966] driver_probe_device+0xec/0x180

[ 10.517209] __driver_attach+0x104/0x240

[ 10.521187] BUS_for_each_dev+0x78/0xd0

[ 10.525077] driver_attach+0x2C/0x40

[ 10.528702] BUS_add_driver+0x154/0x270

[ 10.532594] driver_register+0x80/0x13c

[ 10.536486] _platform_driver_register+0x30/0x40

[ 10.541255] asoc_simple_card_init+0x28/0x1000 [SND_SoC_simple_card]

[ 10.547706] DO_ONE_INITCALL+0x4c/0x2c0

[ 10.551596] DO_INIT_MODULE+0x50/0x260

[ 10.555397] LOAD_MODULE+0xa30/0xbd0

[ 10.559021] __do_sys_finit_module+0xa8/0x114

[ 10.563438] ___ARM64_sys_finit_module+0x28/0x3c

[ 10.568031] invoke_syscall+0x50/0x120

[ 10.571835] el0_Svc_common.constprop.0+0x180/0x1a0

[ 10.576784] DO_el0_Svc+0x30/0xb0

[ 10.580145] el0_Svc+0x4c/0x170

[ 10.583330] el0t_64_SYNC_handler+0xa4/0x12c

[ 10.587660] el0t_64_SYNC+0x1a4/0x1a8

[ 10.591377]代码:f9403e60 aa1303e1 97ffe43e f9403a73 (f9403e80)

[ 10.597558]-->结束迹线673aa74947e0992c -->

[10.602240] 注:systemd-udevd[432]已退出 preempt_count 2

[ 20.192047] mmc1:等待硬件中断时超时。

[ 70.108043] RCU: info: RCU_preempt detected stall on cpus/task:

[70.114227] RCU:  0-...!:(后面有1个 GPS) IDLE=9fd/1/0x4000000000000002 softirq=2997/3009 fqs=1

[70.123059]  (由2个起搏检测,t=15002个起搏,g=1193,q=7041)

[ 70.128887] CPU 0的任务转储:

[70.132156] task:systemd-journal state: R running task  stack:  0 pid:390 PPID:  1 flags:0x000008                                                                00

[ 70.142224]呼叫跟踪:

[ 70.144698] __switch_to+0xf8/0x150

[ 70.148243] __dentry_kill+0x6c/0x1e0

[70.151956] RCU:RCU_preempt kthread 计时器唤醒对于14874 jiffies 没有发生! g1193 f0x0 RCU_GP_WAIT_F                                                                QS (5)->状态=0x402

[70.163515] RCU:  CPU=3 timer-softirq=292时可能出现计时器处理问题

[70.170487] RCU: RCU_preempt kthread 饿死了14875个四足! g1193 f0x0 RCU_GP_WAIT_FQS (5)->状态=0x402                                                                 -> CPU =3

[ 70.181075] RCU:  除非 RCU 抢占 kthread 获得足够的 CPU 时间,否则 OM 现在是预期行为。

[ 70.190338] RCU:RCU grace-period kthread 堆栈 dump:

[70.195457] task:CCU_preempt  state:I stack:  0 pid: 15 PPID:  2 flags:0x00000008

[ 70.203931]呼叫跟踪:

[ 70.206405] __switch_to+0xf8/0x150

[ 70.209941] __SCHEDULE+0x328/0x8b0

[70.213478]  SCHEDULE+0x70/0x170

[70.216749]  SCHEDULE_TIMEOUT+0xa0/0x1c4

[ 70.220727] RCU _gp_fqs_loop+0x120/0x370

[ 70.224704] RCU_gp_kthread+0x128/0x170

[70.228591]  kthread+0x128/0x134

[ 70.231864] RET_FROM_FO叉+0x10/0x20

[70.235488] RCU:RCU GP kthread 上次运行的堆栈转储:

[ 70.241047] CPU 3的任务转储:

[70.244315] task:kworker/3:3  state:i stack:  0 pid: 424 PPID:  2 flags:0x00000008

[70.252798] 工作队列: 0x0 (事件)

[ 70.256428]呼叫跟踪:

[ 70.258901] __SWITCH_TO+0xf8/0x150

[ 70.262437] 0x0

 

期待您的回复、谢谢!  

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

    请告诉我内核版本和平台以及如何注册声卡。

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

    内核版本在 Ubuntu 22.04.3 LTS 上为5.15.0-1035-raspi。 下面是我用于注册声卡的设备树:  

    /dts-v1/;
    /插件/;

    /{
    兼容="BRCM、bcm2711"、"BRCM、BCM2835";

    片段@0{
    Target =<&I2S>;
    _覆盖__{
    状态="可以";
    };
    };

    片段@1{
    target-path ="/";
    _覆盖__{
    CODEC_reg_1v8:CODEC-reg-1v8{
    兼容="固定稳压器";
    稳压器名称="TLV320AIC3204_1v8";
    稳压器最小微伏=<1800000>;
    稳压器最大微伏电压=<1800000>;
    稳压器始终开启;
    };
    };
    };

    片段@2{
    Target =<&GPIO>;
    _覆盖__{
    codec_rst:codec-rst{
    BRCM、引脚=<16>;
    BRCM、function =<1>;// BCM2835_FSEL_GPIO_OUT
    };
    };
    };

    片段@3{
    Target =<&i2c1>;
    _覆盖__{
    #address-Cells =<1>;
    #size-cells =<0>;
    状态="可以";

    /*音频外部振荡器*/
    codec_osc:codec_osc{
    兼容="固定时钟";
    #clock-cells =<0>;
    时钟频率=<12000000>;/* 12 MHz */
    };

    codec1:tlv320aic32x4@18 {
    #sound-Da-cells =<0>;
    兼容="ti, tlv320aic32x4";
    寄存器=<0x18>;

    Clocks =<&CODEC_osc>;
    时钟名称="MCLK";

    IOV 电源=<&VDD_3V3_reg>;
    ldoin-supply =<&VDD_3V3_reg>;

    GPIO 控制器;
    #GPIO-CELLS =<2>;
    RESET-GPIO =<和 GPIO 16 1>;// GPIO_ACTIVE_LOW

    状态="可以";
    };
    };
    };
    片段@4{
    Target =声音>(Sound);
    _覆盖__{
    兼容="简单音频卡";
    I2S-controller =<&I2S>;
    状态="可以";

    simple-audio-card、name ="TLV320AIC3254";

    simple-audio 卡、小工具=
    "麦克风"、"Mic 插孔"、
    "耳机"、"耳机插孔";
    简单音频卡、路由=
    "耳机插孔"、"HPL"、
    "耳机插孔"、"HPR"、
    "IN1_L"、"Mic 插孔"、
    "IN1_R"、"Mic 插孔"、
    "IN2_L"、"Mic 插孔"、
    "IN2_R"、"Mic 插孔"、
    "MIC 插孔"、"MIC 偏置";


    simple-audio 卡、格式="I2S";
    simple-audio 卡、bitclock-master =<&Rpi>
    simple-audio-card、frame-master =<&rpi>;
    RPI:简单音频卡、CPU{
    Sound-Dai =<&I2S>;
    };
    dailink0_master:简单音频卡、编解码器{
    sound-Dai =<&codec1>;
    };

    };
    };
    };

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

    从日志中、为什么调用  snd_soc_tlv320aic32x4_spi?

    请检查 i2c 总线是否与 i2c-tools 一起工作。

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

    i2c 总线工作正常。 我们能够在 Ubuntu 控制编解码器并录制音频。 这些启动问题是间歇性的、不会每次都发生(尽管每次都会发生内核错误)。  

    器件树 将此器件定义为兼容、因此它很可能会链接与其相关的所有模块。 但是、我们禁用了 SPI、因此不应使用该模块。  

    只要操作系统可以引导、编解码器就可以正常工作。 这似乎是该编解码器的驱动程序问题、因为一旦我们在引导配置中禁用此器件、我们就可以可靠地引导。 核心问题是、加载设备树中指定的此设备的驱动程序会导致上述问题阻止启动。 根据日志、这似乎是任务调度的问题。  

    如果引导成功、器件将按预期工作。 但是、我们希望能够解决这个启动问题、因为我们的器件需要可靠启动。  

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

    您好

    我认为这不是一个容易处理的问题。 具体取决于日志。 在 snd_soc_component_probe 调用的 clk_set_parent 中发生了问题  、请每次在启动期间检查 clk 是否已就绪。

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

    我们已确认源自我们的晶体振荡器的 MCLK 在重新启动时始终可用。 字时钟和位时钟在我们开始记录之前不会变为活动状态、这会在器件完全启动后发生。 在我们看来、硬件在重新启动期间工作正常。 还有什么其他需要我们查看的东西吗? 如果不应从原子上下文调用 clk_set_parent、  

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

    根据您的输入、我想向您确认禁用音频驱动程序期间是否出现此问题? 我有些困惑。

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

    启用驱动程序时会发生此问题。 当驱动器被禁用时、它消失。 因此、我们认为问题在于驱动器本身。  

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

    下面我们来尝试一下

    Snd_soc_component_driver 中的 Implent .mute_stream、并将探头中的所有代码移至 MUTE_STREAM 中、然后检查是否发生了问题。

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

    我们无法修改此驱动程序、必须使用内核/ubuntu 附带的软件。 如果未来版本的补丁无法解决此问题、则必须更换为具有更好 Linux 兼容性的其他编解码器供应商。  

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

    您好,Alex

    我对看到这个感到非常遗憾。 您会是如此善良,并将您的平台交付给我,我们可以重现问题,研究它,并为您制作补丁吗?

    如您所知、我们没有类似的环境来重现此问题。 期待您的平台。 谢谢。