aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Wild <ewild@sysmocom.de>2019-11-27 19:01:42 +0100
committerEric Wild <ewild@sysmocom.de>2019-11-28 13:42:16 +0100
commit9970ca0be73af439c7c3879477cf329d52d81966 (patch)
tree504b864287471da0bb0a0806b4964494aa0147cb
parent587d4fbb88235b6a1a7c3ca77599f7a21f364179 (diff)
cuart: allow getting the icc baud rate and clock freq
-rw-r--r--ccid_common/cuart.h3
-rw-r--r--sysmoOCTSIM/cuart_driver_asf4_usart_async.c9
2 files changed, 12 insertions, 0 deletions
diff --git a/ccid_common/cuart.h b/ccid_common/cuart.h
index c72b51c..6a782db 100644
--- a/ccid_common/cuart.h
+++ b/ccid_common/cuart.h
@@ -30,6 +30,8 @@ enum card_uart_ctl {
CUART_CTL_RST, /* enable/disable ICC reset */
CUART_CTL_WTIME, /* set the waiting time (in etu) */
CUART_CTL_SET_FD,
+ CUART_CTL_GET_BAUDRATE,
+ CUART_CTL_GET_CLOCK_FREQ,
};
struct card_uart;
@@ -100,6 +102,7 @@ struct card_uart {
uint8_t slot_nr;
/* in us, required, no delay breaks _rx_ */
uint32_t extrawait_after_rx;
+ uint32_t current_baudrate;
} asf4;
} u;
};
diff --git a/sysmoOCTSIM/cuart_driver_asf4_usart_async.c b/sysmoOCTSIM/cuart_driver_asf4_usart_async.c
index db3dc79..f12ed73 100644
--- a/sysmoOCTSIM/cuart_driver_asf4_usart_async.c
+++ b/sysmoOCTSIM/cuart_driver_asf4_usart_async.c
@@ -203,6 +203,9 @@ static bool slot_set_baudrate(uint8_t slotnr, uint32_t baudrate)
if (NULL == slot) {
return false;
}
+
+ // update cached values
+ cuart->u.asf4.current_baudrate = baudrate;
printf("(%u) switching SERCOM clock to GCLK%u (freq = %lu kHz) and baud rate to %lu bps (baud = %u)\r\n", slotnr, (best + 1) * 2, (uint32_t)(round(sercom_glck_freqs[best] / 1000)), baudrate, bauds[best]);
while (!usart_async_is_tx_empty(slot)); // wait for transmission to complete (WARNING no timeout)
usart_async_disable(slot); // disable SERCOM peripheral
@@ -404,6 +407,12 @@ static int asf4_usart_ctrl(struct card_uart *cuart, enum card_uart_ctl ctl, int
uint32_t baudrate = (20e6/divider)/arg;
cuart->u.asf4.extrawait_after_rx = 1./baudrate * 1000 * 1000;
slot_set_baudrate(cuart->u.asf4.slot_nr, baudrate);
+ case CUART_CTL_GET_BAUDRATE:
+ return cuart->u.asf4.current_baudrate;
+ break;
+ case CUART_CTL_GET_CLOCK_FREQ:
+ ncn8025_get(cuart->u.asf4.slot_nr, &settings);
+ return 20e6 / ncn8025_div_val[settings.clkdiv];
break;
default:
return -EINVAL;