驱动是在drivers/tty/serial/sprd_serial.c
如果要开dma,是在dts中配置
&uart0 {
status = "okay";
dma-names= "rx","tx"; //开dma加上
dmas = <&ap_dma 10 &ap_dma 11>; //开dma加上,具体数字要找手册查
};
以下是非dma数据的接收循环
static inline void sprd_rx(struct uart_port *port)
{
struct sprd_uart_port *sp = container_of(port, struct sprd_uart_port,
port);
struct tty_port *tty = &port->state->port;
unsigned int ch, flag, lsr, max_count = SPRD_TIMEOUT; //这个是一个大的数,作为超时退出机制
if (sp->rx_dma.enable) {
sprd_uart_dma_irq(port);
return;
}
while ((serial_in(port, SPRD_STS1) & SPRD_RX_FIFO_CNT_MASK) &&
max_count--) {
lsr = serial_in(port, SPRD_LSR);
ch = serial_in(port, SPRD_RXD);
flag = TTY_NORMAL;
port->icount.rx++;
if (lsr & (SPRD_LSR_BI | SPRD_LSR_PE |
SPRD_LSR_FE | SPRD_LSR_OE))
if (handle_lsr_errors(port, &flag, &lsr))
continue;
if (uart_handle_sysrq_char(port, ch))
continue;
uart_insert_char(port, lsr, SPRD_LSR_OE, ch, flag); //循环接收单个数据
}
tty_flip_buffer_push(tty); //这个是批量上报到用户空间
}
如果需要做些定制,可以从这个循环这边修改。