Hoernchen has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/simtrace2/+/43125?usp=email )


Change subject: firmware: use the full 11 bit US_FIDI.FI_DI_RATIO
......................................................................

firmware: use the full 11 bit US_FIDI.FI_DI_RATIO

US_FIDI_FI_DI_RATIO_Msk is 0x7ff,
cemu rejected >= 0x400 in emu_update_fidi() and masked with 0x3ff
in card_emu_uart_update_fidi(), but update_fidi() used by
the sniffer already used 0x7ff.

-> ratios 1024..2047 are unusable in cemu, which is the entire upper
half of ISO 7816-3 Table 7 at Di=1.

A reader trying one of those in a PPS gets the proposal echoed and
accepted, after which the card keeps transmitting at the old rate.

FI_DI_RATIO is clock periods per bit -> larger ratio is a SLOWER link.
The old check rejected slow values but accepted Fi=372/Di=64, ratio 5 !?

Unify and use the register mask (= shifed by 0 so usable as value) and
reject ratios that do not fit rather than truncating to garbage dividers.

Change-Id: I6211dd5be7c5c5d2150af2aa37a403b33e6d340d
---
M firmware/libcommon/source/card_emu.c
M firmware/libcommon/source/mode_cardemu.c
M firmware/libcommon/source/simtrace_iso7816.c
3 files changed, 4 insertions(+), 4 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/25/43125/1

diff --git a/firmware/libcommon/source/card_emu.c 
b/firmware/libcommon/source/card_emu.c
index ab54fc5..e6c119a 100644
--- a/firmware/libcommon/source/card_emu.c
+++ b/firmware/libcommon/source/card_emu.c
@@ -376,7 +376,7 @@
        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) {
                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 a5485e4..77f7454 100644
--- a/firmware/libcommon/source/mode_cardemu.c
+++ b/firmware/libcommon/source/mode_cardemu.c
@@ -387,7 +387,7 @@
        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 = fidi & US_FIDI_FI_DI_RATIO_Msk;
        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 27677a6..a2446a3 100644
--- a/firmware/libcommon/source/simtrace_iso7816.c
+++ b/firmware/libcommon/source/simtrace_iso7816.c
@@ -127,14 +127,14 @@
        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) {
                /* 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 = (ratio & US_FIDI_FI_DI_RATIO_Msk);
                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 {

--
To view, visit https://gerrit.osmocom.org/c/simtrace2/+/43125?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: simtrace2
Gerrit-Branch: master
Gerrit-Change-Id: I6211dd5be7c5c5d2150af2aa37a403b33e6d340d
Gerrit-Change-Number: 43125
Gerrit-PatchSet: 1
Gerrit-Owner: Hoernchen <[email protected]>

Reply via email to