在这里列出的设备文件树中我们可以看到一个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
驱动程序在这里声明
为什么uarta
需要interrupts
部分?它是否产生或接收中断?我的猜测是,它产生了软件中断:当它向串行写入内容时,它触发了一个中断。但是为什么这个中断必须在设备树中列出呢?这个中断的代码在哪里?
上面代码块(reg = <0x0 0x70006000 0x0 0x40>
)的第二行指的是一个局部地址。这个地址到底是什么?如果我理解正确的话,这是8250_UART设备的地址,但是我想知道这个地址的哪一部分做什么,以及内核如何与这个芯片对话。
驱动程序文档可在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模式下使用DMA
内存地址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