This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件: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
,从哪里下载 SDK 5.0.0.15? 顺便说一下,在测试期间、只有调试控制台(uart0)和 uart4同时使用、只有 uart4正在尝试使用 DMA。 我不知道这是不是问题。 从何处获取错误详细信息?
您好!
[引用 user="user4248043"]uart4:serial@481a8000{
(笑声)
DMA =<&EDMA 34>、<&EDMA 35>;
dma-names ="TX"、"Rx";
};[/报价]
您是否添加了这些 DMA 通道? 我在 Processor SDK Linux v5.2.0.10的内核源代码中看不到它们。
您好!
对 UART3使用通道34和35不正确。 请查看 TRM 表11-23以了解 EDMA 事件、34和35未连接到 UART3。 您应该参阅表11-24并使用 EDMA 交叉开关通道7和8。
[引用 user="user4248043"]我在内核 menuconfig 中启用了"DMA 引擎调试和 DMA 引擎详细调试"。[/quot]
这不是检查 DMA 的最佳方法、它会在日志中启用批次消息。 我将以一种简单的方式在内核中添加一条调试消息作为下面的补丁。
diff -git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c index 2bb0b092bff2..873121c728tty 100644 -- a/drivers/tty/serial/8250/8250_omap.c index + @@@@ 8b_tid_t_tid_port/8250 tid_r_r_port_tids/static t_t_port_port_r_en_tid_644/tid_t_t_r_r_tid_t_t_t_r_r_port_r_tids/ if (计数< dma->rx_size) dmaengine_terminate_async (dma->rxchan); + dev_info (p->port.dev、"DMA Rx %d 字节\n"、count); RET = tty_insert_flip_string (tty_port、dma->rx_buf、count); p->port.icount.rx +=转台
然后使用一根导线回看 UART4 RX 和 TX 引脚、在串行控制台上运行以下命令、将50个字节传输到 UART4。
root@AM335x-EVM:~# echo "12345678901234567890123456789012345678901234567890123456789012345678901234567890">/dev/ttyS4
然后、您应该会看到以下显示 DMA 接收48字节的内核日志。
[411.074237] omap8250 481a8000.serial: DMA Rx 48字节
[411.079405] omap8250 481a8000.serial: DMA Rx 0字节
[411.094727] omap8250 481a8000.serial: DMA Rx 0字节
请注意、UART 的 DMA 一次只移动48字节数据、DMA 不会完成任何传输提醒。