root/uart.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. uartinit
  2. uartputc
  3. uartgetc
  4. uartintr

   1 // Intel 8250 serial port (UART).
   2 
   3 #include "types.h"
   4 #include "defs.h"
   5 #include "param.h"
   6 #include "traps.h"
   7 #include "spinlock.h"
   8 #include "fs.h"
   9 #include "file.h"
  10 #include "mmu.h"
  11 #include "proc.h"
  12 #include "x86.h"
  13 
  14 #define COM1    0x3f8
  15 
  16 static int uart;    // is there a uart?
  17 
  18 void
  19 uartinit(void)
  20 {
  21   char *p;
  22 
  23   // Turn off the FIFO
  24   outb(COM1+2, 0);
  25   
  26   // 9600 baud, 8 data bits, 1 stop bit, parity off.
  27   outb(COM1+3, 0x80);    // Unlock divisor
  28   outb(COM1+0, 115200/9600);
  29   outb(COM1+1, 0);
  30   outb(COM1+3, 0x03);    // Lock divisor, 8 data bits.
  31   outb(COM1+4, 0);
  32   outb(COM1+1, 0x01);    // Enable receive interrupts.
  33 
  34   // If status is 0xFF, no serial port.
  35   if(inb(COM1+5) == 0xFF)
  36     return;
  37   uart = 1;
  38 
  39   // Acknowledge pre-existing interrupt conditions;
  40   // enable interrupts.
  41   inb(COM1+2);
  42   inb(COM1+0);
  43   picenable(IRQ_COM1);
  44   ioapicenable(IRQ_COM1, 0);
  45   
  46   // Announce that we're here.
  47   for(p="xv6...\n"; *p; p++)
  48     uartputc(*p);
  49 }
  50 
  51 void
  52 uartputc(int c)
  53 {
  54   int i;
  55 
  56   if(!uart)
  57     return;
  58   for(i = 0; i < 128 && !(inb(COM1+5) & 0x20); i++)
  59     microdelay(10);
  60   outb(COM1+0, c);
  61 }
  62 
  63 static int
  64 uartgetc(void)
  65 {
  66   if(!uart)
  67     return -1;
  68   if(!(inb(COM1+5) & 0x01))
  69     return -1;
  70   return inb(COM1+0);
  71 }
  72 
  73 void
  74 uartintr(void)
  75 {
  76   consoleintr(uartgetc);
  77 }

/* [<][>][^][v][top][bottom][index][help] */