@@ -48,11 +48,9 @@ static clock_name_t const uart_clocks[] = UART_CLOCK_FREQS;
48
48
int stdio_uart_inited = 0 ;
49
49
serial_t stdio_uart ;
50
50
51
- void serial_init (serial_t * obj , PinName tx , PinName rx )
51
+ void serial_init_direct (serial_t * obj , const serial_pinmap_t * pinmap )
52
52
{
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 ;
56
54
MBED_ASSERT ((int )obj -> serial .index != NC );
57
55
58
56
uart_config_t config ;
@@ -64,16 +62,16 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
64
62
65
63
UART_Init (uart_addrs [obj -> serial .index ], & config , CLOCK_GetFreq (uart_clocks [obj -> serial .index ]));
66
64
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 );
69
67
70
- if (tx != NC ) {
68
+ if (pinmap -> tx_pin != NC ) {
71
69
UART_EnableTx (uart_addrs [obj -> serial .index ], true);
72
- pin_mode (tx , PullUp );
70
+ pin_mode (pinmap -> tx_pin , PullUp );
73
71
}
74
- if (rx != NC ) {
72
+ if (pinmap -> rx_pin != NC ) {
75
73
UART_EnableRx (uart_addrs [obj -> serial .index ], true);
76
- pin_mode (rx , PullUp );
74
+ pin_mode (pinmap -> rx_pin , PullUp );
77
75
}
78
76
79
77
if (obj -> serial .index == STDIO_UART ) {
@@ -89,6 +87,21 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
89
87
memset (& (obj -> serial .uart_transfer_handle ), 0 , sizeof (obj -> serial .uart_transfer_handle ));
90
88
}
91
89
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
+
92
105
void serial_free (serial_t * obj )
93
106
{
94
107
UART_Deinit (uart_addrs [obj -> serial .index ]);
@@ -336,24 +349,28 @@ const PinMap *serial_rts_pinmap()
336
349
/*
337
350
* Only hardware flow control is implemented in this API.
338
351
*/
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 )
340
353
{
341
354
switch (type ) {
342
355
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 );
344
358
uart_addrs [obj -> serial .index ]-> MODEM &= ~UART_MODEM_TXCTSE_MASK ;
345
359
uart_addrs [obj -> serial .index ]-> MODEM |= UART_MODEM_RXRTSE_MASK ;
346
360
break ;
347
361
348
362
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 );
350
365
uart_addrs [obj -> serial .index ]-> MODEM &= ~UART_MODEM_RXRTSE_MASK ;
351
366
uart_addrs [obj -> serial .index ]-> MODEM |= UART_MODEM_TXCTSE_MASK ;
352
367
break ;
353
368
354
369
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 );
357
374
uart_addrs [obj -> serial .index ]-> MODEM |= UART_MODEM_TXCTSE_MASK | UART_MODEM_RXRTSE_MASK ;
358
375
break ;
359
376
@@ -366,6 +383,16 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
366
383
}
367
384
}
368
385
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
+
369
396
#endif
370
397
371
398
static void serial_send_asynch (serial_t * obj )
0 commit comments