ST意法半导体
直播中

悬崖勒马2

9年用户 969经验值
擅长:EMC/EMI设计
私信 关注
[问答]

我应该如何返工STM32MP157F上的pinctrl驱动程序呢?

我正在 STM32MP157F 上构建基于 linux 的固件,我需要应用 linux RT 补丁。
我正在使用 STM32MP157F-EV1 进行测试
作为 linuxkernel,我正在使用 ST linux v5.10-stm32mp-r2  ,来自 STMicroelectronics linux repo。这个标签是 v5.10.61 内核版本,所以我选择了patch-5.10.59-rt52.patch.gz  ,因为它是最近的内核版本。
打补丁没有错误,但是启动时pinctrl-stm32驱动出现如下异常:
  • [    2.905809] ------------[ cut here ]------------
  • [    2.905823] WARNING: CPU: 0 PID: 1 at kernel/locking/rtmutex.c:2040 __rt_mutex_trylock+0x110/0x114
  • [    2.905860] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G        W         5.10.61-rt52agvl-stm32mp157f-ev1 #2
  • [    2.905873] Hardware name: STM32 (Device Tree Support)
  • [    2.905890] [] (unwind_backtrace) from [] (show_stack+0x10/0x14)
  • [    2.905919] [] (show_stack) from [] (dump_stack+0xb4/0xc8)
  • [    2.905940] [] (dump_stack) from [] (__warn+0xe8/0x100)
  • [    2.905962] [] (__warn) from [] (warn_slowpath_fmt+0x7c/0xa8)
  • [    2.905985] [] (warn_slowpath_fmt) from [](__rt_mutex_trylock+0x110/0x114)
  • [    2.906008] [] (__rt_mutex_trylock) from [] (rt_spin_trylock+0x8/0x28)
  • [    2.906032] [] (rt_spin_trylock) from [] (clk_enable_lock+0x10/0x108)
  • [    2.906060] [] (clk_enable_lock) from [] (clk_enable+0x18/0x30)
  • [    2.906083] [] (clk_enable) from [] (stm32_gpio_irq_trigger+0x28/0x78)
  • [    2.906107] [] (stm32_gpio_irq_trigger) from [] (handle_fasteoi_irq+0x160/0x25c)
  • [    2.906134] [] (handle_fasteoi_irq) from [] (__handle_domain_irq+0xa0/0x10c)
  • [    2.906156] [] (__handle_domain_irq) from [] (gic_handle_irq+0x80/0x94)
  • [    2.906182] [] (gic_handle_irq) from [] (__irq_svc+0x6c/0xbc)
  • [    2.906203] Exception stack(0xc18b7cd8 to 0xc18b7d20)
  • [    2.906214] 7cc0:                                                       c2821680 a0000013
  • [    2.906227] 7ce0: c18c0000 00000001 c146b714 c18c0510 c18b7d48 c18c0000 c18b6000 c2821681
  • [    2.906239] 7d00: c18b7d48 c30195f4 c2821681 c18b7d28 c0db4d58 c0db4d90 20000013 ffffffff
  • [    2.906248] [] (__irq_svc) from [] (rt_spin_lock_slowlock_locked+0x1c0/0x2f8)
  • [    2.906271] [] (rt_spin_lock_slowlock_locked) from [] (rt_spin_lock_slowlock+0x54/0x84)
  • [    2.906294] [] (rt_spin_lock_slowlock) from [] (rt_spin_lock+0x50/0x5c)
  • [    2.906317] [] (rt_spin_lock) from [] (uart_change_speed+0x38/0xdc)
  • [    2.906341] [] (uart_change_speed) from [] (uart_port_startup+0x19c/0x234)
  • [    2.906362] [] (uart_port_startup) from [] (uart_port_activate+0x58/0x90)
  • [    2.906383] [] (uart_port_activate) from [] (tty_port_open+0x7c/0xbc)
  • [    2.906407] [] (tty_port_open) from [] (uart_open+0x14/0x1c)
  • [    2.906428] [] (uart_open) from [] (tty_open+0x120/0x2f0)
  • [    2.906448] [] (tty_open) from [] (chrdev_open+0x80/0x190)
  • [    2.906472] [] (chrdev_open) from [] (do_dentry_open+0xe4/0x3b8)
  • [    2.906497] [] (do_dentry_open) from [] (do_open+0x1c4/0x294)
  • [    2.906520] [] (do_open) from [] (path_openat+0x10c/0x1c4)
  • [    2.906540] [] (path_openat) from [] (do_filp_open+0x74/0x120)
  • [    2.906561] [] (do_filp_open) from [] (filp_open+0x12c/0x1c4)
  • [    2.906584] [] (filp_open) from [] (console_on_rootfs+0x18/0x54)
  • [    2.906607] [] (console_on_rootfs) from [] (kernel_init_freeable+0x170/0x194)
  • [    2.906626] [] (kernel_init_freeable) from [] (kernel_init+0x8/0x118)
  • [    2.906646] [] (kernel_init) from [] (ret_from_fork+0x14/0x24)
  • [    2.906664] Exception stack(0xc18b7fb0 to 0xc18b7ff8)
  • [    2.906675] 7fa0:                                     00000000 00000000 00000000 00000000
  • [    2.906687] 7fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  • [    2.906697] 7fe0: 00000000 00000000 00000000 00000000 00000013 00000000
  • [    2.906704] ---[ end trace 0000000000000003 ]---
我发现看起来类似的问题,并且所有 spin_lock/spin_unlock 都被替换为 raw_spin_lock/raw_spin_unlock,因为在 RT 内核中 spinlock/spin_unlock 可能会休眠。但这不是我的情况(我试图用 raw_* 替换所有 spin_lock/pin_unlock 并且它没有帮助)因为在内部使用 spin_lock 的 clk_enable 函数中生成异常。我应该如何返工stm32 pinctrl驱动程序?


回帖(1)

李雪萧

2022-12-14 15:18:12
我通过实现使用原始自旋锁的 clk_enable 和 lk_disable 的 raw_* 变体解决了这个问题。我还修改了 i2c-stm32f7.c 文件并使用我的 raw_clk_enable 和 raw_clk_disable 函数。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分