2.7.1 对串行口进行设置
把两个串行口中断服务程序与IDT相挂接,然后根据tty_table数据结构中的内容对这两个串行口进行初始化设置,包括设置线路控制寄存器的DLAB 位、设置发送的波特率因子、设置DTR和RTS……最后,允许主8259A 芯片的IRQ3和IRQ4 发送中断请求。
挂接的具体过程及挂接后的效果如图2-13所示。
执行代码如下:
- //代码路径:kernel/chr_dev/serial.c:
- void rs_init(void)
- {
- set_intr_gate(0x24,rs1_interrupt); //设置串行口1中断,参看2.5
- set_intr_gate(0x23,rs2_interrupt); //设置串行口2中断
- init(tty_table[1].read_q.data); //初始化串行口1
- init(tty_table[2].read_q.data); //初始化串行口2
- outb(inb_p(0x21)&0xE7,0x21); //允许IRQ3,IRQ4
- }
两个串行口中断处理程序与IDT的挂接函数set_intr_gate()与2.5中介绍过的set_trap_gate()函数类似,可参看前面对set_trap_gate()函数的讲解。它们的差别是set_trap_gate()函数的type是15(二进制的1111),而set_intr_gate()的type是14(二进制的1110)。