1+ #include <fuzzy/drivers/port.h>
12#include <fuzzy/drivers/pic/pic.h>
23#include <fuzzy/kernel/interrupts/interrupts.h>
34#include <lib/utils/logging.h>
45
5- extern void _pic_init_low (int idt_irq0_pic1 , int idt_irq0_pic2 );
6- extern void _pic_pit_init ();
6+ void pic_init () {
7+ print_log ("[driver][pic] init" );
8+ int idt_irq0_pic1 = IDT_IRQ_OFFSET ;
9+ int idt_irq0_pic2 = IDT_IRQ_OFFSET + 8 ;
710
8- extern void pic_timer_set_counter (unsigned short counter );
9- extern unsigned short pic_timer_get_counter ();
10- extern void pic_pit_reset ();
11+ outb (PORT_PIC1_CMD , 0x11 );
12+ outb (PORT_PIC2_CMD , 0x11 );
1113
12- extern unsigned short _pic_readmask ();
13- extern void _pic_writemask (unsigned short mask );
14+ // Remap IRQ
15+ // FuzzyOS won't be using IRQ0 in real mode.
16+ outb (PORT_PIC1_DATA , idt_irq0_pic1 );
17+ outb (PORT_PIC2_DATA , idt_irq0_pic2 );
1418
15- void pic_init () {
16- print_log ("PIC init." );
17- _pic_init_low (IDT_IRQ_OFFSET , IDT_IRQ_OFFSET + 8 );
19+ outb (PORT_PIC1_DATA , 4 );
20+ outb (PORT_PIC2_DATA , 2 );
21+
22+ outb (PORT_PIC1_DATA , 1 );
23+ outb (PORT_PIC2_DATA , 1 );
1824
1925 // disable all IRQs
20- _pic_writemask (0xFFFF );
26+ pic_writemask_new (0xFFFF );
27+
28+ pit_init ();
29+ }
30+
31+ void pic_writemask_new (uint16_t mask ) {
32+ outb (PORT_PIC1_DATA , mask & 0xFF );
33+ outb (PORT_PIC2_DATA , mask >>8 );
34+ }
2135
22- _pic_pit_init ();
36+ uint16_t pic_readmask_new () {
37+ uint16_t mask = inputb (PORT_PIC1_DATA );
38+ mask |= inputb (PORT_PIC2_DATA ) << 8 ;
39+ return mask ;
2340}
2441
2542void pic_irq_enable (int irq ) {
26- int mask = _pic_readmask ();
43+ int mask = pic_readmask_new ();
2744 mask = mask & (~(1 <<irq ));
28- _pic_writemask (mask );
45+ pic_writemask_new (mask );
2946}
3047
3148void pic_irq_disable (int irq ) {
32- int mask = _pic_readmask ();
49+ int mask = pic_readmask_new ();
3350 mask = mask |((1 <<irq ));
34- _pic_writemask (mask );
35- }
51+ pic_writemask_new (mask );
52+ }
0 commit comments