mirror of https://github.com/ARMmbed/mbed-os.git
[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().pull/8900/head
parent
6b16112962
commit
ae98b94a10
|
@ -200,36 +200,34 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||||
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
|
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
|
||||||
|
|
||||||
if (! var->ref_cnt) {
|
if (! var->ref_cnt) {
|
||||||
do {
|
/* Reset module
|
||||||
/* Reset module
|
*
|
||||||
*
|
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
|
||||||
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
|
*/
|
||||||
*/
|
SYS_ResetModule_S(modinit->rsetidx);
|
||||||
SYS_ResetModule_S(modinit->rsetidx);
|
|
||||||
|
|
||||||
/* Select IP clock source
|
/* Select IP clock source
|
||||||
*
|
*
|
||||||
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
|
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
|
||||||
*/
|
*/
|
||||||
CLK_SetModuleClock_S(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
|
CLK_SetModuleClock_S(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
|
||||||
|
|
||||||
/* Enable IP clock
|
/* Enable IP clock
|
||||||
*
|
*
|
||||||
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
|
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
|
||||||
*/
|
*/
|
||||||
CLK_EnableModuleClock_S(modinit->clkidx);
|
CLK_EnableModuleClock_S(modinit->clkidx);
|
||||||
|
|
||||||
pinmap_pinout(tx, PinMap_UART_TX);
|
pinmap_pinout(tx, PinMap_UART_TX);
|
||||||
pinmap_pinout(rx, PinMap_UART_RX);
|
pinmap_pinout(rx, PinMap_UART_RX);
|
||||||
} while (0);
|
|
||||||
|
// Configure the UART module and set its baudrate
|
||||||
|
serial_baud(obj, 9600);
|
||||||
|
// Configure data bits, parity, and stop bits
|
||||||
|
serial_format(obj, 8, ParityNone, 1);
|
||||||
}
|
}
|
||||||
var->ref_cnt ++;
|
var->ref_cnt ++;
|
||||||
|
|
||||||
// Configure the UART module and set its baudrate
|
|
||||||
serial_baud(obj, 9600);
|
|
||||||
// Configure data bits, parity, and stop bits
|
|
||||||
serial_format(obj, 8, ParityNone, 1);
|
|
||||||
|
|
||||||
obj->serial.vec = var->vec;
|
obj->serial.vec = var->vec;
|
||||||
obj->serial.irq_en = 0;
|
obj->serial.irq_en = 0;
|
||||||
|
|
||||||
|
|
|
@ -180,14 +180,14 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||||
|
|
||||||
pinmap_pinout(tx, PinMap_UART_TX);
|
pinmap_pinout(tx, PinMap_UART_TX);
|
||||||
pinmap_pinout(rx, PinMap_UART_RX);
|
pinmap_pinout(rx, PinMap_UART_RX);
|
||||||
|
|
||||||
|
// Configure the UART module and set its baudrate
|
||||||
|
serial_baud(obj, 9600);
|
||||||
|
// Configure data bits, parity, and stop bits
|
||||||
|
serial_format(obj, 8, ParityNone, 1);
|
||||||
}
|
}
|
||||||
var->ref_cnt ++;
|
var->ref_cnt ++;
|
||||||
|
|
||||||
// Configure the UART module and set its baudrate
|
|
||||||
serial_baud(obj, 9600);
|
|
||||||
// Configure data bits, parity, and stop bits
|
|
||||||
serial_format(obj, 8, ParityNone, 1);
|
|
||||||
|
|
||||||
obj->serial.vec = var->vec;
|
obj->serial.vec = var->vec;
|
||||||
obj->serial.irq_en = 0;
|
obj->serial.irq_en = 0;
|
||||||
|
|
||||||
|
|
|
@ -200,26 +200,24 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||||
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
|
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
|
||||||
|
|
||||||
if (! var->ref_cnt) {
|
if (! var->ref_cnt) {
|
||||||
do {
|
// Reset this module
|
||||||
// Reset this module
|
SYS_ResetModule(modinit->rsetidx);
|
||||||
SYS_ResetModule(modinit->rsetidx);
|
|
||||||
|
|
||||||
// Select IP clock source
|
// Select IP clock source
|
||||||
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
|
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
|
||||||
// Enable IP clock
|
// Enable IP clock
|
||||||
CLK_EnableModuleClock(modinit->clkidx);
|
CLK_EnableModuleClock(modinit->clkidx);
|
||||||
|
|
||||||
pinmap_pinout(tx, PinMap_UART_TX);
|
pinmap_pinout(tx, PinMap_UART_TX);
|
||||||
pinmap_pinout(rx, PinMap_UART_RX);
|
pinmap_pinout(rx, PinMap_UART_RX);
|
||||||
} while (0);
|
|
||||||
|
// Configure the UART module and set its baudrate
|
||||||
|
serial_baud(obj, 9600);
|
||||||
|
// Configure data bits, parity, and stop bits
|
||||||
|
serial_format(obj, 8, ParityNone, 1);
|
||||||
}
|
}
|
||||||
var->ref_cnt ++;
|
var->ref_cnt ++;
|
||||||
|
|
||||||
// Configure the UART module and set its baudrate
|
|
||||||
serial_baud(obj, 9600);
|
|
||||||
// Configure data bits, parity, and stop bits
|
|
||||||
serial_format(obj, 8, ParityNone, 1);
|
|
||||||
|
|
||||||
obj->serial.vec = var->vec;
|
obj->serial.vec = var->vec;
|
||||||
obj->serial.irq_en = 0;
|
obj->serial.irq_en = 0;
|
||||||
|
|
||||||
|
|
|
@ -145,14 +145,14 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||||
|
|
||||||
pinmap_pinout(tx, PinMap_UART_TX);
|
pinmap_pinout(tx, PinMap_UART_TX);
|
||||||
pinmap_pinout(rx, PinMap_UART_RX);
|
pinmap_pinout(rx, PinMap_UART_RX);
|
||||||
|
|
||||||
|
// Configure the UART module and set its baudrate
|
||||||
|
serial_baud(obj, 9600);
|
||||||
|
// Configure data bits, parity, and stop bits
|
||||||
|
serial_format(obj, 8, ParityNone, 1);
|
||||||
}
|
}
|
||||||
var->ref_cnt ++;
|
var->ref_cnt ++;
|
||||||
|
|
||||||
// Configure the UART module and set its baudrate
|
|
||||||
serial_baud(obj, 9600);
|
|
||||||
// Configure data bits, parity, and stop bits
|
|
||||||
serial_format(obj, 8, ParityNone, 1);
|
|
||||||
|
|
||||||
obj->serial.vec = var->vec;
|
obj->serial.vec = var->vec;
|
||||||
obj->serial.irq_en = 0;
|
obj->serial.irq_en = 0;
|
||||||
|
|
||||||
|
|
|
@ -210,14 +210,14 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||||
|
|
||||||
pinmap_pinout(tx, PinMap_UART_TX);
|
pinmap_pinout(tx, PinMap_UART_TX);
|
||||||
pinmap_pinout(rx, PinMap_UART_RX);
|
pinmap_pinout(rx, PinMap_UART_RX);
|
||||||
|
|
||||||
|
// Configure the UART module and set its baudrate
|
||||||
|
serial_baud(obj, 9600);
|
||||||
|
// Configure data bits, parity, and stop bits
|
||||||
|
serial_format(obj, 8, ParityNone, 1);
|
||||||
}
|
}
|
||||||
var->ref_cnt ++;
|
var->ref_cnt ++;
|
||||||
|
|
||||||
// Configure the UART module and set its baudrate
|
|
||||||
serial_baud(obj, 9600);
|
|
||||||
// Configure data bits, parity, and stop bits
|
|
||||||
serial_format(obj, 8, ParityNone, 1);
|
|
||||||
|
|
||||||
obj->serial.vec = var->vec;
|
obj->serial.vec = var->vec;
|
||||||
obj->serial.irq_en = 0;
|
obj->serial.irq_en = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue