Skip to content

Commit ae98b94

Browse files
committed
[Nuvoton] Avoid re-configuring UART in serial_init() for the same H/W UART
The same H/W UART may be shared by multiple serial_t objects. This fix tries to avoid re-configuring the same H/W UART in serial_init() when there are multiple serial_t objects constructed. To re-configure UART, call serial_baud() and serial_format() explicitly. This can avoid confusion when e.g. a newly constructed serial_t object changes baudrate unexpectedly in serial_init().
1 parent 6b16112 commit ae98b94

File tree

5 files changed

+60
-64
lines changed

5 files changed

+60
-64
lines changed

targets/TARGET_NUVOTON/TARGET_M2351/serial_api.c

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -200,36 +200,34 @@ 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 the UART module and set its baudrate
225+
serial_baud(obj, 9600);
226+
// Configure data bits, parity, and stop bits
227+
serial_format(obj, 8, ParityNone, 1);
225228
}
226229
var->ref_cnt ++;
227230

228-
// Configure the UART module and set its baudrate
229-
serial_baud(obj, 9600);
230-
// Configure data bits, parity, and stop bits
231-
serial_format(obj, 8, ParityNone, 1);
232-
233231
obj->serial.vec = var->vec;
234232
obj->serial.irq_en = 0;
235233

targets/TARGET_NUVOTON/TARGET_M451/serial_api.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,22 +172,22 @@ 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+
// Configure the UART module and set its baudrate
185+
serial_baud(obj, 9600);
186+
// Configure data bits, parity, and stop bits
187+
serial_format(obj, 8, ParityNone, 1);
183188
}
184189
var->ref_cnt ++;
185-
186-
// Configure the UART module and set its baudrate
187-
serial_baud(obj, 9600);
188-
// Configure data bits, parity, and stop bits
189-
serial_format(obj, 8, ParityNone, 1);
190-
190+
191191
obj->serial.vec = var->vec;
192192
obj->serial.irq_en = 0;
193193

targets/TARGET_NUVOTON/TARGET_M480/serial_api.c

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -200,26 +200,24 @@ 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);
203+
// Reset this module
204+
SYS_ResetModule(modinit->rsetidx);
206205

207-
// Select IP clock source
208-
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
209-
// Enable IP clock
210-
CLK_EnableModuleClock(modinit->clkidx);
206+
// Select IP clock source
207+
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
208+
// Enable IP clock
209+
CLK_EnableModuleClock(modinit->clkidx);
211210

212-
pinmap_pinout(tx, PinMap_UART_TX);
213-
pinmap_pinout(rx, PinMap_UART_RX);
214-
} while (0);
211+
pinmap_pinout(tx, PinMap_UART_TX);
212+
pinmap_pinout(rx, PinMap_UART_RX);
213+
214+
// Configure the UART module and set its baudrate
215+
serial_baud(obj, 9600);
216+
// Configure data bits, parity, and stop bits
217+
serial_format(obj, 8, ParityNone, 1);
215218
}
216219
var->ref_cnt ++;
217220

218-
// Configure the UART module and set its baudrate
219-
serial_baud(obj, 9600);
220-
// Configure data bits, parity, and stop bits
221-
serial_format(obj, 8, ParityNone, 1);
222-
223221
obj->serial.vec = var->vec;
224222
obj->serial.irq_en = 0;
225223

targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,25 +137,25 @@ 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+
// Configure the UART module and set its baudrate
150+
serial_baud(obj, 9600);
151+
// Configure data bits, parity, and stop bits
152+
serial_format(obj, 8, ParityNone, 1);
148153
}
149154
var->ref_cnt ++;
150-
151-
// Configure the UART module and set its baudrate
152-
serial_baud(obj, 9600);
153-
// Configure data bits, parity, and stop bits
154-
serial_format(obj, 8, ParityNone, 1);
155-
155+
156156
obj->serial.vec = var->vec;
157157
obj->serial.irq_en = 0;
158-
158+
159159
#if DEVICE_SERIAL_ASYNCH
160160
obj->serial.dma_usage_tx = DMA_USAGE_NEVER;
161161
obj->serial.dma_usage_rx = DMA_USAGE_NEVER;

targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -202,22 +202,22 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
202202
if (! var->ref_cnt) {
203203
// Reset this module
204204
SYS_ResetModule(modinit->rsetidx);
205-
205+
206206
// Select IP clock source
207207
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
208208
// Enable IP clock
209209
CLK_EnableModuleClock(modinit->clkidx);
210210

211211
pinmap_pinout(tx, PinMap_UART_TX);
212212
pinmap_pinout(rx, PinMap_UART_RX);
213+
214+
// Configure the UART module and set its baudrate
215+
serial_baud(obj, 9600);
216+
// Configure data bits, parity, and stop bits
217+
serial_format(obj, 8, ParityNone, 1);
213218
}
214219
var->ref_cnt ++;
215-
216-
// Configure the UART module and set its baudrate
217-
serial_baud(obj, 9600);
218-
// Configure data bits, parity, and stop bits
219-
serial_format(obj, 8, ParityNone, 1);
220-
220+
221221
obj->serial.vec = var->vec;
222222
obj->serial.irq_en = 0;
223223

0 commit comments

Comments
 (0)