Chameleon-Mini
 All Classes Files Functions Variables Macros Pages
ISO14443-3AInline.h
1 /*
2  * ISO14443AUtilInline.h
3  *
4  * Created on: 11.06.2013
5  * Author: skuser
6  */
7 
8 #ifndef ISO14443_3AINLINE_H_
9 #define ISO14443_3AINLINE_H_
10 
11 
12 INLINE
13 bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t SAKValue)
14 {
15  uint8_t* DataPtr = (uint8_t*) Buffer;
16  uint8_t NVB = DataPtr[1];
17  //uint8_t CollisionByteCount = (NVB >> 4) & 0x0F;
18  //uint8_t CollisionBitCount = (NVB >> 0) & 0x0F;
19 
20  switch (NVB) {
21  case ISO14443A_NVB_AC_START:
22  /* Start of anticollision procedure.
23  * Send whole UID CLn + BCC */
24  DataPtr[0] = UidCL[0];
25  DataPtr[1] = UidCL[1];
26  DataPtr[2] = UidCL[2];
27  DataPtr[3] = UidCL[3];
28  DataPtr[4] = ISO14443A_CALC_BCC(DataPtr);
29 
30  *BitCount = ISO14443A_CL_FRAME_SIZE;
31 
32  return false;
33 
34  case ISO14443A_NVB_AC_END:
35  /* End of anticollision procedure.
36  * Send SAK CLn if we are selected. */
37  if ( (DataPtr[2] == UidCL[0]) &&
38  (DataPtr[3] == UidCL[1]) &&
39  (DataPtr[4] == UidCL[2]) &&
40  (DataPtr[5] == UidCL[3]) ) {
41 
42  DataPtr[0] = SAKValue;
43  ISO14443AAppendCRCA(Buffer, 1);
44 
45  *BitCount = ISO14443A_SAK_FRAME_SIZE;
46  return true;
47  } else {
48  /* We have not been selected. Don't send anything. */
49  *BitCount = 0;
50  return false;
51  }
52  default:
53  /* TODO: No anticollision supported */
54  *BitCount = 0;
55  return false;
56  }
57 }
58 
59 INLINE
60 bool ISO14443AWakeUp(void* Buffer, uint16_t* BitCount, uint16_t ATQAValue)
61 {
62  uint8_t* DataPtr = (uint8_t*) Buffer;
63 
64  if ( (DataPtr[0] == ISO14443A_CMD_REQA) || (DataPtr[0] == ISO14443A_CMD_WUPA) ){
65  DataPtr[0] = (ATQAValue >> 0) & 0x00FF;
66  DataPtr[1] = (ATQAValue >> 8) & 0x00FF;
67 
68  *BitCount = ISO14443A_ATQA_FRAME_SIZE;
69 
70  return true;
71  } else {
72  return false;
73  }
74 }
75 
76 #endif