展锐串口驱动处理

驱动是在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);  //这个是批量上报到用户空间
}
如果需要做些定制,可以从这个循环这边修改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值