diff options
author | laforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede> | 2005-09-11 19:59:05 +0000 |
---|---|---|
committer | laforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede> | 2005-09-11 19:59:05 +0000 |
commit | a740a7a578cb8a3f53b1b12b2e0833c8dbf4dcff (patch) | |
tree | 71f2ac27ae68aa052a8689c0258009d7c8e6d4e8 /rfid_proto_tcl.c | |
parent | a9d8406846ca231a420069b2687156d4a582b38f (diff) |
As Juergen Heinzl pointed out, much of my original fwi calculations evaluated
to zero due to the integer range limitations. shifting everything to the microsecond
range should solve this problem without introducing ugly floating point arithmetics.
git-svn-id: https://svn.gnumonks.org/trunk/librfid@1425 e0336214-984f-0b4b-a45f-81c69e1f0ede
Diffstat (limited to 'rfid_proto_tcl.c')
-rw-r--r-- | rfid_proto_tcl.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/rfid_proto_tcl.c b/rfid_proto_tcl.c index a992f70..b8586f5 100644 --- a/rfid_proto_tcl.c +++ b/rfid_proto_tcl.c @@ -40,15 +40,33 @@ static unsigned int sfgi_to_sfgt(struct rfid_protocol_handle *h, unsigned char sfgi) { - /* ISO 14443-4:2000(E) Section 5.2.5. */ - return (256 * 16 / h->l2h->rh->ah->fc) * (2 ^ sfgi); + unsigned int multiplier; + + if (sfgi > 14) + sfgi = 14; + + multiplier = 1 << sfgi; /* 2 to the power of sfgi */ + + /* ISO 14443-4:2000(E) Section 5.2.5: + * (256 * 16 / h->l2h->rh->ah->fc) * (2 ^ sfgi) */ + + return (1000000 * 256*16 / h->l2h->rh->ah->fc) * multiplier; } static unsigned int fwi_to_fwt(struct rfid_protocol_handle *h, unsigned char fwi) { - /* ISO 14443-4:2000(E) Section 7.2. */ - return (256*16 / h->l2h->rh->ah->fc) * (2 ^ fwi); + unsigned int multiplier; + + if (fwi > 14) + fwi = 14; + + multiplier = 1 << fwi; /* 2 to the power of fwi */ + + /* ISO 14443-4:2000(E) Section 7.2.: + * (256*16 / h->l2h->rh->ah->fc) * (2 ^ fwi) */ + + return (1000000 * 256*16 / h->l2h->rh->ah->fc) * multiplier; } #define activation_fwt(x) (65536 / x->l2h->rh->ah->fc) |