打印
[技术问答]

NUC980 串口设置1200及以下波特率时无法设置成功

[复制链接]
292|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
内核版本:
使用的就是github上最新的内核
在内核驱动代码nuc980_serial.c文件里的nuc980serial_set_termios函数里加入一条打印信息:
static void
nuc980serial_set_termios(struct uart_port *port, struct ktermios *termios, struct ktermios *old)
{
    struct uart_nuc980_port *up = (struct uart_nuc980_port *)port;
    unsigned int lcr = 0;
    unsigned long flags;
    unsigned int baud, quot;

    switch (termios->c_cflag & CSIZE) {
    case CS5:
        lcr = 0;
        break;
    case CS6:
        lcr |= 1;
        break;
    case CS7:
        lcr |= 2;
        break;
    default:
    case CS8:
        lcr |= 3;
        break;
    }

    if (termios->c_cflag & CSTOPB)
        lcr |= NSB;
    if (termios->c_cflag & PARENB)
        lcr |= PBE;
    if (!(termios->c_cflag & PARODD))
        lcr |= EPE;
    if (termios->c_cflag & CMSPAR)
        lcr |= SPE;

    baud = uart_get_baud_rate(port, termios, old, port->uartclk / 0xffff, port->uartclk / 11);
    quot = nuc980serial_get_divisor(port, baud);
    printk("in nuc980serial_set_termios, quot = %d, baud = %d \n", quot, baud); //增加这一条打印信息
    /*
     * Ok, we're now changing the port state.  Do it with
     * interrupts disabled.
     */
    spin_lock_irqsave(&up->port.lock, flags);

    up->port.read_status_mask = RX_OVER_IF /*| UART_LSR_THRE | UART_LSR_DR*/;
    if (termios->c_iflag & INPCK)
        up->port.read_status_mask |= FEF | PEF;
    if (termios->c_iflag & (BRKINT | PARMRK))
        up->port.read_status_mask |= BIF;

    /*
     * Characteres to ignore
     */
    up->port.ignore_status_mask = 0;
    if (termios->c_iflag & IGNPAR)
        up->port.ignore_status_mask |= FEF | PEF;
    if (termios->c_iflag & IGNBRK) {
        up->port.ignore_status_mask |= BIF;
        /*
         * If we're ignoring parity and break indicators,
         * ignore overruns too (for real raw support).
         */
        if (termios->c_iflag & IGNPAR)
            up->port.ignore_status_mask |= RX_OVER_IF;
    }

    if (termios->c_cflag & CRTSCTS)
        up->mcr |= UART_MCR_AFE;
    else
        up->mcr &= ~UART_MCR_AFE;

    nuc980serial_set_mctrl(&up->port, up->port.mctrl);

    serial_out(up, UART_REG_BAUD, quot | 0x30000000);

    serial_out(up, UART_REG_LCR, lcr);

    spin_unlock_irqrestore(&up->port.lock, flags);


}


然后重新编译内核,下载重启后,通过应用程序设置波特率,设置1200波特率及以下波特率时,
这个打印的波特率就一直是9600
请问这个问题应该如何解决?
谢谢!

使用特权

评论回复
沙发
AloneKaven| | 2024-12-10 10:45 | 只看该作者
是不是没办法设置太低啊?

使用特权

评论回复
板凳
stormwind123| | 2024-12-10 11:00 | 只看该作者
估计是配置错误

使用特权

评论回复
地板
flycamelaaa| | 2024-12-10 13:00 | 只看该作者
串口驱动程序或相关软件可能存在bug

使用特权

评论回复
5
probedog| | 2024-12-10 14:00 | 只看该作者
串口硬件连接不稳定或存在干扰

使用特权

评论回复
6
classroom| | 2024-12-10 16:00 | 只看该作者
检查串口配置参数是否都正确无误。

使用特权

评论回复
7
两只袜子| | 2024-12-10 19:00 | 只看该作者
更新驱动程序和软件

使用特权

评论回复
8
jcky001| | 2024-12-10 20:00 | 只看该作者
看看串口连接有没有松动或接触不良的情况。

使用特权

评论回复
9
riplay| | 2024-12-11 08:28 | 只看该作者
需要把驱动中修改clk source从upll到xin就可以了。
修改 drivers/tty/serial/nuc980_serial.c,如下位置

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

567

主题

2517

帖子

4

粉丝