summaryrefslogtreecommitdiff
path: root/rfid_proto_tcl.c
diff options
context:
space:
mode:
authorlaforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede>2005-09-11 19:59:05 +0000
committerlaforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede>2005-09-11 19:59:05 +0000
commita740a7a578cb8a3f53b1b12b2e0833c8dbf4dcff (patch)
tree71f2ac27ae68aa052a8689c0258009d7c8e6d4e8 /rfid_proto_tcl.c
parenta9d8406846ca231a420069b2687156d4a582b38f (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.c26
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)
personal git repositories of Harald Welte. Your mileage may vary