|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
前一阶段一直在看串口驱动程序,但是对于其工作流程一直有个疑问?请指教!
对于串口驱动程序的执行流程大致是这样的:
1)判断当前使用的UART是什么类型的?如果是16550A才可以使用FIFO,因为别的类型的UART要么不支持FIFO,要么在使用FIFO时有BUG.
2)如果当前使用的UART是16550A那么就打开FIFO功能,并且初始化别的一些寄存器,包括打开中断使能位(UART_IER).但是对于不同版本的linux打开UART_IER的中断使能位各不相同,对于linux0.11它除了写中断外其它中断都开.而对于linux0.98版本,它把UART_IER中的所有中断都打开了!(大家可以参考一下0.98版本linux/kernel/serial.c L467 outb_p(0x0f,UART_IER + port)
这两种初始化方式对于整个串口在发送数据时的流程会造成很大的差异!
对于0.11版本而言,如果用户想要通过串口发送数据的话,那么它只要把UART_IER中的写中断打开,然后等待中断发生,在中断处理程序中把需要发送的数据发送出去!
而对于0.98版本而言,如果用户想要通过口串口数据的话,那么它只要把数据放到FIFO中,一旦FIFO中的数据到达一定的量后就会触发中断(这个量是由初始化时向FCR寄存器写入的,好像最大是14),然后由中断处理程序再发送数据.
我自己在写串口驱动程序的时候发现一旦UARE_IER中的写中断打开,系统立即会发生一个中断,从IIR中判断出发生这个中断是由THR产生的,也就是用户可以向串口写数据了!也即证明了linux0.11版本的机制是正确的!而0.98版本的机制好像不正确,不知我理解的对不对?
(linux0.11版本和linux0.98版本可以在www.oldlinux.org下载)
|
|