- 论坛徽章:
- 0
|
首先说明的是:我是以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;
}
}
...
}
不知道自己的分析错在哪里???还请大家指教一下!!!
|
|