aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/libcommon/source/simtrace_iso7816.c
diff options
context:
space:
mode:
authorKévin Redon <kredon@sysmocom.de>2018-06-25 15:53:19 +0200
committerKing Kévin <kingkevin@cuvoodoo.info>2018-07-04 14:29:28 +0200
commit4fe99fad59d58d9c2396491e0db6a87709511582 (patch)
treef751c659de72d5f24c6c4f8a1429a6b11f5410b2 /firmware/libcommon/source/simtrace_iso7816.c
parent7be52ec1cefa26c62013293e36f2c9f65f0eac4b (diff)
ISO7816: change update_fidi to use provided USART
Also disables write protection for USART register if required Change-Id: I716f4bc3a22800cbce402b146f14ef8b2aab2a98
Diffstat (limited to 'firmware/libcommon/source/simtrace_iso7816.c')
-rw-r--r--firmware/libcommon/source/simtrace_iso7816.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/firmware/libcommon/source/simtrace_iso7816.c b/firmware/libcommon/source/simtrace_iso7816.c
index 81ae980..17f38a8 100644
--- a/firmware/libcommon/source/simtrace_iso7816.c
+++ b/firmware/libcommon/source/simtrace_iso7816.c
@@ -116,20 +116,27 @@ void mode_trace_usart1_irq(void)
}
/* FIDI update functions */
-void update_fidi(uint8_t fidi)
+void update_fidi(Usart_info *usart, uint8_t fidi)
{
- int rc;
+ if (NULL==usart) {
+ return;
+ }
uint8_t fi = fidi >> 4;
uint8_t di = fidi & 0xf;
-
- rc = compute_fidi_ratio(fi, di);
- if (rc > 0 && rc < 0x400) {
- TRACE_INFO("computed Fi(%u) Di(%u) ratio: %d", fi, di, rc);
- /* make sure UART uses new F/D ratio */
- USART_PHONE->US_CR |= US_CR_RXDIS | US_CR_RSTRX;
- USART_PHONE->US_FIDI = rc & 0x3ff;
- USART_PHONE->US_CR |= US_CR_RXEN | US_CR_STTTO;
- } else
- TRACE_INFO("computed FiDi ratio %d unsupported", rc);
+ int ratio = compute_fidi_ratio(fi, di);
+
+ if (ratio > 0 && ratio < 0x8000) {
+ /* make sure USART uses new F/D ratio */
+ usart->base->US_CR |= US_CR_RXDIS | US_CR_RSTRX;
+ /* disable write protection */
+ if (usart->base->US_WPMR) {
+ usart->base->US_WPMR = US_WPMR_WPKEY(0x555341);
+ }
+ usart->base->US_FIDI = (ratio & 0x7ff);
+ usart->base->US_CR |= US_CR_RXEN | US_CR_STTTO;
+ TRACE_INFO("updated USART(%u) Fi(%u)/Di(%u) ratio(%d): %u\n\r", usart->id, fi, di, ratio, usart->base->US_FIDI);
+ } else {
+ TRACE_WARNING("computed Fi/Di ratio %d unsupported\n\r", ratio);
+ }
}