Skip to content

Commit e82e190

Browse files
committed
K64F serial driver: Add explicit pinmap support
1 parent f1367c0 commit e82e190

File tree

1 file changed

+42
-15
lines changed
  • targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F

1 file changed

+42
-15
lines changed

targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/serial_api.c

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,9 @@ static clock_name_t const uart_clocks[] = UART_CLOCK_FREQS;
4848
int stdio_uart_inited = 0;
4949
serial_t stdio_uart;
5050

51-
void serial_init(serial_t *obj, PinName tx, PinName rx)
51+
void serial_init_direct(serial_t *obj, const serial_pinmap_t *pinmap)
5252
{
53-
uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
54-
uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);
55-
obj->serial.index = pinmap_merge(uart_tx, uart_rx);
53+
obj->serial.index = (uint32_t)pinmap->peripheral;
5654
MBED_ASSERT((int)obj->serial.index != NC);
5755

5856
uart_config_t config;
@@ -64,16 +62,16 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
6462

6563
UART_Init(uart_addrs[obj->serial.index], &config, CLOCK_GetFreq(uart_clocks[obj->serial.index]));
6664

67-
pinmap_pinout(tx, PinMap_UART_TX);
68-
pinmap_pinout(rx, PinMap_UART_RX);
65+
pin_function(pinmap->tx_pin, pinmap->tx_function);
66+
pin_function(pinmap->rx_pin, pinmap->rx_function);
6967

70-
if (tx != NC) {
68+
if (pinmap->tx_pin != NC) {
7169
UART_EnableTx(uart_addrs[obj->serial.index], true);
72-
pin_mode(tx, PullUp);
70+
pin_mode(pinmap->tx_pin, PullUp);
7371
}
74-
if (rx != NC) {
72+
if (pinmap->rx_pin != NC) {
7573
UART_EnableRx(uart_addrs[obj->serial.index], true);
76-
pin_mode(rx, PullUp);
74+
pin_mode(pinmap->rx_pin, PullUp);
7775
}
7876

7977
if (obj->serial.index == STDIO_UART) {
@@ -89,6 +87,21 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
8987
memset(&(obj->serial.uart_transfer_handle), 0, sizeof(obj->serial.uart_transfer_handle));
9088
}
9189

90+
void serial_init(serial_t *obj, PinName tx, PinName rx)
91+
{
92+
uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
93+
uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);
94+
95+
int peripheral = (int)pinmap_merge(uart_tx, uart_rx);
96+
97+
int tx_function = (int)pinmap_find_function(tx, PinMap_UART_TX);
98+
int rx_function = (int)pinmap_find_function(rx, PinMap_UART_RX);
99+
100+
const serial_pinmap_t explicit_uart_pinmap = {peripheral, tx, tx_function, rx, rx_function, 0};
101+
102+
serial_init_direct(obj, &explicit_uart_pinmap);
103+
}
104+
92105
void serial_free(serial_t *obj)
93106
{
94107
UART_Deinit(uart_addrs[obj->serial.index]);
@@ -336,24 +349,28 @@ const PinMap *serial_rts_pinmap()
336349
/*
337350
* Only hardware flow control is implemented in this API.
338351
*/
339-
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
352+
void serial_set_flow_control_direct(serial_t *obj, FlowControl type, const serial_fc_pinmap_t *pinmap)
340353
{
341354
switch(type) {
342355
case FlowControlRTS:
343-
pinmap_pinout(rxflow, PinMap_UART_RTS);
356+
pin_function(pinmap->rx_flow_pin, pinmap->rx_flow_function);
357+
pin_mode(pinmap->rx_flow_pin, PullNone);
344358
uart_addrs[obj->serial.index]->MODEM &= ~UART_MODEM_TXCTSE_MASK;
345359
uart_addrs[obj->serial.index]->MODEM |= UART_MODEM_RXRTSE_MASK;
346360
break;
347361

348362
case FlowControlCTS:
349-
pinmap_pinout(txflow, PinMap_UART_CTS);
363+
pin_function(pinmap->tx_flow_pin, pinmap->tx_flow_function);
364+
pin_mode(pinmap->tx_flow_pin, PullNone);
350365
uart_addrs[obj->serial.index]->MODEM &= ~UART_MODEM_RXRTSE_MASK;
351366
uart_addrs[obj->serial.index]->MODEM |= UART_MODEM_TXCTSE_MASK;
352367
break;
353368

354369
case FlowControlRTSCTS:
355-
pinmap_pinout(rxflow, PinMap_UART_RTS);
356-
pinmap_pinout(txflow, PinMap_UART_CTS);
370+
pin_function(pinmap->rx_flow_pin, pinmap->rx_flow_function);
371+
pin_mode(pinmap->rx_flow_pin, PullNone);
372+
pin_function(pinmap->tx_flow_pin, pinmap->tx_flow_function);
373+
pin_mode(pinmap->tx_flow_pin, PullNone);
357374
uart_addrs[obj->serial.index]->MODEM |= UART_MODEM_TXCTSE_MASK | UART_MODEM_RXRTSE_MASK;
358375
break;
359376

@@ -366,6 +383,16 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
366383
}
367384
}
368385

386+
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
387+
{
388+
int tx_flow_function = (int)pinmap_find_function(txflow, PinMap_UART_CTS);
389+
int rx_flow_function = (int)pinmap_find_function(rxflow, PinMap_UART_RTS);
390+
391+
const serial_fc_pinmap_t explicit_uart_fc_pinmap = {0, txflow, tx_flow_function, rxflow, rx_flow_function};
392+
393+
serial_set_flow_control_direct(obj, type, &explicit_uart_fc_pinmap);
394+
}
395+
369396
#endif
370397

371398
static void serial_send_asynch(serial_t *obj)

0 commit comments

Comments
 (0)