串行驱动程序start_tx()操作被称为单次写入两次

时间:2012-03-23 15:45:56

标签: linux-kernel serial-port linux-device-driver

在什么情况下,可以在linux 2.6串行驱动程序上快速连续调用两次uart_ops.start_tx()操作?

2 个答案:

答案 0 :(得分:1)

任何时候都应该快速连续地调用它。如果由竞争处理器完成,start_tx()会在port->lock上执行自旋锁定。如果按顺序执行,则特定于uart的驱动程序将检查它是否已经启动。 (来自linux-2.6.27.8/drivers/mmc/card/sdio_uart.c):

    if (!(port->ier & UART_IER_THRI)) {
            port->ier |= UART_IER_THRI;
            sdio_out(port, UART_IER, port->ier);
    }

从更高层次的角度来看,串行核心会检查发射器是否已经启动,以及启动发射器的适当性(linux-2.6.27.8/drivers/serial/serial_core.c):

static void __uart_start(struct tty_struct *tty)
{
        struct uart_state *state = tty->driver_data;
        struct uart_port *port = state->port;

        if (!uart_circ_empty(&state->info->xmit) && state->info->xmit.buf &&
            !tty->stopped && !tty->hw_stopped)
                port->ops->start_tx(port);
}

答案 1 :(得分:0)

我在旧版内核2.6.10上工作。我也看到过2次(或更多次)调用驱动程序的start_tx函数,假设用户空间有'写'。通过stty,我关掉了tty层中的任何'opost'。之后,我看到每次写入只有一个start_tx。我怀疑行规则层正在添加对start_tx的调用。

我知道轶事,但认为这可能会有所帮助。