工具/软件:Linux
您好!
我有一个 Beagle boneback Devkit、它配备了 am3359。 它使用从最新 SDK "ti-processor-sdk-linux-am335x-evm-05.02.00.10"编译的 uboot 和内核运行。 因此、内核版本号为'4.14.79'。
我将 Devkit 的 UART4连接到我的主机 PC (通过 USB2RS232转换器)。 通过将连续字节从 PC 发送到 Devkit 的 UART4,我发现 uart4的 RX DMA 永远不起作用,这意味着它接收到的每个字节都是通过轮询(serial8250_Rx_chars )而不是 DMA 来实现的。
以下是我的 DTS 配置的一部分:
uart4_pins:pinmux_uart4_pins{
pinctrl-single、pins =<
0x70 (PIN_INPUT_PULLUP | MUX_MODE6)/* GPMC_wait0.uart4_RxD *
0x74 (PIN_OUTPUT 下拉| MUX_MODE6)/* GPMC_WPN.uart4_TXD *
>;
};
uart4{(&U)
pinctrl-names ="default";
pinctrl-0 =<uart4_PINs>;
状态="正常";
};
uart4:串行@481a8000{
兼容="ti、OMAP3-UART";
ti、hwmods ="uart5";
时钟频率=<48000000>;
reg =<0x481a8000 0x2000>;
reg-shift =<2>;
中断=<45>;
STATUS ="禁用";
DMA =<&EDMA 34>、<&EDMA 35>;
dma-names ="TX"、"Rx";
};
通过搜索整个 DTS 文件(DTS 和 dtsi)、我确认了信道34和35从未被其他功能引用。
我在8250_omap.c 中添加了一些 printk、并有一些发现:
每次通信 Rx char 时、都会按顺序调用以下堆栈:
OMAP-8250_Handle_Rx_DMA >> Handle_Rx_DMA >> OMAP-8250_Rx_DMA_FLUSH >> serial8250_Rx_CHARs >> OMAP-8250_Rx_DMA
看起来、DMA 从站已经准备好并始终等待传入字节、但当中断到达时、DMA 从站将被清空、清空时不会将任何内容插入 TTY 缓冲区。
然后、FIFO 中剩余的所有字符都由'serial8250_Rx_chars'读取。
同样、为下一个 DMA 准备了一个新的从器件、它仍在下一个中断时被清空、该 DMA 也不会传输任何字节。
在整个测试中、DMA 不会传输 PC 到 Devkit 的任何字节、它们都在'serial8250_rx_chars '中逐一读取。
随附的'end.c'和'resc.c'是我的测试程序。 'end.c'在 PC (Ubuntu)上运行、而'rescv.c'在 Devkit (AM335x)上运行。
我们将感谢您的任何帮助。
e2e.ti.com/.../recv.ce2e.ti.com/.../2783.send.c
此致、
XJ