为啥设备树必须列出 UART 设备的中断?

Posted

技术标签:

【中文标题】为啥设备树必须列出 UART 设备的中断?【英文标题】:Why does the device tree have to list interrupts for a UART device?为什么设备树必须列出 UART 设备的中断? 【发布时间】:2021-10-01 10:01:28 【问题描述】:

在设备文件树listed here我们可以看到一个UART设备:

uarta: serial@70006000 
    compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart";
    reg = <0x0 0x70006000 0x0 0x40>;
    reg-shift = <2>;
    interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&tegra_car TEGRA210_CLK_UARTA>;
    clock-names = "serial";
    resets = <&tegra_car 6>;
    reset-names = "serial";
    dmas = <&apbdma 8>, <&apbdma 8>;
    dma-names = "rx", "tx";
    status = "disabled";
;

tegra210-uart 驱动程序声明为here

为什么uarta 需要interrupts 部分?它是否产生或接收中断?我的猜测是它会产生软件中断:当它向串行写入内容时,它会触发中断。但是为什么一定要在设备树中列出这个中断呢?这个中断的代码在哪里?

上述代码块的第二行(reg = &lt;0x0 0x70006000 0x0 0x40&gt;)指的是一个uart地址。这个地址具体是什么?如果我理解正确,这是8250_UART 设备的地址,但我想知道这个地址的哪些部分做什么,以及内核如何与这个芯片通信。

【问题讨论】:

我很想知道您为哪个设备调查此类 UART 支持。 【参考方案1】:

驱动程序文档位于https://www.kernel.org/doc/Documentation/devicetree/bindings/serial/nvidia%2Ctegra20-hsuart.txt

根据本论坛https://forums.developer.nvidia.com/t/enabling-interrupts-for-uart-xavier-agx/166269 中断用于防止对 UART 进行定期轮询。

在此中断上注册处理程序允许仅在接收到有效数据并且在 DMA 缓冲区中可用时运行代码,或者当 DMA 中提供的完整传出消息已发送时。此类 DMA 使用示例可在以下位置获得:UART Tx mode with DMA enabled

内存地址 0x70006000 是 UARTA 控制器寄存器的基本位置(Tegra 2 中有 4 个 UART [A,B,C,D]),用于写入命令或读取状态。这些文件可能有助于理解:

https://docs.freebsd.org/en/articles/serial-uart/index.html https://www.lammertbies.nl/comm/info/serial-uart

例如,暂存寄存器 (SCR +0x07) 可用于写和读回任何字节,以测试 UART 是否存在以及控制器是否按预期运行。

我建议您下载参考文档,第 22 章 UART,可从https://developer.nvidia.com/embedded/tegra-2-reference 获得

【讨论】:

@guerlando-ocs 您对我的回答有何看法?够详细吗? 但是为什么中断信息需要包含在设备树中呢?它可以直接包含在驱动程序中吗? 驱动代码对于任何 UART 兼容设备都是通用的,但不同的供应商可能使用不同的中断号。这就是为什么可以在设备描述符中配置中断。

以上是关于为啥设备树必须列出 UART 设备的中断?的主要内容,如果未能解决你的问题,请参考以下文章

am5728开启uart0接口通讯

设备树中的中断节点以及相关函数-28

设备树DTS 学习:2-设备树语法

Linux设备树(四 中断)

linux设备树-中断控制器驱动

如何在uboot下列出使用的设备树信息?