星闪夜空 发表于 2012-12-17 15:54

对Linux串口驱动文件s3c2410.c产生的疑问

    首先说明的是:我是以Linux-2.6.22内核中的 /drivers/serial/s3c2410.c 文件来提出自己的疑问的。

   对于该文件里的判断发送缓冲区是否为空的函数如下:
static unsigned int s3c24xx_serial_tx_empty(struct uart_port *port)
{
        struct s3c24xx_uart_info *info = s3c24xx_port_to_info(port);
        unsigned long ufstat = rd_regl(port, S3C2410_UFSTAT);          //用于判断FIFO是否已满
        unsigned long ufcon = rd_regl(port, S3C2410_UFCON);         //设置是否使用FIFO

        if (ufcon & S3C2410_UFCON_FIFOMODE) {                           //使用FIFO
                if ((ufstat & info->tx_fifomask) != 0 ||                      //表明发送缓冲区不为空
                  (ufstat & info->tx_fifofull))                                 //表明发送缓冲区已满
                        return 0;                                                    //表明有数据

                return 1;                                                               //表明没有数据
        }

        return s3c24xx_serial_txempty_nofifo(port);
}

   再来看s3c24xx_serial_txempty_nofifo这个函数:
static int s3c24xx_serial_txempty_nofifo(struct uart_port *port)
{
        return (rd_regl(port, S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE);
}
其中 #define S3C2410_UTRSTAT_TXE          (1<<2)    表明缓冲区中没有数据


从中可以得出这样的结论:返回1表明没有数据,返回0表明有数据。

但是这样问题就来了,接下来看接收中断处理函数如下:
static irqreturn_t
s3c24xx_serial_rx_chars(int irq, void *dev_id)
{
      ...
   
      if (port->flags & UPF_CONS_FLOW) {                                                         //使用流控
                        int txe = s3c24xx_serial_txempty_nofifo(port);

                        if (rx_enabled(port)) {      //如果端口为使能接收状态
                                if (!txe) {                                                //表明发送缓冲区有数据   ???(接下来的语句就解释不通了)
                                        rx_enabled(port) = 0;
                                        continue;
                                }
                        } else {                           //如果端口为禁止接收状态
                                if (txe) {                                                   //表明发送缓冲区没有数据???(接下来的语句就解释不通了)
                                        ufcon |= S3C2410_UFCON_RESETRX;
                                        wr_regl(port, S3C2410_UFCON, ufcon);
                                        rx_enabled(port) = 1;
                                        goto out;
                                }
                                continue;
                        }
                }

   ...

}

不知道自己的分析错在哪里???还请大家指教一下!!!

页: [1]
查看完整版本: 对Linux串口驱动文件s3c2410.c产生的疑问