]> Joshua Wise's Git repositories - netwatch.git/blob - lib/serial.c
95d830062c6aa7d8ccad55aa4ccb53ed43072b34
[netwatch.git] / lib / serial.c
1 /* serial.c
2  * Serial output routines.
3  * NetWatch system management mode administration console
4  *
5  * Copyright (c) 2008 Jacob Potter and Joshua Wise.  All rights reserved.
6  * This program is free software; you can redistribute and/or modify it under
7  * the terms found in the file LICENSE in the root of this source tree.
8  *
9  */
10
11 #include <minilib.h>
12 #include <io.h>
13
14 #define SER_BASE 0x3F8
15 #define SER_THR 0x0
16 #define SER_RBR 0x0
17 #define SER_DLL 0x0
18 #define SER_IER 0x1
19 #define SER_DLM 0x1
20 #define SER_IIR 0x2
21 #define SER_FCR 0x2
22 #define SER_LCR 0x3
23 #define SER_LCR_DLAB 0x80
24 #define SER_MCR 0x4
25 #define SER_LSR 0x5
26 #define SER_LSR_THR_EMPTY 0x20
27 #define SER_MSR 0x6
28 #define SER_SR 0x7
29
30 #define SER_BAUD_BASE 115200
31 #define SER_BAUD_REQ 115200
32
33 void _outb(unsigned short port, unsigned char d)
34 {
35         outb(SER_BASE + port, d);
36 }
37
38 unsigned char _inb(unsigned short port)
39 {
40         return inb(SER_BASE + port);
41 }
42
43 void serial_init()
44 {
45         unsigned short baud = SER_BAUD_REQ / SER_BAUD_BASE;
46         _outb(SER_LCR, _inb(SER_LCR) | SER_LCR_DLAB);
47         _outb(SER_DLL, baud & 0xFF);
48         _outb(SER_DLM, baud >> 8);
49         _outb(SER_LCR, _inb(SER_LCR) & ~SER_LCR_DLAB);
50         _outb(SER_IER, 0x0);
51         _outb(SER_FCR, 0x0);    /* FIFOs off */
52         _outb(SER_LCR, 0x03);   /* 8 data bits, one stop bit, no parity */
53 }
54
55 void serial_tx(unsigned char c)
56 {
57         int i = 100000;
58         
59         while (!(_inb(SER_LSR) & SER_LSR_THR_EMPTY) && (i--))
60                 ;
61         _outb(SER_THR, c);
62 }
This page took 0.031222 seconds and 4 git commands to generate.