免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1903 | 回复: 0
打印 上一主题 下一主题

对Linux串口驱动文件s3c2410.c产生的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-17 15:54 |只看该作者 |倒序浏览
    首先说明的是:我是以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;
                        }
                }

     ...

}

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

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP