因为Linux在初始化时间以后就初始化了tty,tty的初始过程包含了串口设备(COM1和COM2)的初始化,为了理解其中内容,我从http://blog.csdn.net/flylonginsky/archive/2005/01/25/267386.aspx转来了相关的说明。关于Linux初始化这部分的分析,我应该在读完这部分内容后一段时间写出来,因为毕竟自己也是在边读代码边学习么。虽然发扬愚公移山的精神,但是什么时候才能写出自己的操作系统啊。唉~~~~~~~~,漫长啊。

下面是转载内容:

 

PC机上,COM1和COM2的地址是3F8~3FF 及2F8~2FF,在这个范围内的每个地址都有不同的功能,这些功能分别通过寄存器来实现,读写这些寄存器就可以执行与串行端口相关的功能。而所谓的寄存器就是暂时存放信息的地方,这些被存放在此的信息是以位的形式存储,通常以8个位(一个字节)作为一个单位。读写这些寄存器地址的同时,也就是读取这些代表的状态或控制某些功能。

    

COM1

COM2

寄存器名称

简称

3F8

2F8

波特率分频器(低八位)

BDR

3F9

2F9

波特率分频器(高八位)

BDR

3F8

2F8

传送信息/接收信息寄存器

DR

3F9

2F9

中断启动寄存器

IER

3FA

2FA

中断辨识寄存器

IIR

3FB

2FB

传输线控制寄存器

LCR

3FC

2FC

调制解调器控制寄存器

MCR

3FD

2FD

传输线状态寄存器

LSR

3FE

2FE

调制解调器状态寄存器

MSR

上表中,3F8,3F9及2F8,2F9分别有两种功能,显然还需要其他寄存器的信号来加以区别。

在串行通信中,这一点是通过使用传输线控制寄存器(LCR)上的第7位来实现的。这个位被称为分频器锁存器存取位(Divistor Latch Access Bit,DLAB),当DLAB为0时,表示读写信息寄存器和中断启动寄存器;当DLAB为1时,表示读写波特率分频器的内容。

以下是各寄存器的说明:

l        BDR:设置使用串行通信的传输速度。

串口波特率和数据格式的设置:

首先向LCR(传输线控制寄存器)的高位写入1(即DLAB为1),然后再设置波特率:在基地址和基地址+1的地方写入的数据为1843200/(16*波特率)。然后设置LCR,最后设置Modem控制寄存器和中断允许寄存器。波特率数值=1843200/(16*波特率)(十进制,可转化为十六进制)

outportb(0x3fb,0x80); 对LCR的最高位置‘1',是说明以下为输入波特率因子

outportb(0x3f8,0x0c); //outportb(0x3f8+0,0x0C)输入波特率因子的低8位/9600

outportb(0x3f9,0x00); //outportb(0x3f8+1,0x00) 输入波特率因子的高8位

l        DR  先令DLAB为0,再读取3F8就等于读取被传送到COM1的信息。若将信息写入3F8,则信息会被放入传送寄存器中,并被芯片内的移位寄存器一位接着一位地送出去。

l        IER  用来启动芯片中的4种中断,该位为1时表示该中断被启动。

         Bit0:接收的信息有效中断启动。

         Bit1:传送器保持寄存器已空中断启动

         Bit2:接收器连接状态中断启动

         Bit3:调制解调器状态中断启动

         Bit4-Bit7:永远为0

outportb(0x3f9,0x01); //启动中断,接收数据有效

l        IIR  通过读取此寄存器可以知道中断的产生是由谁所引发。

        Bit0:为0时表示尚有中断未处理;为1时表示无中断。

Bit2

Bit1

中断来源

0

0

调制解调器状态

0

1

传送器保存寄存器空着

1

0

接受信息为有效

1

1

连接控制状态

Bit3~Bit7 :永远为0

outportb(0x3fa,0x07);  //表示处于连接控制状态

l        LCR  此寄存器定义传输信息的格式。各位的意义如下:

Bit0

Bit1

意义

0

0

字符长度为5个位

0

1

字符长度为6个位

1

0

字符长度为7个位

1

1

字符长度为8个位

Bit2:终止位。设为0表示使用1个终止位;设为1时有两种情况,字符长度为5时表示1.5个终止位,而字符长度不是5时则表示2个终止位。

Bit3:奇偶校验位启动。设为0时表示无奇偶校验位,设为1时表示使用奇偶校验位。

Bit4:奇偶校验方式选择。设为0时选择奇校验;设为1时选择偶校验。

Bit5:指定奇偶校验位的方式。设为0时表示不限制;设为1时,则选择奇校验时,奇偶校验位为1;选择偶校验时,奇偶校验位为0。

Bit6:终止控制位。设为0时表示正常输出;设为1时则强迫输出0。

Bit7:除法器轩锁位。设为0时表示存取信息寄存器;设为1时表示存取波特率分频器。

outportb(0x3fb,0x80); //对LCR的最高位置‘1',是说明以下代码为输入波特率因子

l        MCR 用来控制调制解调器的接口信号。

         Bit0:设为1时,DTR脚位为LOW;设为0时,DTR脚位为HIGH。

         Bit1:设为1时,DTS脚位为LOW;设为0时,RTS脚位为HIGH

         Bit2,Bit3:用于控制芯片上的输出,新型芯片现已不用。

         Bit4::设为1时,芯片内部作自我诊断。

         其他位永远为0

outportb(0x3fc,0x0b);  //见上

l        LSR 表示信息传送过程种的各种状态。各位为1时表示该状态成立,为0时不成立

          Bit0:数据已接收完毕。(Data Ready)

          Bit1:数据溢出错误。(Overrun Error)

          Bit2:奇偶校验位错误。(Parity Error)

          Bit3:信息框错误。(Framing Error)

          Bit4:终止中断。(Break Interrupt)

          Bit5:传送器保存寄存器空闲(Transmitter Holding Register Empty)。

          Bit6:传送移位寄存器空闲(Transmitter Shift Register Empty)。

          Bit7:永远为0

l        MSR 此寄存器高4位为调制解调器控制线目前状态;低4位在调制解调器有信号时被设为1,在被读取后会恢复为0。

         Bit0:1时表示CTS信号改变

         Bit1:1时表示DSR信号改变

         Bit2:1时表示RI信号改变

         Bit3:1时表示DCD信号改变

         Bit4:CTS信号的补码

         Bit5:DSR的补码

         Bit6:RI信号的补码

         Bit7:DCD信号的补码。

Logo

更多推荐