diff options
Diffstat (limited to 'uart.c')
-rw-r--r-- | uart.c | 77 |
1 files changed, 0 insertions, 77 deletions
@@ -1,77 +0,0 @@ -// Intel 8250 serial port (UART). - -#include "types.h" -#include "defs.h" -#include "param.h" -#include "traps.h" -#include "spinlock.h" -#include "sleeplock.h" -#include "fs.h" -#include "file.h" -#include "mmu.h" -#include "proc.h" -#include "x86.h" - -#define COM1 0x3f8 - -static int uart; // is there a uart? - -void -uartinit(void) -{ - char *p; - - // Turn off the FIFO - outb(COM1+2, 0); - - // 9600 baud, 8 data bits, 1 stop bit, parity off. - outb(COM1+3, 0x80); // Unlock divisor - outb(COM1+0, 115200/9600); - outb(COM1+1, 0); - outb(COM1+3, 0x03); // Lock divisor, 8 data bits. - outb(COM1+4, 0); - outb(COM1+1, 0x01); // Enable receive interrupts. - - // If status is 0xFF, no serial port. - if(inb(COM1+5) == 0xFF) - return; - uart = 1; - - // Acknowledge pre-existing interrupt conditions; - // enable interrupts. - inb(COM1+2); - inb(COM1+0); - ioapicenable(IRQ_COM1, 0); - - // Announce that we're here. - for(p="xv6...\n"; *p; p++) - uartputc(*p); -} - -void -uartputc(int c) -{ - int i; - - if(!uart) - return; - for(i = 0; i < 128 && !(inb(COM1+5) & 0x20); i++) - microdelay(10); - outb(COM1+0, c); -} - -static int -uartgetc(void) -{ - if(!uart) - return -1; - if(!(inb(COM1+5) & 0x01)) - return -1; - return inb(COM1+0); -} - -void -uartintr(void) -{ - consoleintr(uartgetc); -} |