串行通讯控制器8250

 
PC 机自带两个串口,分为 COM1 COM2 ,地址分别在 3F 8-3FFH 2F 8-2FFH ,接口芯片选用 8250 8250 片内有 10 个寄存器,其中有几个是共用地址的,其识别由线路控制寄存器( LCR )的最高位 DLAB 来决定。各寄存器的地址和格式如下所示: .
 
表 4.9 8250寄存器地址
DLAB
A2
A1
A0
I/O口地址
对应寄存器
0
0
0
0
3F8H( 2F8H)
发送端数据寄存器
0
0
0
0
3F8H( 2F8H)
接受端数据寄存器
1
0
0
0
3F8H( 2F8H)
波特率因子寄存器(低 8位)
1
0
0
1
3F9H( 2F9H)
波特率因子寄存器(高 8位)
0
0
0
1
3F9H( 2F9H)
中断允许寄存器( IER)
X
0
1
0
3FAH( 2FAH)
中断识别寄存器( IIR)
X
0
1
1
3FBH( 2FBH)
线路控制寄存器( LCR)
X
1
0
0
3FCH( 2FCH)
MODEM控制寄存器( MCR)
X
1
0
1
3FDH( 2FDH)
线路状态寄存器( LSR)
X
1
1
0
3FEH( 2FEH)
MODEM状态寄存器
X
1
1
1
3FFH( 2FFH)
保留

 

 

8250 在正常通信之前,需要先设定波特率因子寄存器,它决定传输数据的速率。对使用1.8432MHZ的基准时钟输入时,波特率因子寄存器设置要求为:
 
波特率因子=1843200÷(16×波特率)
 
主要波特率因子取值和相应的波特率如表4.10:
 
表4.10 波特率因子取值表
波特率
波特率因子寄存器
MSB
LSB
300
01H
80H
600
00H
C0H
1200
00H
60H
2400
00H
30H
4800
00H
18H
9600
00H
0CH

 设置好波特率因子寄存器后,要先恢复LCRDLAB0才能正常通信。

 linux串口的初始化

static void init(int port)
{
 outb_p(0x80,port+3);            /* set DLAB of line control reg *///
 outb_p(0x30,port);                  /* LS of divisor (48 -> 2400 bps */
 outb_p(0x00,port+1);              /* MS of divisor */
 outb_p(0x03,port+3);             /* reset DLAB */
 outb_p(0x0b,port+4);              /* set DTR,RTS, OUT_2 */
 outb_p(0x0d,port+1);             /* enable all intrs but writes */
 (void)inb(port);                        /* read data port to reset things (?) */
}

void rs_init(void)
{
 set_intr_gate(0x24,rs1_interrupt);    //设置串行口1的中断门向量
 set_intr_gate(0x23,rs2_interrupt);    //设置串行口2的中断门向量
 init(tty_table[1].read_q.data);             // 初始化串行口 1
 init(tty_table[2].read_q.data);
 outb(inb_p(0x21)&0xE7,0x21);        //允许主 8259A 芯片的 IRQ3,IRQ4 中断信号请求
}

你可能感兴趣的:(串行通讯控制器8250)