8259 PIC: Difference between revisions

215 bytes removed ,  17 years ago
removed spaces in code
[unchecked revision][unchecked revision]
m (Fixed a few spelling errors..)
(removed spaces in code)
Line 69:
=== Code ===
 
<pre>
/* reinitialize the PIC controllers, giving them specified vector offsets
rather than 8 and 70, as configured by default */
 
#define PIC1 0x20 /* IO base address for master PIC */
#define PIC2PIC1 0xA00x20 /* IO base address for slavemaster PIC */
#define PIC1PIC2 0x200xA0 /* IO base address for masterslave PIC */
#define PIC1_COMMAND PIC1
#define PIC1_DATA PIC1_COMMAND (PIC1+1)
#define PIC1_DATA (PIC1+1)
#define PIC2_COMMAND PIC2
#define PIC2_DATA PIC2_COMMAND (PIC2+1)
#define PIC2_DATA (PIC2+1)
#define PIC_EOI 0x20 /* End - of - interrupt command code */
 
#define ICW1_ICW4 0x01 /* ICW4 (not) needed */
#define ICW1_ICW4 #define ICW1_SINGLE 0x020x01 /* SingleICW4 (cascadenot) modeneeded */
#define ICW1_SINGLE #define ICW1_INTERVAL4 0x040x02 /* Call address interval 4Single (8cascade) mode */
#define ICW1_LEVELICW1_INTERVAL4 0x04 0x08 /* Call address interval /* Level triggered4 (edge8) mode */
#define ICW1_INITICW1_LEVEL 0x100x08 /* InitializationLevel triggered -(edge) required!mode */
#define ICW1_INIT 0x10 /* Initialization - required! */
 
#define ICW4_8086 0x01 /* 8086/88 (MCS-80/85) mode */
#define ICW4_AUTOICW4_8086 0x020x01 /* Auto8086/88 (normalMCS-80/85) EOImode */
#define ICW4_AUTO #define ICW4_BUF_SLAVE 0x08 0x02 /* BufferedAuto mode/slave(normal) EOI */
#define ICW4_BUF_MASTERICW4_BUF_SLAVE 0x0C0x08 /* Buffered mode/masterslave */
#define ICW4_SFNMICW4_BUF_MASTER 0x100x0C /* SpecialBuffered fully nested (not)mode/master */
#define ICW1_ICW4ICW4_SFNM 0x010x10 /* ICW4Special fully nested (not) needed */
 
/*
/*
arguments:
offset1 - vector offset for master PIC
offset1 - vector offset vectors on thefor master become offset1..offset1+7PIC
vectors on offset2the -master samebecome for slave PIC: offset2offset1..offset2offset1+7
offset2 - same for slave PIC: offset2..offset2+7
*/
*/
void remap_pics(int offset1, int offset2)
{
{
UCHAR a1, a2;
UCHAR a1, a2;
 
a1=inb(PIC1_DATA); // save masks
a2=inb(PIC2_DATA);
 
outb(PIC1_COMMAND, ICW1_INIT+ICW1_ICW4); // starts the initialization sequence
io_wait();
outb(PIC2_COMMAND, ICW1_INIT+ICW1_ICW4);
io_wait();
outb(PIC1_DATA, offset1); // define the PIC vectors
io_wait();
outbio_wait(PIC2_DATA, offset2);
outb(PIC2_DATA, io_wait(offset2);
io_wait();
outb(PIC1_DATA, 4); // continue initialization sequence
io_wait();
outbio_wait(PIC2_DATA, 2);
outb(PIC2_DATA, io_wait(2);
io_wait();
 
outb(PIC1_DATA, ICW4_8086);
outb(PIC1_DATA, io_wait(ICW4_8086);
io_wait();
outb(PIC2_DATA, ICW4_8086);
outb(PIC2_DATA, io_wait(ICW4_8086);
io_wait();
 
outb(PIC1_DATA, a1); // restore saved masks.
outb(PIC2_DATAPIC1_DATA, a2a1); // restore saved masks.
outb(PIC2_DATA, ICW4_8086a2);
}
}
</pre>
 
''Note the presence of io_wait() calls, on older machines its necessary to give the PIC some time to react to commands as they might not be processed quickly''
Anonymous user