Skip to content

Commit 0f0e63a

Browse files
author
Cruz Monrreal
authored
Merge pull request #8900 from OpenNuvoton/nuvoton_refine_uart
Nuvoton: Refine UART init/deinit
2 parents 0b1b8e0 + a2c70f2 commit 0f0e63a

File tree

10 files changed

+164
-118
lines changed

10 files changed

+164
-118
lines changed

targets/TARGET_NUVOTON/TARGET_M2351/objects.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@ struct dac_s {
5050

5151
struct serial_s {
5252
UARTName uart;
53-
PinName pin_tx;
54-
PinName pin_rx;
5553

5654
uint32_t baudrate;
5755
uint32_t databits;

targets/TARGET_NUVOTON/TARGET_M2351/serial_api.c

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -200,39 +200,45 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
200200
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
201201

202202
if (! var->ref_cnt) {
203-
do {
204-
/* Reset module
205-
*
206-
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
207-
*/
208-
SYS_ResetModule_S(modinit->rsetidx);
209-
210-
/* Select IP clock source
211-
*
212-
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
213-
*/
214-
CLK_SetModuleClock_S(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
215-
216-
/* Enable IP clock
217-
*
218-
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
219-
*/
220-
CLK_EnableModuleClock_S(modinit->clkidx);
221-
222-
pinmap_pinout(tx, PinMap_UART_TX);
223-
pinmap_pinout(rx, PinMap_UART_RX);
224-
} while (0);
203+
/* Reset module
204+
*
205+
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
206+
*/
207+
SYS_ResetModule_S(modinit->rsetidx);
208+
209+
/* Select IP clock source
210+
*
211+
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
212+
*/
213+
CLK_SetModuleClock_S(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
214+
215+
/* Enable IP clock
216+
*
217+
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
218+
*/
219+
CLK_EnableModuleClock_S(modinit->clkidx);
220+
221+
pinmap_pinout(tx, PinMap_UART_TX);
222+
pinmap_pinout(rx, PinMap_UART_RX);
223+
224+
// Configure baudrate
225+
int baudrate = 9600;
226+
if (obj->serial.uart == STDIO_UART) {
227+
#if MBED_CONF_PLATFORM_STDIO_BAUD_RATE
228+
baudrate = MBED_CONF_PLATFORM_STDIO_BAUD_RATE;
229+
#endif
230+
} else {
231+
#if MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE
232+
baudrate = MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE;
233+
#endif
234+
}
235+
serial_baud(obj, baudrate);
225236

226-
obj->serial.pin_tx = tx;
227-
obj->serial.pin_rx = rx;
237+
// Configure data bits, parity, and stop bits
238+
serial_format(obj, 8, ParityNone, 1);
228239
}
229240
var->ref_cnt ++;
230241

231-
// Configure the UART module and set its baudrate
232-
serial_baud(obj, 9600);
233-
// Configure data bits, parity, and stop bits
234-
serial_format(obj, 8, ParityNone, 1);
235-
236242
obj->serial.vec = var->vec;
237243
obj->serial.irq_en = 0;
238244

@@ -244,10 +250,12 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
244250
obj->serial.dma_chn_id_rx = DMA_ERROR_OUT_OF_CHANNELS;
245251
#endif
246252

247-
// For stdio management
248-
if (obj->serial.uart == STDIO_UART) {
253+
/* With support for checking H/W UART initialized or not, we allow serial_init(&stdio_uart)
254+
* calls in even though H/W UART 'STDIO_UART' has initialized. When serial_init(&stdio_uart)
255+
* calls in, we only need to set the 'stdio_uart_inited' flag. */
256+
if (((uintptr_t) obj) == ((uintptr_t) &stdio_uart)) {
257+
MBED_ASSERT(obj->serial.uart == STDIO_UART);
249258
stdio_uart_inited = 1;
250-
memcpy(&stdio_uart, obj, sizeof(serial_t));
251259
}
252260

253261
if (var->ref_cnt) {
@@ -296,7 +304,9 @@ void serial_free(serial_t *obj)
296304
var->obj = NULL;
297305
}
298306

299-
if (obj->serial.uart == STDIO_UART) {
307+
/* Clear the 'stdio_uart_inited' flag when serial_free(&stdio_uart) calls in. */
308+
if (((uintptr_t) obj) == ((uintptr_t) &stdio_uart)) {
309+
MBED_ASSERT(obj->serial.uart == STDIO_UART);
300310
stdio_uart_inited = 0;
301311
}
302312

targets/TARGET_NUVOTON/TARGET_M451/objects.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ struct dac_s {
5454

5555
struct serial_s {
5656
UARTName uart;
57-
PinName pin_tx;
58-
PinName pin_rx;
5957

6058
uint32_t baudrate;
6159
uint32_t databits;

targets/TARGET_NUVOTON/TARGET_M451/serial_api.c

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -172,25 +172,33 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
172172
if (! var->ref_cnt) {
173173
// Reset this module
174174
SYS_ResetModule(modinit->rsetidx);
175-
175+
176176
// Select IP clock source
177177
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
178178
// Enable IP clock
179179
CLK_EnableModuleClock(modinit->clkidx);
180180

181181
pinmap_pinout(tx, PinMap_UART_TX);
182182
pinmap_pinout(rx, PinMap_UART_RX);
183-
184-
obj->serial.pin_tx = tx;
185-
obj->serial.pin_rx = rx;
183+
184+
// Configure baudrate
185+
int baudrate = 9600;
186+
if (obj->serial.uart == STDIO_UART) {
187+
#if MBED_CONF_PLATFORM_STDIO_BAUD_RATE
188+
baudrate = MBED_CONF_PLATFORM_STDIO_BAUD_RATE;
189+
#endif
190+
} else {
191+
#if MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE
192+
baudrate = MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE;
193+
#endif
194+
}
195+
serial_baud(obj, baudrate);
196+
197+
// Configure data bits, parity, and stop bits
198+
serial_format(obj, 8, ParityNone, 1);
186199
}
187200
var->ref_cnt ++;
188-
189-
// Configure the UART module and set its baudrate
190-
serial_baud(obj, 9600);
191-
// Configure data bits, parity, and stop bits
192-
serial_format(obj, 8, ParityNone, 1);
193-
201+
194202
obj->serial.vec = var->vec;
195203
obj->serial.irq_en = 0;
196204

@@ -202,12 +210,14 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
202210
obj->serial.dma_chn_id_rx = DMA_ERROR_OUT_OF_CHANNELS;
203211
#endif
204212

205-
// For stdio management
206-
if (obj->serial.uart == STDIO_UART) {
213+
/* With support for checking H/W UART initialized or not, we allow serial_init(&stdio_uart)
214+
* calls in even though H/W UART 'STDIO_UART' has initialized. When serial_init(&stdio_uart)
215+
* calls in, we only need to set the 'stdio_uart_inited' flag. */
216+
if (((uintptr_t) obj) == ((uintptr_t) &stdio_uart)) {
217+
MBED_ASSERT(obj->serial.uart == STDIO_UART);
207218
stdio_uart_inited = 1;
208-
memcpy(&stdio_uart, obj, sizeof(serial_t));
209219
}
210-
220+
211221
if (var->ref_cnt) {
212222
// Mark this module to be inited.
213223
int i = modinit - uart_modinit_tab;
@@ -248,11 +258,13 @@ void serial_free(serial_t *obj)
248258
if (var->obj == obj) {
249259
var->obj = NULL;
250260
}
251-
252-
if (obj->serial.uart == STDIO_UART) {
261+
262+
/* Clear the 'stdio_uart_inited' flag when serial_free(&stdio_uart) calls in. */
263+
if (((uintptr_t) obj) == ((uintptr_t) &stdio_uart)) {
264+
MBED_ASSERT(obj->serial.uart == STDIO_UART);
253265
stdio_uart_inited = 0;
254266
}
255-
267+
256268
if (! var->ref_cnt) {
257269
// Mark this module to be deinited.
258270
int i = modinit - uart_modinit_tab;

targets/TARGET_NUVOTON/TARGET_M480/objects.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ struct dac_s {
5454

5555
struct serial_s {
5656
UARTName uart;
57-
PinName pin_tx;
58-
PinName pin_rx;
5957

6058
uint32_t baudrate;
6159
uint32_t databits;

targets/TARGET_NUVOTON/TARGET_M480/serial_api.c

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -200,29 +200,35 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
200200
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
201201

202202
if (! var->ref_cnt) {
203-
do {
204-
// Reset this module
205-
SYS_ResetModule(modinit->rsetidx);
206-
207-
// Select IP clock source
208-
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
209-
// Enable IP clock
210-
CLK_EnableModuleClock(modinit->clkidx);
211-
212-
pinmap_pinout(tx, PinMap_UART_TX);
213-
pinmap_pinout(rx, PinMap_UART_RX);
214-
} while (0);
203+
// Reset this module
204+
SYS_ResetModule(modinit->rsetidx);
205+
206+
// Select IP clock source
207+
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
208+
// Enable IP clock
209+
CLK_EnableModuleClock(modinit->clkidx);
210+
211+
pinmap_pinout(tx, PinMap_UART_TX);
212+
pinmap_pinout(rx, PinMap_UART_RX);
213+
214+
// Configure baudrate
215+
int baudrate = 9600;
216+
if (obj->serial.uart == STDIO_UART) {
217+
#if MBED_CONF_PLATFORM_STDIO_BAUD_RATE
218+
baudrate = MBED_CONF_PLATFORM_STDIO_BAUD_RATE;
219+
#endif
220+
} else {
221+
#if MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE
222+
baudrate = MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE;
223+
#endif
224+
}
225+
serial_baud(obj, baudrate);
215226

216-
obj->serial.pin_tx = tx;
217-
obj->serial.pin_rx = rx;
227+
// Configure data bits, parity, and stop bits
228+
serial_format(obj, 8, ParityNone, 1);
218229
}
219230
var->ref_cnt ++;
220231

221-
// Configure the UART module and set its baudrate
222-
serial_baud(obj, 9600);
223-
// Configure data bits, parity, and stop bits
224-
serial_format(obj, 8, ParityNone, 1);
225-
226232
obj->serial.vec = var->vec;
227233
obj->serial.irq_en = 0;
228234

@@ -234,10 +240,12 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
234240
obj->serial.dma_chn_id_rx = DMA_ERROR_OUT_OF_CHANNELS;
235241
#endif
236242

237-
// For stdio management
238-
if (obj->serial.uart == STDIO_UART) {
243+
/* With support for checking H/W UART initialized or not, we allow serial_init(&stdio_uart)
244+
* calls in even though H/W UART 'STDIO_UART' has initialized. When serial_init(&stdio_uart)
245+
* calls in, we only need to set the 'stdio_uart_inited' flag. */
246+
if (((uintptr_t) obj) == ((uintptr_t) &stdio_uart)) {
247+
MBED_ASSERT(obj->serial.uart == STDIO_UART);
239248
stdio_uart_inited = 1;
240-
memcpy(&stdio_uart, obj, sizeof(serial_t));
241249
}
242250

243251
if (var->ref_cnt) {
@@ -283,7 +291,9 @@ void serial_free(serial_t *obj)
283291
var->obj = NULL;
284292
}
285293

286-
if (obj->serial.uart == STDIO_UART) {
294+
/* Clear the 'stdio_uart_inited' flag when serial_free(&stdio_uart) calls in. */
295+
if (((uintptr_t) obj) == ((uintptr_t) &stdio_uart)) {
296+
MBED_ASSERT(obj->serial.uart == STDIO_UART);
287297
stdio_uart_inited = 0;
288298
}
289299

targets/TARGET_NUVOTON/TARGET_NANO100/objects.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@ struct dac_s {
5050

5151
struct serial_s {
5252
UARTName uart;
53-
PinName pin_tx;
54-
PinName pin_rx;
5553

5654
uint32_t baudrate;
5755
uint32_t databits;

targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -137,28 +137,36 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
137137
if (! var->ref_cnt) {
138138
// Reset this module
139139
SYS_ResetModule(modinit->rsetidx);
140-
140+
141141
// Select IP clock source
142142
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
143143
// Enable IP clock
144144
CLK_EnableModuleClock(modinit->clkidx);
145145

146146
pinmap_pinout(tx, PinMap_UART_TX);
147147
pinmap_pinout(rx, PinMap_UART_RX);
148-
149-
obj->serial.pin_tx = tx;
150-
obj->serial.pin_rx = rx;
148+
149+
// Configure baudrate
150+
int baudrate = 9600;
151+
if (obj->serial.uart == STDIO_UART) {
152+
#if MBED_CONF_PLATFORM_STDIO_BAUD_RATE
153+
baudrate = MBED_CONF_PLATFORM_STDIO_BAUD_RATE;
154+
#endif
155+
} else {
156+
#if MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE
157+
baudrate = MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE;
158+
#endif
159+
}
160+
serial_baud(obj, baudrate);
161+
162+
// Configure data bits, parity, and stop bits
163+
serial_format(obj, 8, ParityNone, 1);
151164
}
152165
var->ref_cnt ++;
153-
154-
// Configure the UART module and set its baudrate
155-
serial_baud(obj, 9600);
156-
// Configure data bits, parity, and stop bits
157-
serial_format(obj, 8, ParityNone, 1);
158-
166+
159167
obj->serial.vec = var->vec;
160168
obj->serial.irq_en = 0;
161-
169+
162170
#if DEVICE_SERIAL_ASYNCH
163171
obj->serial.dma_usage_tx = DMA_USAGE_NEVER;
164172
obj->serial.dma_usage_rx = DMA_USAGE_NEVER;
@@ -167,12 +175,14 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
167175
obj->serial.dma_chn_id_rx = DMA_ERROR_OUT_OF_CHANNELS;
168176
#endif
169177

170-
// For stdio management
171-
if (obj->serial.uart == STDIO_UART) {
178+
/* With support for checking H/W UART initialized or not, we allow serial_init(&stdio_uart)
179+
* calls in even though H/W UART 'STDIO_UART' has initialized. When serial_init(&stdio_uart)
180+
* calls in, we only need to set the 'stdio_uart_inited' flag. */
181+
if (((uintptr_t) obj) == ((uintptr_t) &stdio_uart)) {
182+
MBED_ASSERT(obj->serial.uart == STDIO_UART);
172183
stdio_uart_inited = 1;
173-
memcpy(&stdio_uart, obj, sizeof(serial_t));
174184
}
175-
185+
176186
if (var->ref_cnt) {
177187
// Mark this module to be inited.
178188
int i = modinit - uart_modinit_tab;
@@ -213,11 +223,13 @@ void serial_free(serial_t *obj)
213223
if (var->obj == obj) {
214224
var->obj = NULL;
215225
}
216-
217-
if (obj->serial.uart == STDIO_UART) {
226+
227+
/* Clear the 'stdio_uart_inited' flag when serial_free(&stdio_uart) calls in. */
228+
if (((uintptr_t) obj) == ((uintptr_t) &stdio_uart)) {
229+
MBED_ASSERT(obj->serial.uart == STDIO_UART);
218230
stdio_uart_inited = 0;
219231
}
220-
232+
221233
if (! var->ref_cnt) {
222234
// Mark this module to be deinited.
223235
int i = modinit - uart_modinit_tab;

targets/TARGET_NUVOTON/TARGET_NUC472/objects.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@ struct analogin_s {
5050

5151
struct serial_s {
5252
UARTName uart;
53-
PinName pin_tx;
54-
PinName pin_rx;
5553

5654
uint32_t baudrate;
5755
uint32_t databits;

0 commit comments

Comments
 (0)