-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathserial.c
129 lines (110 loc) · 4.15 KB
/
serial.c
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "serial.h"
//-----------------------------------------------------------------
// Defines
//-----------------------------------------------------------------
#define ULITE_RX 0x0
#define ULITE_RX_DATA_SHIFT 0
#define ULITE_RX_DATA_MASK 0xff
#define ULITE_TX 0x4
#define ULITE_TX_DATA_SHIFT 0
#define ULITE_TX_DATA_MASK 0xff
#define ULITE_STATUS 0x8
#define ULITE_STATUS_IE 4
#define ULITE_STATUS_IE_SHIFT 4
#define ULITE_STATUS_IE_MASK 0x1
#define ULITE_STATUS_TXFULL 3
#define ULITE_STATUS_TXFULL_SHIFT 3
#define ULITE_STATUS_TXFULL_MASK 0x1
#define ULITE_STATUS_TXEMPTY 2
#define ULITE_STATUS_TXEMPTY_SHIFT 2
#define ULITE_STATUS_TXEMPTY_MASK 0x1
#define ULITE_STATUS_RXFULL 1
#define ULITE_STATUS_RXFULL_SHIFT 1
#define ULITE_STATUS_RXFULL_MASK 0x1
#define ULITE_STATUS_RXVALID 0
#define ULITE_STATUS_RXVALID_SHIFT 0
#define ULITE_STATUS_RXVALID_MASK 0x1
#define ULITE_CONTROL 0xc
#define ULITE_CONTROL_IE 4
#define ULITE_CONTROL_IE_SHIFT 4
#define ULITE_CONTROL_IE_MASK 0x1
#define ULITE_CONTROL_RST_RX 1
#define ULITE_CONTROL_RST_RX_SHIFT 1
#define ULITE_CONTROL_RST_RX_MASK 0x1
#define ULITE_CONTROL_RST_TX 0
#define ULITE_CONTROL_RST_TX_SHIFT 0
#define ULITE_CONTROL_RST_TX_MASK 0x1
//-----------------------------------------------------------------
// Locals
//-----------------------------------------------------------------
static volatile uint32_t *m_uart;
//-----------------------------------------------------------------
// serial_init: Initialise UART peripheral
//-----------------------------------------------------------------
void serial_init(uint32_t base_addr, uint32_t baud_rate)
{
uint32_t cfg = 0;
m_uart = (volatile uint32_t *)base_addr;
// Soft reset
cfg += (1 << ULITE_CONTROL_RST_RX_SHIFT);
cfg += (1 << ULITE_CONTROL_RST_TX_SHIFT);
cfg += (1 << ULITE_CONTROL_IE_SHIFT);
m_uart[ULITE_CONTROL/4] = cfg;
}
//-----------------------------------------------------------------
// serial_putchar: Polled putchar
//-----------------------------------------------------------------
int serial_putchar(char c)
{
// While TX FIFO full
while (m_uart[ULITE_STATUS/4] & (1 << ULITE_STATUS_TXFULL_SHIFT))
;
m_uart[ULITE_TX/4] = c;
return 0;
}
//-------------------------------------------------------------
// serial_putstr: Print string (NULL terminated)
//-------------------------------------------------------------
void serial_putstr(const char *str)
{
while (*str)
serial_putchar(*str++);
}
//-----------------------------------------------------------------
// serial_haschar:
//-----------------------------------------------------------------
int serial_haschar(void)
{
return (m_uart[ULITE_STATUS/4] & (1 << ULITE_STATUS_RXVALID_SHIFT)) != 0;
}
//-----------------------------------------------------------------
// serial_getchar: Read character from UART
//-----------------------------------------------------------------
int serial_getchar(void)
{
if (serial_haschar())
return (uint8_t)m_uart[ULITE_RX/4];
else
return -1;
}
//-------------------------------------------------------------
// serial_putstr_hex: Print string with hex number appended
//-------------------------------------------------------------
void serial_putstr_hex(const char *str, uint32_t num)
{
char* num_str;
char outbuf[32];
const char digits[] = "0123456789abcdef";
while (str && *str)
serial_putchar(*str++);
num_str = &outbuf[sizeof(outbuf)-1];
*num_str-- = 0;
*num_str = '\n';
do
{
*(--num_str) = digits[(int)(num % 16)];
}
while ((num /= 16) > 0);
while (*num_str)
serial_putchar(*num_str++);
}