市中心的道格·布朗 ➡️ 升级我的 Chumby 8 内核第 12 部分:UART 困境

主要观点:作者在 Chumby 8 内核升级过程中遇到 UART 相关问题,涉及多个驱动,包括 pxa、omap-serial 和 bcm63xx_uart 等,经过一系列研究和与其他开发者的讨论,最终找到解决方案并提交补丁系列,同时还解决了 8250_pxa 驱动的问题。
关键信息:

  • 主线内核的 pxa168.dtsi 文件已添加 UART,有两个兼容字符串。
  • 尝试 8250_pxa 驱动在大传输时会丢字符,改用 deprecated pxa 驱动正常但在 Linux 6.9 出现问题。
  • 问题追溯到 commit 7bfb915a597a301abb892f620fe5c283a9fdbd77,该提交本意是修复 BCM63xx UART 驱动的问题,但导致了此处的问题。
  • 深入研究发现 pxa 驱动在 FIFO 为空但仍有数据待发送时,tx_empty()回调返回 false,导致 stop_tx()不被调用,从而使 UART 锁定。
  • 验证其他驱动 omap-serial 也存在相同问题,通过在 BeagleBoard 上测试确认。
  • 与 Jonas Gorski 讨论后,决定 revert 提交并重新引入早期补丁,使相关驱动恢复正常。
  • 8250_pxa 驱动在大传输时会乱码,是因为每次 TX 中断时写入 FIFO 的字节数超过了安全值 32 字节。
  • 提交补丁修复 8250_pxa 驱动的问题时,在稳定内核中遇到 cherry-pick 冲突,经 Greg KH 帮助解决。
  • 意识到问题在 Linux 5.10 左右出现,之前的 8250_pxa 驱动工作正常。
  • 若一开始使用 8250_of 驱动可避免这些问题,该驱动能正确配置 TX FIFO。
    重要细节:
  • 给出了多个寄存器的值及含义,如 UART 的 LSR、IER、IIR 寄存器等。
  • 详细描述了各个驱动的相关函数和流程,如 pxa 驱动的 IRQ 处理、tx_empty()和 stop_tx()函数等。
  • 提及补丁系列已作为 Linux 6.10-rc6 的一部分发布,也将回溯到 6.9 和 6.6 版本。
  • 最后将回顾整个项目并总结所学。
阅读 10
0 条评论