Fix bitfields for big endian platforms (Jeremy Lainé)
authorHarald Welte <laforge@gnumonks.org>
Tue, 22 Jan 2008 15:45:50 +0000 (15:45 +0000)
committerHarald Welte <laforge@gnumonks.org>
Tue, 22 Jan 2008 15:45:50 +0000 (15:45 +0000)
git-svn-id: https://svn.gnumonks.org/trunk/librfid@2038 e0336214-984f-0b4b-a45f-81c69e1f0ede

configure.in
include/librfid/rfid_access_mifare_classic.h
include/librfid/rfid_layer2_iso14443a.h
include/librfid/rfid_layer2_iso14443b.h
src/rfid_proto_mifare_classic.c
src/rfid_proto_mifare_ul.c

index 8f42d49..e65cdbd 100644 (file)
@@ -23,6 +23,8 @@ AC_SUBST(BUILDENV)
 AM_CONDITIONAL(ENABLE_WIN32, test "$BUILDENV" == "WIN32")
 AM_CONDITIONAL(DISABLE_WIN32, test "$BUILDENV" != "WIN32")
 
+AC_C_BIGENDIAN(AC_DEFINE(RFID_BIG_ENDIAN_BITFIELD, 1, [Big-endian bitfield]),,)
+
 AC_ARG_ENABLE(ccid,
        [  --enable-ccid        Include internal CCID driver for CM5121],
        [MY_CCID=1], [MY_CCID=0])
index 3c23724..4c7fbdf 100644 (file)
@@ -17,20 +17,38 @@ enum mfcl_access_exp_data {
 };
 
 struct mfcl_access_exp_block {
+#ifndef RFID_BIG_ENDIAN_BITFIELD
        u_int8_t read:2,
                 write:2,
                 inc:2,
                 dec:2;
-};
+#else
+       u_int8_t dec:2,
+                inc:2,
+                write:2,
+                read:2;
+#endif
+} __attribute__ ((packed));
 
 struct mfcl_access_exp_acc {
-       u_int16_t key_a_rd:2,
+#ifndef RFID_BIG_ENDIAN_BITFIELD
+       u_int8_t key_a_rd:2,
                  key_a_wr:2,
                  acc_rd:2,
-                 acc_wr:2,
-                 key_b_rd:2,
-                 key_b_wr:2;
-};
+                 acc_wr:2;
+       u_int8_t key_b_rd:2,
+                 key_b_wr:2,
+                 reserved:4;
+#else
+       u_int8_t acc_wr:2,
+                 acc_rd:2,
+                 key_a_wr:2,
+                 key_a_rd:2;
+       u_int8_t reserved:4,
+                 key_b_wr:2,
+                 key_b_rd:2;
+#endif
+} __attribute__ ((packed));
 
 
 struct mfcl_access_exp_sect {
index 9a795c2..a4af557 100644 (file)
@@ -30,11 +30,19 @@ enum iso14443a_sf_cmd {
 };
 
 struct iso14443a_atqa {
+#ifndef RFID_BIG_ENDIAN_BITFIELD
        u_int8_t bf_anticol:5,
                 rfu1:1,
                 uid_size:2;
        u_int8_t proprietary:4,
                 rfu2:4;
+#else
+       u_int8_t uid_size:2,
+                rfu1:1,
+                bf_anticol:5;
+       u_int8_t rfu2:4,
+                proprietary:4;
+#endif
 } __attribute__((packed));
 
 #define ISO14443A_HLTA         0x5000
index 89999c6..2a31997 100644 (file)
@@ -20,11 +20,19 @@ struct iso14443b_atqb {
        unsigned char app_data[4];
        struct {
                unsigned char bit_rate_capability;
+#ifndef RFID_BIG_ENDIAN_BITFIELD
                unsigned char protocol_type:4,
                              max_frame_size:4;
                unsigned char fo:2,
                              adc:2,
                              fwi:4;
+#else
+               unsigned char max_frame_size:4,
+                             protocol_type:4;
+               unsigned char fwi:4,
+                             adc:2,
+                             fo:2;
+#endif
        } __attribute__ ((packed)) protocol_info;
 } __attribute__ ((packed));
 
@@ -32,24 +40,48 @@ struct iso14443b_attrib_hdr {
        unsigned char one_d;
        unsigned char identifier[4];
        struct {
+#ifndef RFID_BIG_ENDIAN_BITFIELD
                unsigned char rfu:2,
                              sof:1,
                              eof:1,
                              min_tr1:2,
                              min_tr0:2;
+#else
+               unsigned char min_tr0:2,
+                             min_tr1:1,
+                             eof:1,
+                             sof:1,
+                             rfu:2;
+#endif
        } __attribute__ ((packed)) param1;
        struct {
+#ifndef RFID_BIG_ENDIAN_BITFIELD
                unsigned char fsdi:4,
                              spd_out:2,
                              spd_in:2;
+#else
+               unsigned char spd_in:2,
+                             spd_out:2,
+                             fsdi:4;
+#endif
        } __attribute__ ((packed)) param2;
        struct {
+#ifndef RFID_BIG_ENDIAN_BITFIELD
                unsigned char protocol_type:4,
                              rfu:4;
+#else
+               unsigned char rfu:4,
+                             protocol_type:4;
+#endif
        } __attribute__ ((packed)) param3;
        struct {
+#ifndef RFID_BIG_ENDIAN_BITFIELD
                unsigned char cid:4,
                              rfu:4;
+#else
+               unsigned char rfu:4,
+                             cid:4;
+#endif
        } __attribute__ ((packed)) param4;
 } __attribute__ ((packed));
 
index e98dc28..004e002 100644 (file)
@@ -79,7 +79,6 @@ static int
 mfcl_write(struct rfid_protocol_handle *ph, unsigned int page,
           unsigned char *tx_data, unsigned int tx_len)
 {
-       unsigned int i;
        unsigned char tx[18];
        unsigned char rx[1];
        unsigned int rx_len = sizeof(rx);
@@ -145,7 +144,7 @@ mfcl_getopt(struct rfid_protocol_handle *ph, int optname, void *optval,
            unsigned int *optlen)
 {
        int ret = -EINVAL;
-       u_int16_t atqa;
+       u_int8_t atqa[2];
        unsigned int atqa_size = sizeof(atqa);
        unsigned int *size = optval;
 
@@ -156,10 +155,10 @@ mfcl_getopt(struct rfid_protocol_handle *ph, int optname, void *optval,
                *optlen = sizeof(*size);
                ret = 0;
                rfid_layer2_getopt(ph->l2h, RFID_OPT_14443A_ATQA,
-                                  (void *) &atqa, &atqa_size);
-               if (atqa == 0x0004)
+                                  atqa, &atqa_size);
+               if (atqa[0] == 0x04 && atqa[1] == 0x00)
                        *size = 1024;
-               else if (atqa == 0x0002)
+               else if (atqa[0] == 0x02 && atqa[1] == 0x00)
                        *size = 4096;
                else
                        ret = -EIO;
index 7243c89..e1fe3b9 100644 (file)
@@ -99,21 +99,11 @@ mful_write(struct rfid_protocol_handle *ph, unsigned int page,
        return ret;
 }
 
-static int
-mful_transceive(struct rfid_protocol_handle *ph,
-               const unsigned char *tx_data, unsigned int tx_len,
-               unsigned char *rx_data, unsigned int *rx_len,
-               unsigned int timeout, unsigned int flags)
-{
-       return -EINVAL;
-}
-
 static int 
 mful_getopt(struct rfid_protocol_handle *ph, int optname, void *optval,
            unsigned int *optlen)
 {
        int ret = -EINVAL;
-       u_int16_t atqa;
        unsigned int *size = optval;
 
        switch (optname) {
@@ -131,7 +121,7 @@ static struct rfid_protocol_handle *
 mful_init(struct rfid_layer2_handle *l2h)
 {
        struct rfid_protocol_handle *ph;
-       u_int16_t atqa;
+       u_int8_t atqa[2];
        unsigned int atqa_len = sizeof(atqa);
 
        if (l2h->l2->id != RFID_LAYER2_ISO14443A)
@@ -139,8 +129,8 @@ mful_init(struct rfid_layer2_handle *l2h)
        
        /* According to "Type Identification Procedure Rev. 1.3" */
        rfid_layer2_getopt(l2h, RFID_OPT_14443A_ATQA,
-                          &atqa, &atqa_len);
-       if (atqa != 0x0044)
+                          atqa, &atqa_len);
+       if (atqa[0] != 0x44 || atqa[1] != 0x00)
                return NULL;
 
        /* according to "Functional Specification Rev. 3.0 */