Mon 14 Oct 23:06:38 CEST 2024
This commit is contained in:
		
							parent
							
								
									782bf139a7
								
							
						
					
					
						commit
						ba42a747e0
					
				
							
								
								
									
										75
									
								
								kernel/pic.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								kernel/pic.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,75 @@ | ||||||
|  | /*
 | ||||||
|  | Copyright (C) 2015-2019 The University of Notre Dame | ||||||
|  | This software is distributed under the GNU General Public License. | ||||||
|  | See the file LICENSE for details. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include "ioports.h" | ||||||
|  | #include "kernel/types.h" | ||||||
|  | #include "console.h" | ||||||
|  | 
 | ||||||
|  | #define PIC_ICW1 0x11 | ||||||
|  | #define PIC_ICW4_MASTER 0x01 | ||||||
|  | #define PIC_ICW4_SLAVE  0x05 | ||||||
|  | #define PIC_ACK_SPECIFIC 0x60 | ||||||
|  | 
 | ||||||
|  | static uint8_t pic_control[2] = { 0x20, 0xa0 }; | ||||||
|  | static uint8_t pic_data[2] = { 0x21, 0xa1 }; | ||||||
|  | 
 | ||||||
|  | void pic_init(int pic0base, int pic1base) | ||||||
|  | { | ||||||
|  | 	outb(PIC_ICW1, pic_control[0]); | ||||||
|  | 	outb(pic0base, pic_data[0]); | ||||||
|  | 	outb(1 << 2, pic_data[0]); | ||||||
|  | 	outb(PIC_ICW4_MASTER, pic_data[0]); | ||||||
|  | 	outb(~(1 << 2), pic_data[0]); | ||||||
|  | 
 | ||||||
|  | 	outb(PIC_ICW1, pic_control[1]); | ||||||
|  | 	outb(pic1base, pic_data[1]); | ||||||
|  | 	outb(2, pic_data[1]); | ||||||
|  | 	outb(PIC_ICW4_SLAVE, pic_data[1]); | ||||||
|  | 	outb(~0, pic_data[1]); | ||||||
|  | 
 | ||||||
|  | 	printf("pic: ready\n"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void pic_enable(uint8_t irq) | ||||||
|  | { | ||||||
|  | 	uint8_t mask; | ||||||
|  | 	if(irq < 8) { | ||||||
|  | 		mask = inb(pic_data[0]); | ||||||
|  | 		mask = mask & ~(1 << irq); | ||||||
|  | 		outb(mask, pic_data[0]); | ||||||
|  | 	} else { | ||||||
|  | 		irq -= 8; | ||||||
|  | 		mask = inb(pic_data[1]); | ||||||
|  | 		mask = mask & ~(1 << irq); | ||||||
|  | 		outb(mask, pic_data[1]); | ||||||
|  | 		pic_enable(2); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void pic_disable(uint8_t irq) | ||||||
|  | { | ||||||
|  | 	uint8_t mask; | ||||||
|  | 	if(irq < 8) { | ||||||
|  | 		mask = inb(pic_data[0]); | ||||||
|  | 		mask = mask | (1 << irq); | ||||||
|  | 		outb(mask, pic_data[0]); | ||||||
|  | 	} else { | ||||||
|  | 		irq -= 8; | ||||||
|  | 		mask = inb(pic_data[1]); | ||||||
|  | 		mask = mask | (1 << irq); | ||||||
|  | 		outb(mask, pic_data[1]); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void pic_acknowledge(uint8_t irq) | ||||||
|  | { | ||||||
|  | 	if(irq >= 8) { | ||||||
|  | 		outb(PIC_ACK_SPECIFIC + (irq - 8), pic_control[1]); | ||||||
|  | 		outb(PIC_ACK_SPECIFIC + (2), pic_control[0]); | ||||||
|  | 	} else { | ||||||
|  | 		outb(PIC_ACK_SPECIFIC + irq, pic_control[0]); | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user