我正在尝试使用FIFO寄存器创建UART_read函数,但我无法理解它是如何工作的。据我所知,它允许我每次读取更多的字符,因此这意味着读取会中断处理器的次数减少,但启用它后我究竟如何使用它?我无法在任何地方找到例子。我目前的职能是:
unsigned char UART_read(void){
unsigned int buf;
while( ( ( inb(UART_LSR + UART) ) & UART_LSR_DR ) == 0 ){
schedule();
}
buf = inb(UART);
return (char)buf;
}
答案 0 :(得分:2)
我可以引导您获取两种信息来源; UART数据表和Linux串行驱动程序(Linux内核源代码树中的drivers / tty / serial / 8250 /目录,主要是8250.c源文件)。
德州仪器(TI)在 http://www.ti.com/lit/gpn/ns16c552
提供了一张此类UART数据表在第9章中,我认为它对FIFO模式操作有很好的描述。基本上,接收数据有两种类型的中断;一个用于当接收fifo中的未读数据量达到设定的阈值水平时(通常应小于FIFO大小,以允许OS在更多数据到达之前读取接收到的字符一段时间),另一个用于当有一些数据时,但不足以提高FIFO中的“缓冲区已满”警报一段时间。后者是让操作系统在合理的时间内收到收到的单个字符。
当OS接收到这些中断时,它通常应该从FIFO中读取尽可能多的字符(使用状态寄存器位来指示是否还有更多数据要读取)。
类似地,在发送时,OS可以写入发送FIFO,直到它收到FIFO已满的指示。 UART稍后将生成一个中断,以告知发送FIFO有一定的空间(可再次配置)。
但请注意,如果您在Linux中将代码编写为用户空间代码(即作为常规应用程序),则无法接收中断。另一方面,如果您正在编写自己的驱动程序,则必须确保它是您的驱动程序,声称您正在与之交互的UART,而不是默认的8250.c UART驱动程序。
答案 1 :(得分:0)
这取决于您的注册手册,
通常,FIFO寄存器的长度为32位,但只有少量低位可用或有意义。
因此,您可以通过设置32位长FIFO中可用或有意义的位数来获得更多字符。应该有一些地方可以设置它。