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.

[参考译文] AM625:具有 DMA 的 UART 在继续发送中需要更长时间

Guru**** 2366020 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1472428/am625-uart-with-dma-takes-longer-in-continues-sending

器件型号:AM625

工具/软件:  sdk-10.00.07.04

当配置为 DMA 时、与 不使用 DMA 时相比、AM62x 的串行端口在连续数据传输中表现出较低的效率。

详细步骤如下:

DTS 中的配置

uart4==>/dev/ttyS6

uart5==>/dev/ttyS7

&main_uart4 {
	bootph-all;
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&main_uart4_pins_default>;
	//dmas = <&main_pktdma 0x4404 0>, <&main_pktdma 0xc404 0>;
	//dma-names = "rx", "tx";
};

&main_uart5 {
	bootph-all;
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&main_uart5_pins_default>;
	dmas = <&main_pktdma 0x4405 0>, <&main_pktdma 0xc405 0>;
    dma-names = "rx", "tx";
};

2.测试代码

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>        //exit()
#include <signal.h>
#include <string.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <time.h>

#define SEND_PKG_SIZE 10000

#define BUF_SIZE 70

int baudSetOpt(int fd,int nSpeed,int nBits,char nEvent,int nStop);

int main(int argc, char *argv[])
{
	
	int uart_fd = 0;
	int baudrate = 0;
	//int sendCount = 0;
	int sendSize = BUF_SIZE;
	int count = 0;
	int ret = 0;
	int i = 0;
	
	unsigned char wBuf[BUF_SIZE];
	
	for(i = 0; i < BUF_SIZE; i++)
	{
		wBuf[i] = i & 0xFF;
	}
	
	//for(i = 0; i < BUF_SIZE; i++)
	//{
	//	if(i%16 == 0)
	//		printf("\n");
	//	printf("%d  ", wBuf[i]);
	//}
	
	if(argc != 3)
	{
		printf("param error !\n");
		printf("please input: ./main /dev/ttyS7 460800\n");
		return -1;
	}
	
	baudrate = atoi(argv[2]);

	uart_fd = open(argv[1], O_RDWR | O_NONBLOCK);
	if(uart_fd < 0)
	{
		printf("%s open file !\n",argv[1]);
		return -1;
	}
	
	ret = baudSetOpt(uart_fd, baudrate, 8, 'N', 1);
	if(ret == -1)
	{
		printf("%s set baudrate fail !\n", argv[1]);
		return -1;
	}
	
	long long int err_sum = 0;
	
	//记录时间戳
	unsigned long long int start_time = 0;
	time_t get_time = 0;	
	time(&get_time); //时间
	start_time = get_time;
	
	for(i=0; i<SEND_PKG_SIZE; i++)
	{
		count = 0;
		while(sendSize != count)
		{
			ret = write(uart_fd, &wBuf[count], sendSize-count);
			if(ret >= 0)
			{
				count += ret;
			}
			else
			{	
				err_sum++;
				//printf("ret = %d count = %d \n", ret, count);
				usleep(10000); //10ms
				
				//perror("write");
				//continue;
			}
		}
		//printf(" count = %d \n", count);
	}
	
	time(&get_time); //时间
	printf(" error times %lld, elapsed time %lld s\n", err_sum, get_time - start_time);	
	
	close(uart_fd);
	return 0;
}

int baudSetOpt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
{
	struct termios newtio;
	bzero( &newtio, sizeof( newtio ) );
	cfmakeraw(&newtio);
	tcflush(fd,TCIFLUSH);
	
	newtio.c_cflag &= ~CRTSCTS; // no stream ctrl
	newtio.c_cflag |= CLOCAL | CREAD;   /* | CRTSCTS //stream strl*/
	newtio.c_cflag &= ~CSIZE;
	switch( nBits )
	{
		case 7:
			newtio.c_cflag |= CS7;
			break;
		case 6:
			newtio.c_cflag |= CS6;
			break;
		case 5:
			newtio.c_cflag |= CS5;
			break;
		default:
			newtio.c_cflag |= CS8;
			break;

	}
	
	switch( nEvent )
	{
		case 'o':
		case 'O':
			newtio.c_cflag |= PARENB;
			newtio.c_cflag |= PARODD;
		//	newtio.c_iflag |= (INPCK | ISTRIP);
			break;
			
		case 'e':
		case 'E': 	

			newtio.c_cflag |= PARENB;
			newtio.c_cflag &= ~PARODD;		

			break;
		case 'n':
		case 'N':
			newtio.c_cflag &= ~PARENB;
			break;
		default:
			newtio.c_cflag |= PARENB;
			newtio.c_cflag &= ~PARODD;
			break;
	}
	
	switch( nSpeed )
	{
		case 300:
			cfsetispeed(&newtio, B300);
			cfsetospeed(&newtio, B300);
			break;				
		case 600:
			cfsetispeed(&newtio, B600);
			cfsetospeed(&newtio, B600);
			break;				
		case 1200:
			cfsetispeed(&newtio, B1200);
			cfsetospeed(&newtio, B1200);
			break;				
		case 2400:
			cfsetispeed(&newtio, B2400);
			cfsetospeed(&newtio, B2400);
			break;
		case 4800:
			cfsetispeed(&newtio, B4800);
			cfsetospeed(&newtio, B4800);
			break;
		case 9600:
			cfsetispeed(&newtio, B9600);
			cfsetospeed(&newtio, B9600);
			break;
		case 19200:
			cfsetispeed(&newtio, B19200);
			cfsetospeed(&newtio, B19200);
			break;
		case 38400:
			cfsetispeed(&newtio, B38400);
			cfsetospeed(&newtio, B38400);
			break;
		case 57600:
			cfsetispeed(&newtio, B57600);
			cfsetospeed(&newtio, B57600);
			break;
		case 115200:
			cfsetispeed(&newtio, B115200);
			cfsetospeed(&newtio, B115200);
			break;
		case 460800:
			cfsetispeed(&newtio, B460800);
			cfsetospeed(&newtio, B460800);
			break;
		default:
			cfsetispeed(&newtio, B9600);
			cfsetospeed(&newtio, B9600);
			break;
	}

	if( nStop == 1 )
	{
		newtio.c_cflag &=  ~CSTOPB;
	}
	else if ( nStop == 2 )
	{
		newtio.c_cflag |=  CSTOPB;
	}
	newtio.c_cc[VTIME]  = 1;
	newtio.c_cc[VMIN] = 1;
				
	newtio.c_oflag = 0;
	newtio.c_lflag |= 0;
	newtio.c_oflag &= ~OPOST;
	newtio.c_cc[VTIME] = 1;     /* unit: 1/10 second. */
	newtio.c_cc[VMIN] = 1;      /* minimal CHARacters for reading */
	
	if((tcsetattr(fd,TCSANOW,&newtio))!=0)
	{
		return -1;
	}
	
	return 0;	    
}
 

aarch64-oe-linux-gcc -mbranch-protection=standard --sysroot=/opt/arago-2023.10/sysroots/aarch64-oe-linux main.c -o main

3.测试结果

在460,800bps 下发送700,000字节。

root@am62xx-evm:/mnt/nfs/am62x# ./main /dev/ttyS6 460800
error times 1500, elapsed time 15 s

root@am62xx-evm:/mnt/nfs/am62x# ./main /dev/ttyS7 460800
error times 31604, elapsed time 318 s

错误时间表示写入失败返回-1次、写入失败后、帐户+1、睡眠10ms、然后再次写入。

使用 DMA 的 UART 需要更长时间、请帮助分析。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fuyi:

    众所周知、DMA 在 AM62x 上使用 UART 时表现不佳。 为什么在 UART 用例中需要 DMA?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hi Bin Liu、

    我们需要通过串行端口持续发送/接收大量数据。 在没有 DMA 的情况下、当与其他外设(例如 LCD、SDIO WiFi、SPI、I2C、USB、 NET 等)时、串行端口可能会产生大量的溢出/错误(OE)、从而导致器件功能异常。 我们在开发 AM335x 内核版本3.2时遇到此问题。 我们需要 UART DMA。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bin:

    UART 对于行业非常重要、对于医疗应用尤其如此。 由于这是一个已知问题、是否正在分析中、 是否有机会解决?

    是否有关于 DMA 结果的说明?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fuyi:

    DMA 通常是卸载 CPU、但并不意味着更快地传输数据、因此不会对溢出等问题产生影响。 由于 SoC 架构、ARM 系列和内核数量以及时钟速度等不同、AM625x 上的 UART 性能应比 AM335x 上的 UART 性能具有更大的差异

    在不使用 DMA 的 AM625x UART 上是否遇到任何问题?

    Tony、

    我们尚未对 AM62x UART 上的 DMA 性能进行任何深入分析。 我们有几个客户最初遇到了使用或不使用 DMA 的不同 UART 问题、但其中大多数(如果不是全部)最终在不使用 DMA 的情况下得到解决。 因此、无需紧急分析 DMA 在 UART 上的执行情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bin:

    #1。 由于应用需要以高达4Mbps 的速率运行、甚至以4Mbps 的速率运行3个端口、客户认为如果没有 DMA、则会导致 CPU 高负载 CPU 并丢弃数据。

    #2. 他们说、即使使用 i.MX8M Plus、如果不以4Mbps 的速率使用 DMA、也会丢弃数据。

    #3. 根据 AM335x 上的经验、DMA 有助于解决 UART 数据丢弃问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Tony、

    让我重新评估案例、然后与开发团队讨论。 我可能没有立即更新、因为我正在处理两周后即将发布的版本。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    客户在没有 DMA 的情况下进行了实验、得到如下异常结果:

    缩短要使用进行外部环回测试的 UART 上的 UART_TX 和 UART_RX。

    如下运行命令以循环 40次、10,000字节数据文件、4Mbps、环回模式。

    time serialcheck -b 4000000 -d /dev/ttyS3 -f ./binary_1W_ttyS3 -l 40 -m d

    理论上、在4Mbps 中传输400 000字节需要~1秒、但测试结果为 6m 57.35s

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tony:

    内核负责调度任务,因此实际传输时间会比理论时间慢,但7分钟似乎太慢了。 客户是否测量了它确实以4Mbps 的速率发送的 UART 输出? 我认为 TRM 列出的波特率为4M、无法确定如何为 UART 控制器配置'-b 4000000'参数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bin:

    分别测量的3Mbps 和4Mbps、遵循命令中的配置:

    3Mbps:

    4Mbps:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tony:

    我在我的 EVM 上进行了类似的测试、发现波特4Mbps 真的很慢、正如您所说、但波特3Mbps 或2Mbps 将在几秒钟内完成。

    检查 TRM、表12-113"UART 波特率设置"、最高波特率为3.6884Mbps、这是 DLH、DLL 寄存器设置为1时的情况。 因此、我认为将波特率设置为4Mbps 时 UART 控制器配置不正确、但我今天没时间了解 DLH、DLL 如何准确地设置为4Mbps。 我将在下周外出。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    BIN、

    是的、某些波特率的行为异常。 使用 SDK10.0进行串行检查来进行测试。

    波特率 直接通信 测试结果
    4Mbps 1. 异常
    3Mbps 3. 正常
    3.5Mbps 2. 正常
    2Mbps 3. 异常
    1.5Mbps 3. 异常
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Tony、 Bin 本周太糟糕了。 请预计回复将延迟到下周。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tony:

    如上所述、我们已经知道无法达到4Mbps。 2Mbps 和1.5Mbps、慢速传输或其他什么是"异常"?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bin:

    异常表示传输缓慢。  

    我们已经知道无法达到4Mbps。

    但从上图2中捕获了4Mbps 波形、并且数据正确。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tony:

    我看不到2Mbps 和1.5Mbps 的慢速传输。

    root@am62xx-evm:~# time serialcheck -d /dev/ttyS5 -f data-10k.dat -l 40 -m d -b 3000000
    [  100.423427] omap8250 2850000.serial: mdr1 mode 3, div 0x0181
    [  100.429282] omap8250 2850000.serial: mdr1 mode 0, div 0x0001
    Needed 38 reads 1 writes loops 40 / 40
    [  101.980038] omap8250 2850000.serial: mdr1 mode 3, div 0x0181
    cts: 0 dsr: 0 rng: 0 dcd: 0 rx: 400000 tx: 400000 frame 0 ovr 0 par: 0 brk: 0 buf_ovrr: 0
    real    0m 1.59s
    user    0m 0.00s
    sys     0m 0.09s
    root@am62xx-evm:~# time serialcheck -d /dev/ttyS5 -f data-10k.dat -l 40 -m d -b 2000000
    [  113.447662] omap8250 2850000.serial: mdr1 mode 3, div 0x0181
    [  113.453514] omap8250 2850000.serial: mdr1 mode 3, div 0x0002
    Needed 38 reads 1 writes loops 40 / 40
    [  115.905578] omap8250 2850000.serial: mdr1 mode 3, div 0x0181
    cts: 0 dsr: 0 rng: 0 dcd: 0 rx: 400000 tx: 400000 frame 0 ovr 0 par: 0 brk: 0 buf_ovrr: 0
    real    0m 2.49s
    user    0m 0.01s
    sys     0m 0.14s
    root@am62xx-evm:~# time serialcheck -d /dev/ttyS5 -f data-10k.dat -l 40 -m d -b 1500000
    [  128.485086] omap8250 2850000.serial: mdr1 mode 3, div 0x0181
    [  128.490943] omap8250 2850000.serial: mdr1 mode 0, div 0x0002
    Needed 38 reads 1 writes loops 40 / 40
    [  131.350892] omap8250 2850000.serial: mdr1 mode 3, div 0x0181
    
    cts: 0 dsr: 0 rng: 0 dcd: 0 rx: 400000 tx: 400000 frame 0 ovr 0 par: 0 brk: 0 buf_ovrr: 0
    real    0m 2.89s
    user    0m 0.00s
    sys     0m 0.16s

    我向内核 UART 驱动程序添加了以下补丁来查看波特率的配置方式。

    diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
    index bef71a627a94..6b795bbce680 100644
    --- a/drivers/tty/serial/8250/8250_omap.c
    +++ b/drivers/tty/serial/8250/8250_omap.c
    @@ -275,6 +275,7 @@ static void omap_8250_get_divisor(struct uart_port *port, unsigned int baud,
                    priv->mdr1 = UART_OMAP_MDR1_13X_MODE;
                    priv->quot = div_13;
            }
    +       dev_info(port->dev, "mdr1 mode %d, div 0x%04x\n", priv->mdr1, priv->quot);
     }
     
     static void omap8250_update_scr(struct uart_8250_port *up,

    请参阅 TRM 中的波特率表12-113、最大波特率为3.6884Mbps、DLH/DLL 配置为1并使用13x 波特率倍数。 无法配置为4Mbps。 尝试4Mbps 时、您可以看到 stty 命令失败:

    root@am62xx-evm:~# stty -F /dev/ttyS5 3000000
    [  836.673468] omap8250 2850000.serial: mdr1 mode 3, div 0x0181
    [  836.679525] omap8250 2850000.serial: mdr1 mode 0, div 0x0001
    root@am62xx-evm:~# 
    root@am62xx-evm:~# stty -F /dev/ttyS5 4000000                                                                                                                                                                                                                                                                                                                                                                                             
    [  842.230615] omap8250 2850000.serial: mdr1 mode 0, div 0x0001
    [  842.236556] omap8250 2850000.serial: mdr1 mode 0, div 0x0001
    stty: /dev/ttyS5: unable to perform all requested operations
    

    此后 UART 模块可能处于错误状态、那么您的2Mbps 和1.5Mbps 速度测试就会失败? 请在重新启动电路板后立即尝试2M 和1.5M。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bin:

    1.主测试项 :同时操作4个串行端口(460800波特)和1个串行端口(115200波特)

    serialcheck -b 115200 -d /dev/ttyS3 -f ./binary_1W_ttyS3 -l 696729 -m d &
    serialcheck -b 460800 -d /dev/ttyS4 -f ./binary_1W_ttyS4 -l 2786918 -m d &
    serialcheck -b 460800 -d /dev/ttyS6 -f ./binary_1W_ttyS6 -l 2786918 -m d &
    serialcheck -b 460800 -d /dev/ttyS7 -f ./binary_1W_ttyS7 -l 2786918 -m d &
    serialcheck -b 460800 -d /dev/ttyS8 -f ./binary_1W_ttyS8 -l 2786918 -m d &

    2.干扰测试项目 :切换有线网络接口卡(NIC)

    ./ eth_up_down.sh &

    #!/bin/sh
    
    for (( ; ; ))
    	do
    		ifconfig eth0 down
    		sleep 1
    
    		ifconfig eth0 up
    		sleep 1
    	done

    3.测试结果 :测试失败

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fuyi:

    该问题可能是由于 Linux 中的中断延迟造成的。 您是否使用 RT-Linux? RT-Linux 应提供更好的延迟性能。

    如果 RT-Linux 中仍然出现问题、并且您使用的 AM625x 器件具有多个 A53内核、则可以尝试使用 IRQ 亲和性。

    默认情况下、Linux 使用 CPU0来处理 IRQ、如果同时发生大量中断、则会出现延迟问题。 IRQ 亲和性将一些 IRQ 处理移至其他 CPU、这可以提高延迟性能。 例如、以下过程会将 uart0 IRQ 处理移至 CPU3。

    root@am62xx-evm:~# grep serial /proc/interrupts
    238:       1498          0          0          0     GICv3 210 Level     2800000.serial
    239:          0          0          0          0   pinctrl 456 Edge      2800000.serial:wakeup
    root@am62xx-evm:~# echo 3 >  /proc/irq/238/smp_affinity_list
    root@am62xx-evm:~# grep serial /proc/interrupts
    238:       1656          0          0         11     GICv3 210 Level     2800000.serial
    239:          0          0          0          0   pinctrl 456 Edge      2800000.serial:wakeup

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fuyi:

    请查看下面链接的文章、将 RX FIFO 触发从48字节减少到16字节可解决此客户的数据丢失问题。

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1488925/am625-how-to-enable-uart-dma-in-rt-linux/5743531#5743531

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    鉴于此主题的主题是4Mbps 支持、客户接受 TRM 不支持4Mbps。 让我们开始另一个主题来进一步讨论 UART 问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bin:

    RX FIFO 触发信号从48个字节减少到16个字节。

    将串行端口中断分配给另一个 CPU。

    使用 RT-Linux 进行测试。

    这三种方法都不起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fuyi:

    您能提醒一下、我们在这篇主题中讨论的问题到底是什么?

    在您的第一篇文章中、您说 UART DMA 传输需要很长时间才能完成、然后我说不使用 UART DMA。

    Tony 说、您在没有 DMA 的情况下以4Mbps 波特率进行了测试、速度很慢;我说不支持4Mbps 波特率。

    最后、大约3周前、您同时测试了多个 UART 以及切换网络、测试失败(您没有说明失败的原因)。

    Tony 还创建了一个新的 e2e 主题(链接如下)。 它适用于您的项目、对吧?

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1502417/am625-run-multiple-serialcheck-hang-over-half-hours

    我想我现在有点迷路了。 请阐明您遇到的 UART 问题以及我们需要重点关注的方面。 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fuyi:

    Tony 和我离线同步、现在我更好地了解了您的项目。

    我找到了一个内核黑客补丁、我为 UART DMA 问题创建了一段时间。 您能否在启用所有 UART DMA 的情况下对其进行测试、看看它是否修复了您的原始 DMA 慢速问题?

    diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
    index 0b9c47172bc8..0952f08622c9 100644
    --- a/drivers/tty/serial/8250/8250_omap.c
    +++ b/drivers/tty/serial/8250/8250_omap.c
    @@ -1042,6 +1042,10 @@ static int omap_8250_tx_dma(struct uart_8250_port *p)
            unsigned int    skip_byte = 0;
            int ret;
     
    +       /* HACK: do not use DMA for TX */
    +       ret = -EINVAL;
    +       goto err;
    +
            if (dma->tx_running)
                    return 0;
            if (uart_tx_stopped(&p->port) || uart_circ_empty(xmit)) {

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Bin

    抱歉。

    我把它解决了。

    1.https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1472428/am625-uart-with-dma-takes-longer-in-continues-sending/5652059
    当前链路仅解决 UART 中的慢速 DMA 性能问题。

     2. https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1502417/am625-run-multiple-serialcheck-hang-over-half-hours
    此链接中讨论的问题与我遇到的问题相同:串行端口缺少 DMA 配置。

     3. https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1504677/am625-run-multiple-serial-ports-simultaneously-and-toggle-the-wired-nic-to-introduce-interference 
    此链接讨论了多个串行端口同时运行以及 NIC 切换问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fuyi:

    感谢您的澄清。 请测试上面的内核补丁、并告诉我它是否修复了您最初遇到的 DMA Slow 问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Bin
    添加这两行代码后、通过 DMA 发送数据的时间消耗似乎是正常现象。 我目前正在使用此 TI 论坛主题中概述的方法测试串行端口 DMA 功能:

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1504677/am625-run-multiple-serial-ports-simultaneously-and-toggle-the-wired-nic-to-introduce-interference

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fuyi:

    感谢您的更新。 期待下一个测试结果。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tony:

    昨天似乎您编辑了几次该线程、但我无法告诉您修改的确切内容。 如果有任何我应该知道的重要新信息、请告诉我。