i8259A中断控制器分析 二
标签:
i8259a编程linux |
分类: 嵌入式虚拟化 |
第三部分 i8259A编程
i8259A是可编程中断控制器,在其工作之前,必须采用写入控制命令的方法来对其进行初始化;在其工作时,还可以采用相同的方式来改变其工作状态,这就是i8259A的编程。控制命令分为初始化命令字ICW和操作命令字OCW。ICW有4个,分别是ICW1~ICW4;OCW有3个,分别是OCW1~OCW3,它们被写入i8259A后,分别保存在相应的寄存器中,例如ICW1保存在ICW1寄存器中,OCW1保存在OCW1寄存器中。i8259A的编程分为初始化编程和操作方式编程。
- 初始化编程:在i8259A工作之前,通过软件向其写入初始化命令字ICW1~ICW4,设置其初始工作方式。
- 操作方式编程:在i8259A工作的过程中,通过软件向其写入操作命令字OCW1~OCW3,改变其工作方式。OCW可在i8259A初始化后的任何时刻写入。
3.1 i8259A内部寄存器的寻址方法
i8259A有多个内部寄存器,单靠CS(上划线)和A0无法满足寄存器寻址的需要,因此还要在RD(上划线) 、WR(上划线)
和数据线D3、D4的配合下,才能完成对多个内部寄存器的访问。内部寄存器的访问方法如图4所示:
3.2 i8259A的初始化顺序
i8259A中的寄存器端口地址有两个,一个是奇地址(A0=1),一个是偶地址(A0=0)。通过图4可以看出,在往i8259A写入控制命令时,若A0=1,则写入的对象包括4个寄存器ICW2、ICW3、ICW4和OCW1,这说明四个寄存器端口共用同一个I/O地址,为了区分写入的到底是哪个寄存器,8259A规定了严格的写入顺序,即按照ICW2→ICW3→ICW4→OCW1的顺序写入。同样在初始化时,ICW1~ICW4的写入也必须遵循ICW1→ICW2→ICW3→ICW4这样的顺序。
3.3 i8259A的初始化命令字ICW
通过初始化编程,可将ICW写入8259A,设置其初始工作方式。
3.3.1 写ICW1
写ICW1的条件为:A0=0,D4=1,这时写入的数据被当成是ICW1。写ICW1意味着对i8259A进行初始化,同时i8259A还会完成以下工作:
- 清除ISR和IMR。
- 将中断优先级顺序设为初始状态:IR0(最高)~IR7(最低)。
- 采用普通屏蔽方式。
- 采用非自动中断结束方式。
ICW1的格式如图5所示:
- IC4:指示在初始化时是否需要写入命令字ICW4。在80x86 CPU系统中需要定义ICW4,即设IC4=1。
- SNGL:指示i8259A在系统中使用单片还是多片级联。SNGL=1为单片,SNGL=0为多片级联。
- ADI:设置调用时间间隔,在80486 CPU中无效。
- LTIM:定义IRi的中断请求触发方式。LTIM=1为电平触发,LTIM=0为边沿触发。
- D4:ICW1的标志位,恒为1。
- D5~D7:未用,通常设置为0。
3.3.2 写ICW2
ICW2的写入条件为:A0=1,它只能在ICW1写入之后写入。ICW2用于设置中断类型码,其格式如图5所示:
图6 ICW2格式
IR0~IR7各有一个中断类型码,它们是连续的,例如加上T7~T3=0b00001,那么IR0的中断类型码为08H,IR7的中断类型码为0FH。中断类型码可用8位二进制数来表示,对于i8259A的8个中断类型码而言,它们的高5位都是相同的,不同的是低3位。因此在初始化时只需设置ICW2的高5位,低3位可任意。i8259A决定响应某个中断时,它会将该中断请求的序号放入ICW2的低3位,并将该寄存器的内容放到数据总线供CPU读取。例如:向ICW2写入0x40时,则IR0~IR7对应的中断类型号为0x40~0x47。
3.3.3 写ICW3
ICW3的写入条件为:A0=1,它只能在ICW2写入之后写入。ICW3仅在级联方式下才需要写入,也就是当ICW1的SNGl位设为0时才需要写入。主片和从片的ICW3的格式不同,如图7所示:
http://s6/mw690/70dd1691tx6AQGVdYABb5&690二" TITLE="i8259A中断控制器分析 二" />
图7
主片ICW3格式
图8
从片ICW3格式
- S0~S7与IR0~IR7相对应,若主片IRi(i=0~7)引脚上连接从片,则Si=1,否则Si=0。
- ID2~ID0是从片标识码,它必须与本从片所连接之主片IR线的序号一致。例如,当从片的中断请求信号线INT与主片的IR2连接时,ID2~ID0应设置为010。
- D7~D3未用,通常设置为0。
在主片响应来自从片的中断请求时,它通过级联信号线CAS2~CAS0送出被响应中断的从片标识码,各从片用自己的ICW3和CAS2~CAS0进行比较,二者一致的从片被确定为当前中断源,该从片可以将中断的中断类型码送到数据总线供CPU读取。
3.3.4
写ICW4
ICW4的写入条件为A0=1,它只能在ICW3写入之后才能写入。ICW4用于设定8259A的工作方式,其格式如图9所示:
http://s4/mw690/70dd1691tx6AQHllP7te3&690二" TITLE="i8259A中断控制器分析 二" />
图9
ICW4格式
- uP:设置CPU模式。uP=1为80x86模式,uP=0为8080/8085模式。
- AEOI:设置i8259A的中断结束方式。AEOI=1为自动结束方式,AEOI=0为非自动结束方式。
- M/S(上划线) :选择缓冲级联方式下的主片与从片。M/S =1为主片,M/S =0为从片。
- BUF:设置缓冲方式。BUF=1为缓冲方式,BUF=0为非缓冲方式。
- SFNM:设置特殊全嵌套方式。SFNM=1为特殊全嵌套方式,SFNM=0为普通全嵌套方式
- D7~D5:未定义,通常设置为0。
备注:
从图9我们可以看出当多片i8259A级联时,若在i8259A的数据线与系统总线之间加入总线驱动器,(SP/EN)(上划线)
则作为总线驱动器的控制信号使用,此时D3位BUF应设置为1。主片和从片的区分不能再依靠(SP/EN)(上划线)引脚,而是由M/S(上划线)
来选择,当M/S(上划线) =0时为从片;当 M/S(上划线) =1时为主片。如果BUF=0,则 M/S(上划线) 定义无意义。
3.4
i8259A的操作命令字OCW
在i8259A工作时,可通过写入OCW改变其工作方式。OCW1~OCW3的写入没有固定顺序。
3.4.1
写OCW1
OWC1的写入条件为:A0=1。通过它可控制哪些中断请求被屏蔽。其格式图10所示:
图10
OCW1格式
当Mi=1时,对应的IRi请求被禁止;当Mi=0时,对应的IRi请求被允许。
3.4.2
写OCW2
OW2的写入条件为:A0=0。OWC2用于设置中断优先方式和中断结束方式。其格式如图11所示:
- R:设置中断优先方式。R=1为自动循环优先级方式;R=0为固定优先级方式。
- D4、D3为OCW2标志位,必须都设为0。
- SL:设置特殊自动循环方式。当SL=1时,若EOI=0且R=1(即R:SL:EOI=110),L2~L0对应的IRi的优先级被设为最低;若SL=1,R=0,EOI=1(即R:SL:EOI=011),L2~L0对应的ISR位被复位;若SL=0,R=0,EOI=1时(即R:SL:EOI=001),L2~L0的编码无效,硬件自动使ISR中置1的优先权最高位复位。
- L2~L0:对应着IR7~IR0和IS7~ IS0。当SL=1时,它有两个作用:若EOI=0且R=1(即R:SL:EOI=110),L2~L0对应的IRi的优先级被设为最低;若EOI=1,L2~L0对应的ISR位被复位。
- EOI:中断结束命令。当EOI=1时,若SL=1,则使L2~L0对应的ISR位复位,这种结束中断的方式称为特殊中断结束方式;若SL=0,则使ISR中置1的优先权最高位复位,这种结束中断的方式称为普通中断结束方式。
3.4.3 写OCW3
OCW3的写入条件为:A0=0,D4=0,D3=0。其格式如图12所示:
OCW3有三个功能:
- 设置中断屏蔽方式:ESMM(Enable Special Mask Mode)与SMM(Special Mask Mode)组合可用来设置或取消特殊屏蔽方式。当ESMM=1,SMM=1时,设置特殊屏蔽;当ESMM=1,SMM=0时,取消特殊屏蔽。
- 查询中断请求:当CPU禁止中断(IF=0)或不希望i8259A发起中断请求INT时,就可以采用i8259A的查询工作方式来查询i8259A的中断状态。为此可先写一个P=1的OCW3到i8259A,然后再从同一I/O地址读入数据,就可得到图13所示的中断状态寄存器的内容。I=1表示i8259A的IR7~IR0有中断请求产生,其中优先级最高的IRi的序号由R2~R0给出;否则表示无中断产生。
- 读8259A内部寄存器:先写一个RR=1、RIS=0的OCW3到8259A,再从同一个端口地址读入数据,就可读入IRR的内容;先写一个RR=1、RIS=1的OCW3到8259A,再从同一个端口地址读入数据,就可读入ISR的内容。
例如,设i8259A的两个端口地址为20H和21H,OCW3、ISR和IRR共用一个地址20H。
读取ISR内容的程序段为:
MOV AL, 00001011B
;
设置好命令字OCW3,使RR=1、RIS=1
OUT 20H, AL
; 将OCW3写入i8259A的20H端口
IN AL, 20H
;
从同一个端口读出ISR内容至AL中
读取IRR内容的程序段为:
MOV AL, 00001010B
;
设置好命令字OCW3,使RR=1、RIS=0
OUT 20H, AL
;
将OCW3写入i8259A的20H端口
IN AL, 20H
;
从同一个端口读出IRR内容至AL中
读取中断状态寄存器的程序段为:
MOV AL, 00001111B ;
设置好命令字OCW3,使P=1
OUT 20H, AL
;
将OCW3写入i8259A的20H端口
IN AL, 20H ;
从同一个端口读出中断状态寄存器的内容至AL中
3.5 i8259A的初始化编程
i8259A的初始化编程需要写入初始化命令字ICW1~ICW4,对它的各种工作方式进行设置。但由于ICW1~ICW4使用两个端口地址,即ICW1用A0=0的端口,ICW2~ICW4使用A0=1的端口,因此初始化程序应严格按照系统规定的顺序写入,即先写入ICW1,接着写ICW2,
ICW3, ICW4。
8259A的初始化流程如图15所示。
图15 i8259A初始化流程
备注:
需注意的是,如果多个8259A级联在一起工作,主片和从片应分别进行初始化。
操作命令字OCW1~OCW3的写入比较灵活,没有固定的顺序,可以在主程序中写入,也可以在中断服务子程序中写入;可以在初始化时写入,也可以在工作以后写入,视需要而定。下面通过例子来说明如何编写8259A的初始化程序。
我们假设PC使用主、从两片i8259A管理中断,从片中断请求INT与主片的IR2连接。设主片工作于非特殊完全嵌套、非缓冲和非自动结束方式,中断类型号为0x20~0x27H,端口地址为0x20和0x21。从片工作于完全嵌套、非缓冲和非自动结束方式,中断类型号为0x28H~0x2fH,端口地址为0xA0和0xA1。我们分析Linux-2.4.x内核对对这两片i8259A中断控制器的初始化过程(arch/i386/kernel/i8259.c):
参数:
auto_eoi=0表示i8259A采用非自动中断结束方式
auto_eoi=1表示i8259A采用自动中断结束方式
备注:在linux中i8259A采用的非自动中断结束方式,本文我们侧重分析Linux内核中auto_eoi=0的情况!
void __init init_8259A(int
auto_eoi)
{
unsigned long flags;
spin_lock_irqsave(&i8259A_lock,
flags);
outb(0xff, 0x21); //
通过写OCW2,屏蔽i8259A主片的所有中断
outb(0xff, 0xA1); //
通过写OCW2,屏蔽i8259A从片的所有中断
//
/ outb_p - this has to work on a wide
range of PC hardware.
//
outb_p(0x11, 0x20;
// ICW1:
ICW1:级联, 边沿触发, 需要写ICW4
outb_p(0x20 + 0, 0x21); //ICW2: 8259A-1
IR0~IR7 映射到 0x20-0x27
outb_p(0x04, 0x21);
//ICW3:主片的IR2引脚接从片
if (auto_eoi)
outb_p(0x03, 0x21); // master does Auto
EOI
else
outb_p(0x01, 0x21);
//ICW4:非特殊完全嵌套、非缓冲、自动结束
outb_p(0x11, 0xA0);
//ICW1:级联, 边沿触发, 需要写ICW4
outb_p(0x20 + 8, 0xA1);//ICW2: 8259A-2
IR0~IR7 映射到 0x28-0x2f
outb_p(0x02, 0xA1);
//ICW3:接主片的IR2引脚
outb_p(0x01, 0xA1);
//ICW4:完全嵌套、非缓冲、非自动结束
if (auto_eoi)
//
/ in AEOI mode we just have to mask the
interrupt
/ when acking.
//
i8259A_irq_type.ack =
disable_8259A_irq;
else
i8259A_irq_type.ack =
mask_and_ack_8259A;
udelay(100); // wait for 8259A to
initialize //
outb(cached_21, 0x21); // restore master
IRQ mask
outb(cached_A1, 0xA1); // restore slave
IRQ mask
spin_unlock_irqrestore(&i8259A_lock,
flags);
}
备注:Linux内核设置ICW1, ICW2, ICW3和ICW4寄存器,正是按照按图15的顺序写入。
第四部分 Linux内核对i8259A的操作分析
待续。。。。。。。。。
前一篇:i8259A中断控制器分析 一
后一篇:i8259A中断控制器分析 三

加载中…