为啥设备树必须列出 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 = <0x0 0x70006000 0x0 0x40>
)指的是一个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 设备的中断?的主要内容,如果未能解决你的问题,请参考以下文章