24
24
#include "pinmap.h"
25
25
#include "error.h"
26
26
27
- /******************************************************************************
28
- * INITIALIZATION
29
- ******************************************************************************/
30
27
static const PinMap PinMap_UART_TX [] = {
31
- {PTB17 , UART_0 , 3 },
28
+ {PTB17 , UART_0 , 3 },
32
29
{NC , NC , 0 }
33
30
};
34
31
35
32
static const PinMap PinMap_UART_RX [] = {
36
- {PTB16 , UART_0 , 3 },
33
+ {PTB16 , UART_0 , 3 },
37
34
{NC , NC , 0 }
38
35
};
39
36
40
37
#define UART_NUM 3
38
+
41
39
static uint32_t serial_irq_ids [UART_NUM ] = {0 };
42
40
static uart_irq_handler irq_handler ;
43
41
@@ -49,9 +47,8 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
49
47
UARTName uart_tx = (UARTName )pinmap_peripheral (tx , PinMap_UART_TX );
50
48
UARTName uart_rx = (UARTName )pinmap_peripheral (rx , PinMap_UART_RX );
51
49
UARTName uart = (UARTName )pinmap_merge (uart_tx , uart_rx );
52
- if ((int )uart == NC ) {
50
+ if ((int )uart == NC )
53
51
error ("Serial pinout mapping failed" );
54
- }
55
52
56
53
obj -> uart = (UART_Type * )uart ;
57
54
// enable clk
@@ -63,7 +60,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
63
60
}
64
61
// Disable UART before changing registers
65
62
obj -> uart -> C2 &= ~(UART_C2_RE_MASK | UART_C2_TE_MASK );
66
-
63
+
67
64
switch (uart ) {
68
65
case UART_0 : obj -> index = 0 ; break ;
69
66
case UART_1 : obj -> index = 1 ; break ;
@@ -94,27 +91,13 @@ void serial_free(serial_t *obj) {
94
91
serial_irq_ids [obj -> index ] = 0 ;
95
92
}
96
93
97
- // serial_baud
98
- //
99
- // set the baud rate, taking in to account the current SystemFrequency
100
- //
101
- // The LPC2300 and LPC1700 have a divider and a fractional divider to control the
102
- // baud rate. The formula is:
103
- //
104
- // Baudrate = (1 / PCLK) * 16 * DL * (1 + DivAddVal / MulVal)
105
- // where:
106
- // 1 < MulVal <= 15
107
- // 0 <= DivAddVal < 14
108
- // DivAddVal < MulVal
109
- //
110
94
void serial_baud (serial_t * obj , int baudrate ) {
111
-
112
95
// save C2 state
113
- uint8_t c2_state = (obj -> uart -> C2 & (UART_C2_RE_MASK | UART_C2_TE_MASK ));
114
-
96
+ uint32_t c2_state = (obj -> uart -> C2 & (UART_C2_RE_MASK | UART_C2_TE_MASK ));
97
+
115
98
// Disable UART before changing registers
116
99
obj -> uart -> C2 &= ~(UART_C2_RE_MASK | UART_C2_TE_MASK );
117
-
100
+
118
101
// [TODO] not hardcode this value
119
102
uint32_t PCLK = (obj -> uart == UART0 ) ? 48000000u : 24000000u ;
120
103
@@ -129,27 +112,26 @@ void serial_baud(serial_t *obj, int baudrate) {
129
112
// set BDH and BDL
130
113
obj -> uart -> BDH = (obj -> uart -> BDH & ~(0x1f )) | ((DL >> 8 ) & 0x1f );
131
114
obj -> uart -> BDL = (obj -> uart -> BDL & ~(0xff )) | ((DL >> 0 ) & 0xff );
132
-
115
+
133
116
// restore C2 state
134
117
obj -> uart -> C2 |= c2_state ;
135
118
}
136
119
137
120
void serial_format (serial_t * obj , int data_bits , SerialParity parity , int stop_bits ) {
138
- // uint8_t m10 = 0;
139
-
121
+
140
122
// save C2 state
141
- uint8_t c2_state = (obj -> uart -> C2 & (UART_C2_RE_MASK | UART_C2_TE_MASK ));
142
-
123
+ uint32_t c2_state = (obj -> uart -> C2 & (UART_C2_RE_MASK | UART_C2_TE_MASK ));
124
+
143
125
// Disable UART before changing registers
144
126
obj -> uart -> C2 &= ~(UART_C2_RE_MASK | UART_C2_TE_MASK );
145
-
127
+
146
128
// 8 data bits = 0 ... 9 data bits = 1
147
- if ((data_bits < 8 ) || (data_bits > 9 )) {
129
+ if ((data_bits < 8 ) || (data_bits > 9 ))
148
130
error ("Invalid number of bits (%d) in serial format, should be 8..9\r\n" , data_bits );
149
- }
131
+
150
132
data_bits -= 8 ;
151
133
152
- uint8_t parity_enable , parity_select ;
134
+ uint32_t parity_enable , parity_select ;
153
135
switch (parity ) {
154
136
case ParityNone : parity_enable = 0 ; parity_select = 0 ; break ;
155
137
case ParityOdd : parity_enable = 1 ; parity_select = 1 ; data_bits ++ ; break ;
@@ -160,36 +142,36 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
160
142
}
161
143
162
144
// 1 stop bits = 0, 2 stop bits = 1
163
- if ((stop_bits != 1 ) && (stop_bits != 2 )) {
145
+ if ((stop_bits != 1 ) && (stop_bits != 2 ))
164
146
error ("Invalid stop bits specified\r\n" );
165
- }
166
147
stop_bits -= 1 ;
167
-
148
+
149
+ uint32_t m10 = 0 ;
150
+
168
151
// 9 data bits + parity
169
152
if (data_bits == 2 ) {
170
153
// only uart0 supports 10 bit communication
171
- if (obj -> index != 0 ) {
154
+ if (obj -> index != 0 )
172
155
error ("Invalid number of bits (9) to be used with parity\r\n" );
173
- }
174
156
data_bits = 0 ;
175
- // m10 = 1;
157
+ m10 = 1 ;
176
158
}
177
159
178
160
// data bits, parity and parity mode
179
161
obj -> uart -> C1 = ((data_bits << 4 )
180
162
| (parity_enable << 1 )
181
163
| (parity_select << 0 ));
182
-
183
- // enable 10bit mode if needed
184
- // if (obj->index == 0) {
185
- // obj->uart->C4 &= ~UARTLP_C4_M10_MASK ;
186
- // obj->uart->C4 |= (m10 << UARTLP_C4_M10_SHIFT );
187
- // }
188
-
164
+
165
+ //enable 10bit mode if needed
166
+ if (obj -> index == 0 ) {
167
+ obj -> uart -> C4 &= ~UART_C4_M10_MASK ;
168
+ obj -> uart -> C4 |= (m10 << UART_C4_M10_SHIFT );
169
+ }
170
+
189
171
// stop bits
190
172
obj -> uart -> BDH &= ~UART_BDH_SBR_MASK ;
191
173
obj -> uart -> BDH |= (stop_bits << UART_BDH_SBR_SHIFT );
192
-
174
+
193
175
// restore C2 state
194
176
obj -> uart -> C2 |= c2_state ;
195
177
}
@@ -220,15 +202,28 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
220
202
IRQn_Type irq_n = (IRQn_Type )0 ;
221
203
uint32_t vector = 0 ;
222
204
switch ((int )obj -> uart ) {
223
- case UART_0 : irq_n = UART0_RX_TX_IRQn ; vector = (uint32_t )& uart0_irq ; break ;
224
- case UART_1 : irq_n = UART1_RX_TX_IRQn ; vector = (uint32_t )& uart1_irq ; break ;
225
- case UART_2 : irq_n = UART2_RX_TX_IRQn ; vector = (uint32_t )& uart2_irq ; break ;
205
+ case UART_0 :
206
+ irq_n = UART0_RX_TX_IRQn ;
207
+ vector = (uint32_t )& uart0_irq ;
208
+ break ;
209
+ case UART_1 :
210
+ irq_n = UART1_RX_TX_IRQn ;
211
+ vector = (uint32_t )& uart1_irq ;
212
+ break ;
213
+ case UART_2 :
214
+ irq_n = UART2_RX_TX_IRQn ;
215
+ vector = (uint32_t )& uart2_irq ;
216
+ break ;
226
217
}
227
218
228
219
if (enable ) {
229
220
switch (irq ) {
230
- case RxIrq : obj -> uart -> C2 |= (UART_C2_RIE_MASK ); break ;
231
- case TxIrq : obj -> uart -> C2 |= (UART_C2_TIE_MASK ); break ;
221
+ case RxIrq :
222
+ obj -> uart -> C2 |= (UART_C2_RIE_MASK );
223
+ break ;
224
+ case TxIrq :
225
+ obj -> uart -> C2 |= (UART_C2_TIE_MASK );
226
+ break ;
232
227
}
233
228
NVIC_SetVector (irq_n , vector );
234
229
NVIC_EnableIRQ (irq_n );
@@ -237,21 +232,26 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
237
232
int all_disabled = 0 ;
238
233
SerialIrq other_irq = (irq == RxIrq ) ? (TxIrq ) : (RxIrq );
239
234
switch (irq ) {
240
- case RxIrq : obj -> uart -> C2 &= ~(UART_C2_RIE_MASK ); break ;
241
- case TxIrq : obj -> uart -> C2 &= ~(UART_C2_TIE_MASK ); break ;
235
+ case RxIrq :
236
+ obj -> uart -> C2 &= ~(UART_C2_RIE_MASK );
237
+ break ;
238
+ case TxIrq :
239
+ obj -> uart -> C2 &= ~(UART_C2_TIE_MASK );
240
+ break ;
242
241
}
243
242
switch (other_irq ) {
244
- case RxIrq : all_disabled = (obj -> uart -> C2 & (UART_C2_RIE_MASK )) == 0 ; break ;
245
- case TxIrq : all_disabled = (obj -> uart -> C2 & (UART_C2_TIE_MASK )) == 0 ; break ;
243
+ case RxIrq :
244
+ all_disabled = (obj -> uart -> C2 & (UART_C2_RIE_MASK )) == 0 ;
245
+ break ;
246
+ case TxIrq :
247
+ all_disabled = (obj -> uart -> C2 & (UART_C2_TIE_MASK )) == 0 ;
248
+ break ;
246
249
}
247
250
if (all_disabled )
248
251
NVIC_DisableIRQ (irq_n );
249
252
}
250
253
}
251
254
252
- /******************************************************************************
253
- * READ/WRITE
254
- ******************************************************************************/
255
255
int serial_getc (serial_t * obj ) {
256
256
while (!serial_readable (obj ));
257
257
return obj -> uart -> D ;
@@ -263,7 +263,7 @@ void serial_putc(serial_t *obj, int c) {
263
263
}
264
264
265
265
int serial_readable (serial_t * obj ) {
266
-
266
+
267
267
return (obj -> uart -> S1 & UART_S1_RDRF_MASK );
268
268
}
269
269
@@ -280,7 +280,7 @@ void serial_pinout_tx(PinName tx) {
280
280
}
281
281
282
282
void serial_break_set (serial_t * obj ) {
283
- obj -> uart -> C2 |= UART_C2_SBK_MASK ;
283
+ obj -> uart -> C2 |= UART_C2_SBK_MASK ;
284
284
}
285
285
286
286
void serial_break_clear (serial_t * obj ) {
0 commit comments