+static uint8_t visa_chksum( uint32_t id ) {
+ uint8_t sum = 0;
+ for (uint8_t i = 0; i < 32; i += 4)
+ sum ^= (id >> i) & 0xF;
+ return sum & 0xF;
+}
+
+static uint8_t visa_parity( uint32_t id) {
+ // 4bit parity LUT
+ uint8_t par_lut[] = {
+ 0,1,1,0
+ ,1,0,0,1
+ ,1,0,0,1
+ ,0,1,1,0
+ };
+ uint8_t par = 0;
+ par |= par_lut[ NIBBLE_HIGH( (id >> 8) & 0xFF) ] << 3;
+ par |= par_lut[ NIBBLE_LOW( (id >> 8) & 0xFF) ] << 2;
+ par |= par_lut[ NIBBLE_HIGH( id & 0xFF ) ] << 1;
+ par |= par_lut[ NIBBLE_LOW( id & 0xFF) ];
+ return par;
+}
+
+
+/**
+*
+* 56495332 00096ebd 00000077 —> tag id 618173
+* aaaaaaaa iiiiiiii -----..c
+*
+* a = fixed value ascii 'VIS2'
+* i = card id
+* c = checksum (xor of card id)
+* . = unknown
+*
+**/