-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy path16c750_support.h
executable file
·72 lines (57 loc) · 2 KB
/
16c750_support.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#define UART_RHR_REG 0x000
#define UART_THR_REG 0x000
#define UART_IER_REG 0x004
#define UART_IIR_REG 0x008
#define UART_FCR_REG 0x008
#define UART_LCR_REG 0x00C
#define UART_MCR_REG 0x010
#define UART_LSR_REG 0x014
#define UART_MSR_REG 0x018
#define UART_SPR_REG 0x01C
#define UART_MDR1_REG 0x020
#define UART_MDR2_REG 0x024
#define UART_MDR3_REG 0x080
#define UART_SYSC_REG 0x054
#define UART_SYSS_REG 0x058
#define UART_RXFIFO_LVL_REG 0x064
#define UART_TXFIFO_LVL_REG 0x068
#define UART_DLL_REG 0x100
#define UART_DLH_REG 0x104
#define UART_EFR_REG 0x208
// This function writes a 16-bit value to the UART register with byte offset reg_offset
void write_uart_reg_raw (u32 reg_offset, u16 value);
// This function reads a 16-bit value from the UART register with the byte offset reg_offset
u16 read_uart_reg_raw (u32 reg_offset);
static u16 cached_lcr = 0;
void write_uart_reg (u32 reg, u16 value)
{
u16 lcr_selector_index = (reg / 256) % 3;
u16 reg_offset = (reg % 256);
if (lcr_selector_index == 1)
write_uart_reg_raw (UART_LCR_REG, cached_lcr | 0x80);
else if (lcr_selector_index == 2)
write_uart_reg_raw (UART_LCR_REG, 0xBF);
write_uart_reg_raw (reg_offset, value);
if (reg_offset == UART_LCR_REG)
cached_lcr = value;
if (lcr_selector_index != 0)
write_uart_reg_raw (UART_LCR_REG, cached_lcr);
}
u16 read_uart_reg (u32 reg)
{
u16 value = 0;
u16 lcr_selector_index = (reg / 256) % 3;
u16 reg_offset = (reg % 256);
if (lcr_selector_index == 1)
write_uart_reg_raw (UART_LCR_REG, cached_lcr | 0x80);
else if (lcr_selector_index == 2)
write_uart_reg_raw (UART_LCR_REG, 0xBF);
value = read_uart_reg_raw (reg_offset);
if (lcr_selector_index != 0)
write_uart_reg_raw (UART_LCR_REG, cached_lcr);
return value;
}
void init_uart_reg (void)
{
write_uart_reg_raw (UART_LCR_REG, cached_lcr);
}