PIC8259 Code

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
User avatar
Jeko
Member
Member
Posts: 500
Joined: Fri Mar 17, 2006 12:00 am
Location: Napoli, Italy

PIC8259 Code

Post by Jeko »

This is the code for my pic 8259 handler. I readed this from an OpenSource OS, but I don't remember its name.
In your opinion, is it good?

Code: Select all

static unsigned short int irq_mask;

#define SLAVE_IRQ 8
#define MASTER_SLAVE 2
#define	ICU0 0x20
#define	ICU1 0xA0
#define	ICU_RESET 0x11

//Initialization PIC 8259
void Init8259(void)
{
    outportb( ICU0, ICU_RESET );
    outportb( ICU1, ICU_RESET );
    outportb( ICU0 + 1, 0x20 );
    outportb( ICU1 + 1, 0x28 );
    outportb( ICU0 + 1, 0x04 );
    outportb( ICU1 + 1, 0x02 );
    outportb( ICU0 + 1, 0x01 );
    outportb( ICU1 + 1, 0x01 );
    outportb( ICU0 + 1, 0xFF );
    outportb( ICU1 + 1, 0xFF );

    irq_mask = 0xFFFF;
}

void able_irq(unsigned char irq_no)
{
	irq_mask &= ~ ( 1 << irq_no );
	if ( irq_no >= 8 )
	{
		irq_mask &= ~ ( 1 << 2 );
	}
	outportb( ICU0 + 1 , irq_mask & 0xFF );
	outportb( ICU1 + 1 , ( irq_mask >> 8 ) & 0xFF );
}

void disable_irq(unsigned char irq_no)
{
	irq_mask |= ( 1 << irq_no );
	if ( ( irq_mask & 0xFF00 ) == 0xFF00 )
	{
		irq_mask |= ( 1 << 2 );
	}
	outportb( ICU0 + 1, irq_mask & 0xFF );
	outportb( ICU1 + 1, ( irq_mask >> 8 ) & 0xFF );
}
digo_rp
Member
Member
Posts: 233
Joined: Sun Jun 05, 2005 11:00 pm

Post by digo_rp »

using some hardware stuf we don´t have another way to configure it.
in case of working that code you post, you can use it.
at my case I´m using that code " that do the same of yours "

void remap_pics(int pic1, int pic2) {
byte a1, a2;
a1 = inportb(PIC1_DATA);
a2 = inportb(PIC2_DATA);
outportb(PIC1_COMMAND, ICW1_INIT+ICW1_ICW4);
outportb(PIC2_COMMAND, ICW1_INIT+ICW1_ICW4);
outportb(PIC1_DATA, pic1);
outportb(PIC2_DATA, pic2);
outportb(PIC1_DATA, 4);
outportb(PIC2_DATA, 2);
outportb(PIC1_DATA, ICW4_8086);
outportb(PIC2_DATA, ICW4_8086);
outportb(PIC1_DATA, a1);
outportb(PIC2_DATA, a2);
outportb(0x21, inportb(0x21) & ~0x04);
outportb(0xA1, inportb(0xA1) & ~0x01);
}

void irq_lock_all() {
cli();
outportb (0x21, 0xFB);
outportb (0xA1, 0xFF);
sti();
}

void irq_lock(byte irq_to_lock) {
byte porta;
byte bit_to_lock;
cli();
if (irq_to_lock < 8) {
porta = 0x21;
bit_to_lock = (1 << irq_to_lock);
}
if (irq_to_lock > 7) {
porta = 0xA1;
bit_to_lock = (1 << (irq_to_lock - 8));
}
outportb (porta, inportb(porta) | bit_to_lock);
sti();
}

void irq_unlock(byte irq_to_unlock) {
byte porta;
byte bit_to_unlock;
cli();
if (irq_to_unlock < 8) {
porta = 0x21;
bit_to_unlock = (1 << irq_to_unlock);
}
if (irq_to_unlock > 7) {
porta = 0xA1;
bit_to_unlock = (1 << (irq_to_unlock - 8));
}
outportb (porta, inportb(porta) & ~bit_to_unlock);
sti();
User avatar
Jeko
Member
Member
Posts: 500
Joined: Fri Mar 17, 2006 12:00 am
Location: Napoli, Italy

Post by Jeko »

thank you! My code works, but I have some problems with the mouse driver :( .

Sorry for my english, I'm italian
digo_rp
Member
Member
Posts: 233
Joined: Sun Jun 05, 2005 11:00 pm

Post by digo_rp »

what problem are you having ?
User avatar
Jeko
Member
Member
Posts: 500
Joined: Fri Mar 17, 2006 12:00 am
Location: Napoli, Italy

Post by Jeko »

My PS/2 mouse works at the IRQ2!
Post Reply