CS350 COS
COS
Loading...
Searching...
No Matches
sercons.c
Go to the documentation of this file.
1
2#include <stdbool.h>
3#include <stdint.h>
4
5#include <sys/kassert.h>
6#include <sys/irq.h>
7
8#include "ioport.h"
9#include "sercons.h"
10
11#define COM1_BASE 0x3F8
12#define COM2_BASE 0x2F8
13#define COM3_BASE 0x3E8
14#define COM4_BASE 0x2E8
15
16#define COM1_IRQ 4
17#define COM2_IRQ 3
18#define COM3_IRQ 4
19#define COM4_IRQ 3
20
21// Inputs
22#define UART_OFFSET_DATA 0 /* Data Register */
23#define UART_OFFSET_IER 1 /* Interrupt Enable Register */
24#define UART_OFFSET_IIR 2 /* Interrupt Identification & FIFO Control */
25#define UART_OFFSET_LCR 3 /* Line Control Register */
26#define UART_LCR_DLAB 0x80
27#define UART_LCR_8N1 0x03
28#define UART_OFFSET_MCR 4 /* Modem Control Register */
29#define UART_OFFSET_LSR 5 /* Line Status Register */
30#define UART_OFFSET_MSR 6 /* Modem Status Register */
31#define UART_OFFSET_SR 7 /* Scratch Register */
32
33#define UART_OFFSET_DIVLO 0 /* Divisors DLAB == 1 */
34#define UART_OFFSET_DIVHI 1
35
38static uint8_t irq;
39
40void Serial_Init(void)
41{
43 irq = COM1_IRQ;
44
45 // Disable interrupts
47
48 // Enable DLAB
50 outb(base + UART_OFFSET_DIVLO, 1); // 115200 Baud
53
54 // Enable interrupts
55 outb(base + UART_OFFSET_IIR, 0xC7);
56 outb(base + UART_OFFSET_MCR, 0x0B);
57}
58
60{
61 handler.irq = irq;
64
66}
67
68void Serial_Interrupt(void *arg)
69{
70 kprintf("Serial interrupt!\n");
71}
72
74{
75 return (inb(base + UART_OFFSET_LSR) & 0x01) != 0;
76}
77
79{
80 while ((inb(base + UART_OFFSET_LSR) & 0x01) == 0)
81 {
82 // Timeout!
83 }
84 return inb(base + UART_OFFSET_DATA);
85}
86
87void Serial_Putc(char ch)
88{
89 while ((inb(base + UART_OFFSET_LSR) & 0x20) == 0)
90 {
91 // Timeout!
92 }
94
95 if (ch == '\b') {
96 Serial_Putc(0x1B);
97 Serial_Putc('[');
98 Serial_Putc('P');
99 }
100}
101
102void Serial_Puts(const char *str)
103{
104 const char *p = str;
105 while (*p != '\0')
106 Serial_Putc(*p++);
107}
108
static INLINE uint8_t inb(uint16_t port)
Definition: amd64op.h:452
static INLINE void outb(uint16_t port, uint8_t data)
Definition: amd64op.h:431
void IRQ_Register(int irq, struct IRQHandler *h)
Definition: irq.c:35
int kprintf(const char *fmt,...)
Definition: printf.c:210
void Serial_Init(void)
Definition: sercons.c:40
#define UART_OFFSET_DIVLO
Definition: sercons.c:33
void Serial_LateInit(void)
Definition: sercons.c:59
#define UART_LCR_8N1
Definition: sercons.c:27
#define COM1_IRQ
Definition: sercons.c:16
static IRQHandler handler
Definition: sercons.c:36
bool Serial_HasData()
Definition: sercons.c:73
#define UART_OFFSET_DATA
Definition: sercons.c:22
char Serial_Getc()
Definition: sercons.c:78
void Serial_Putc(char ch)
Definition: sercons.c:87
#define UART_OFFSET_IER
Definition: sercons.c:23
#define UART_OFFSET_IIR
Definition: sercons.c:24
void Serial_Puts(const char *str)
Definition: sercons.c:102
void Serial_Interrupt(void *arg)
Definition: sercons.c:68
#define UART_OFFSET_LCR
Definition: sercons.c:25
#define COM1_BASE
Definition: sercons.c:11
static uint16_t base
Definition: sercons.c:37
#define UART_LCR_DLAB
Definition: sercons.c:26
#define UART_OFFSET_MCR
Definition: sercons.c:28
static uint8_t irq
Definition: sercons.c:38
#define UART_OFFSET_LSR
Definition: sercons.c:29
#define NULL
Definition: stddef.h:6
Definition: irq.h:7
void * arg
Definition: irq.h:10
int irq
Definition: irq.h:8
void(* cb)(void *)
Definition: irq.h:9
unsigned short uint16_t
Definition: types.h:11
unsigned char uint8_t
Definition: types.h:10