您好!
我的项目使用以下 TI 芯片组。
SoC: AM62X SR1.0 GP Model: Texas Instruments K3 AM625 SoC
我已修改器件树以将数据包 DMA (PKTDMA)用于 UART。
&main_uart0 {
pinctrl-names = "default";
pinctrl-0 = <&main_uart0_pins_default>;
dmas = <&main_pktdma 0x4400 0>, <&main_pktdma 0xc400 0>;
dma-names = "rx", "tx";
};
根据 CONFIG_SERIAL_8250_DMA 的定义、RX DMA 函数在8250_omap.c 文件中是"OMAP_8250_Rx_DMA ()"、而在8250_dma.c 文件中不是"serial8250_Rx_dma ()"函数。
3.2.12. UART–Processor SDK AM62x 文档
通过使用 printk、我了解到 RX DMA 仅在 FIFO 有数据时进行设置、而是通过 UART IRQ 完成。
static void am654_8250_handle_rx_dma(struct uart_8250_port *up, u8 iir,
unsigned char status)
{
/*
* Queue a new transfer if FIFO has data.
*/
if ((status & (UART_LSR_DR | UART_LSR_BI)) &&
(up->ier & UART_IER_RDI)) {
omap_8250_rx_dma(up);
serial_out(up, UART_OMAP_EFR2, UART_OMAP_EFR2_TIMEOUT_BEHAVE);
}
我想了解以下 DMA 操作是否可以在该 SOC 上进行。
针对 UART RX DMA 进行一次性设置、然后让 UART 内核发送 DMA 请求、以便每当 RX FIFO 有数据而不需要 CPU 时启动 DMA 传输。
DMA 内核将继续前进到下一个缓冲区描述符、直到结束、 然后返回到循环模式下的第一个缓冲区描述符。
当然、DMA 内核需要能够在已传输多少数据时报告进度。
提出该要求的原因是、我们的测量数据将 以3.125Mbps 波特率从测量硬件连续流式传输。
产品需要满足每秒50,000次读数的要求。 因此、我们不希望系统每秒发生50,000个中断。
Rgds、
KC Wong