diff --git a/firmware/libcommon/source/card_emu.c b/firmware/libcommon/source/card_emu.c index ab54fc5f..bee03834 100644 --- a/firmware/libcommon/source/card_emu.c +++ b/firmware/libcommon/source/card_emu.c @@ -376,7 +376,7 @@ static void emu_update_fidi(struct card_handle *ch) int rc; rc = iso7816_3_compute_fd_ratio(ch->F_index, ch->D_index); - if (rc > 0 && rc < 0x400) { + if (rc > 0 && rc <= (US_FIDI_FI_DI_RATIO_Msk >> US_FIDI_FI_DI_RATIO_Pos)) { TRACE_INFO("%u: computed F(%u)/D(%u) ratio: %d\r\n", ch->num, ch->F_index, ch->D_index, rc); /* make sure UART uses new F/D ratio */ diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c index a5485e4d..3a0808d9 100644 --- a/firmware/libcommon/source/mode_cardemu.c +++ b/firmware/libcommon/source/mode_cardemu.c @@ -387,7 +387,7 @@ int card_emu_uart_update_fidi(uint8_t uart_chan, unsigned int fidi) Usart *usart = get_usart_by_chan(uart_chan); usart->US_CR |= US_CR_RXDIS | US_CR_RSTRX; - usart->US_FIDI = fidi & 0x3ff; + usart->US_FIDI = US_FIDI_FI_DI_RATIO(fidi); usart->US_CR |= US_CR_RXEN | US_CR_STTTO; return 0; } diff --git a/firmware/libcommon/source/simtrace_iso7816.c b/firmware/libcommon/source/simtrace_iso7816.c index 27677a67..f231faa5 100644 --- a/firmware/libcommon/source/simtrace_iso7816.c +++ b/firmware/libcommon/source/simtrace_iso7816.c @@ -127,14 +127,14 @@ void update_fidi(Usart_info *usart, uint8_t fidi) uint8_t di = fidi & 0xf; int ratio = iso7816_3_compute_fd_ratio(fi, di); - if (ratio > 0 && ratio < 0x8000) { + if (ratio > 0 && ratio <= (US_FIDI_FI_DI_RATIO_Msk >> US_FIDI_FI_DI_RATIO_Pos)) { /* 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_FIDI = US_FIDI_FI_DI_RATIO(ratio); 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 {