diff options
author | Kévin Redon <kredon@sysmocom.de> | 2018-06-25 15:53:19 +0200 |
---|---|---|
committer | King Kévin <kingkevin@cuvoodoo.info> | 2018-07-04 14:29:28 +0200 |
commit | 4fe99fad59d58d9c2396491e0db6a87709511582 (patch) | |
tree | f751c659de72d5f24c6c4f8a1429a6b11f5410b2 /firmware/libcommon/source/simtrace_iso7816.c | |
parent | 7be52ec1cefa26c62013293e36f2c9f65f0eac4b (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.c | 31 |
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); + } } |