Subversion Repositories shark

Rev

Rev 40 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 pj 1
/* Project:     OSLib
2
 * Description: The OS Construction Kit
3
 * Date:                1.6.2000
4
 * Idea by:             Luca Abeni & Gerardo Lamastra
5
 *
6
 * OSLib is an SO project aimed at developing a common, easy-to-use
7
 * low-level infrastructure for developing OS kernels and Embedded
8
 * Applications; it partially derives from the HARTIK project but it
9
 * currently is independently developed.
10
 *
11
 * OSLib is distributed under GPL License, and some of its code has
12
 * been derived from the Linux kernel source; also some important
13
 * ideas come from studying the DJGPP go32 extender.
14
 *
15
 * We acknowledge the Linux Community, Free Software Foundation,
16
 * D.J. Delorie and all the other developers who believe in the
17
 * freedom of software and ideas.
18
 *
19
 * For legalese, check out the included GPL license.
20
 */
21
 
22
/*      PIC management code & data      */
23
 
24
#include <ll/i386/hw-instr.h>
40 pj 25
#include <ll/i386/pic.h>
2 pj 26
 
27
FILE(IRQ);
28
 
40 pj 29
#define ICW1_M  0x020 /* Master PIC (8259) register settings */
2 pj 30
#define ICW2_M  0x021
31
#define ICW3_M  0x021
32
#define ICW4_M  0x021
33
#define OCW1_M  0x021
34
#define OCW2_M  0x020
35
#define OCW3_M  0x020
36
 
40 pj 37
#define ICW1_S  0x0A0 /* Slave PIC register setting */
2 pj 38
#define ICW2_S  0x0A1
39
#define ICW3_S  0x0A1
40
#define ICW4_S  0x0A1
41
#define OCW1_S  0x0A1
42
#define OCW2_S  0x0A0
43
#define OCW3_S  0x0A0
44
 
40 pj 45
#define EOI       0x020 /* End Of Interrupt code for PIC! */
2 pj 46
 
47
#define bit_on(v,b)     ((v) |= (1 << (b)))
48
#define bit_off(v,b)    ((v) &= ~(1 << (b)))
49
 
50
/* PIC interrupt mask */
40 pj 51
BYTE ll_PIC_master_mask = 0xFF;
52
BYTE ll_PIC_slave_mask = 0xFF;
2 pj 53
 
54
 
55
void PIC_init(void)
56
{
40 pj 57
    outp(ICW1_M,0x11);
58
    outp(ICW2_M,PIC1_BASE);
59
    outp(ICW3_M,0x04);
60
    outp(ICW4_M,0x01);
61
    outp(OCW1_M,0xFF);
2 pj 62
 
40 pj 63
    outp(ICW1_S,0x11);
64
    outp(ICW2_S,PIC2_BASE);
65
    outp(ICW3_S,0x02);
66
    outp(ICW4_S,0x01);
67
    outp(OCW1_S,0xFF);
2 pj 68
}
69
 
70
void PIC_end(void)
71
{
40 pj 72
    outp(ICW1_M,0x11);
73
    outp(ICW2_M,0x08);
74
    outp(ICW3_M,0x04);
75
    outp(ICW4_M,0x01);
76
    outp(OCW1_M,0xFF);
2 pj 77
 
40 pj 78
    outp(ICW1_S,0x11);
79
    outp(ICW2_S,0x70);
80
    outp(ICW3_S,0x02);
81
    outp(ICW4_S,0x01);
82
    outp(OCW1_S,0xFF);
2 pj 83
}
84
 
85
void irq_mask(WORD irqno)
86
{
87
    /* Interrupt is on master PIC */
88
    if (irqno < 8) {
40 pj 89
        bit_on(ll_PIC_master_mask,irqno);
90
        outp(0x21,ll_PIC_master_mask);
2 pj 91
    } else if (irqno < 16) {
92
        /* Interrupt on slave PIC */
40 pj 93
        bit_on(ll_PIC_slave_mask,irqno-8);
94
        outp(0xA1,ll_PIC_slave_mask);
2 pj 95
        /* If the slave PIC is completely off   */
40 pj 96
        /* Then turn off cascading line (Irq #2)*/
2 pj 97
        if (ll_PIC_slave_mask == 0xFF && !(ll_PIC_master_mask & 0x04)) {
40 pj 98
            bit_on(ll_PIC_master_mask,2);
99
            outp(0x21,ll_PIC_master_mask);
2 pj 100
        }
101
    }
102
}
103
 
104
void irq_unmask(WORD irqno)
105
{
106
    /* Interrupt is on master PIC */
107
    if (irqno < 8) {
40 pj 108
        bit_off(ll_PIC_master_mask,irqno);
109
        outp(0x21,ll_PIC_master_mask);
2 pj 110
    } else if (irqno < 16) {
111
        /* Interrupt on slave PIC */
40 pj 112
        bit_off(ll_PIC_slave_mask,irqno-8);
113
        outp(0xA1,ll_PIC_slave_mask);
2 pj 114
        /* If the cascading irq line was off */
115
        /* Then activate it also!            */
116
        if (ll_PIC_master_mask & 0x04) {
40 pj 117
            bit_off(ll_PIC_master_mask,2);
118
            outp(0x21,ll_PIC_master_mask);
2 pj 119
        }
120
    }
121
}