Module_RFID.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026
  1. /*
  2. * Module_RFID.c
  3. *
  4. * Created on: 2019-10-24
  5. * Update: 2020-10-19
  6. * Author: Eason Yang
  7. * Version: V0.03
  8. *
  9. * History
  10. * 1. Added : Reyax code.
  11. *
  12. *
  13. *
  14. *
  15. *
  16. */
  17. #include "Module_RFID.h"
  18. //==================================
  19. // PRINT OUT LOG FORMAT
  20. //==================================
  21. #define SystemLogMessage
  22. #define DEBUG_INFO_1(format, args...) StoreLogMessage("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  23. #define DEBUG_WARN_1(format, args...) StoreLogMessage("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  24. #define DEBUG_ERROR_1(format, args...) StoreLogMessage("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  25. //==================================
  26. // SYSTEM CONSTANT
  27. //==================================
  28. #define Debug
  29. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  30. #define PASS 1
  31. #define FAIL -1
  32. //==================================
  33. // RFID CMD CONSTANT
  34. //==================================
  35. unsigned int RFID_CMD_ISO1443A_REQUEST = 0x20;
  36. unsigned int RFID_CMD_ISO1443B_REQUEST = 0x60;
  37. unsigned int RFID_CMD_FELICA_POLLING_REQUEST = 0x2F;
  38. unsigned int RFID_CMD_HALT_14443A = 0x28;
  39. unsigned int RFID_CMD_BLOCK_READ = 0x21;
  40. unsigned int RFID_CMD_BLOCK_WRITE = 0x22;
  41. unsigned int RFID_CMD_BUZZER_SET = 0x14;
  42. unsigned int RFID_CMD_RF_OUTPUT_LEVEL_SET = 0x02;
  43. unsigned int RFID_CMD_DEFAULT_AUTO_DETECTING_CARD = 0x1D;
  44. //==================================
  45. // RFID MODE CONSTANT
  46. //==================================
  47. unsigned char WUPA = 0;
  48. unsigned char REQA = 1;
  49. unsigned char AFI = 0;
  50. //==================================
  51. // MIFARE CARD LENGTH
  52. //==================================
  53. unsigned int LENGTH_0 = 0;
  54. unsigned int LENGTH_4 = 4;
  55. unsigned int LENGTH_6 = 6;
  56. unsigned int LENGTH_7 = 7;
  57. unsigned int LENGTH_10 = 10;
  58. //==================================
  59. // RF output Level constant
  60. //==================================
  61. unsigned int RF_STRONGEST = 0x00;
  62. unsigned int RF_STRONGER = 0x01;
  63. unsigned int RF_WEAK = 0x02;
  64. unsigned int RF_WEAKEST = 0x03;
  65. //==================================
  66. // Default of Automatic Detecting constant
  67. //==================================
  68. unsigned int TURN_OFF = 0x00;
  69. unsigned int TURN_ON = 0X01;
  70. unsigned int TURN_TEMPORARILY = 0x11;
  71. //==================================
  72. // MIFARE SECTOR SPACE
  73. //==================================
  74. #define ROW 6
  75. #define COLUMN 16
  76. unsigned char sectorKeyA[COLUMN][ROW] = { {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  77. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  78. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  79. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  80. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  81. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  82. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  83. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  84. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  85. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  86. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  87. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  88. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  89. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  90. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  91. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
  92. };
  93. unsigned char serialNumber[32];
  94. unsigned int cardLength;
  95. //==================================
  96. // SystemLog message
  97. //==================================
  98. #ifdef SystemLogMessage
  99. int StoreLogMessage(const char *fmt, ...)
  100. {
  101. char Buf[4096 + 256];
  102. char buffer[4096];
  103. time_t CurrentTime;
  104. struct tm *tm;
  105. va_list args;
  106. va_start(args, fmt);
  107. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  108. va_end(args);
  109. memset(Buf, 0, sizeof(Buf));
  110. CurrentTime = time(NULL);
  111. tm = localtime(&CurrentTime);
  112. sprintf(Buf,
  113. "echo \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >> /Storage/SystemLog/[%04d.%02d]RFID_SystemLog",
  114. tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour,
  115. tm->tm_min, tm->tm_sec, buffer, tm->tm_year + 1900, tm->tm_mon + 1);
  116. system(Buf);
  117. #ifdef Debug
  118. printf("[%04d.%02d.%02d %02d:%02d:%02d] - %s", tm->tm_year + 1900,
  119. tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec,
  120. buffer);
  121. #endif
  122. return rc;
  123. }
  124. #endif
  125. //==========================================
  126. // Module's command send/receive
  127. //==========================================
  128. int system_command(int uart, unsigned char* cmd,int length, unsigned char* rx)
  129. {
  130. int len;
  131. //sleep(2); //required to make flush work, for some reason
  132. tcflush(uart,TCIOFLUSH);
  133. if(write(uart, cmd, length) >= 0)
  134. {
  135. usleep(100000);
  136. len = read(uart, rx, 256);
  137. }
  138. else
  139. {
  140. DEBUG_ERROR_1("system command %s response fail.\n", cmd);
  141. }
  142. return len;
  143. }
  144. //==========================================
  145. // Module's AT command send/receive (REYAX)
  146. //==========================================
  147. int at_command(int uart, unsigned char* cmd,int length, unsigned char* rx)
  148. {
  149. int len;
  150. //sleep(2); //required to make flush work, for some reason
  151. tcflush(uart,TCIOFLUSH);
  152. if(write(uart, cmd, length) >= ARRAY_SIZE(cmd))
  153. {
  154. usleep(100000);
  155. len = read(uart, rx, 512);
  156. }
  157. else
  158. {
  159. DEBUG_ERROR_1("AT command %s response fail.\n", cmd);
  160. }
  161. return len;
  162. }
  163. //==========================================
  164. // Calculation checksum function
  165. //==========================================
  166. char ClaCheckSum(unsigned char *buffer, int len)
  167. {
  168. int idx;
  169. char chksum = 0;
  170. for(idx = 0 ; idx < len-1 ; idx++)
  171. {
  172. chksum ^= *(buffer+idx);
  173. }
  174. return chksum;
  175. }
  176. bool getRequestCardSN(int Fd, int moduleType, RFID* rfid)
  177. {
  178. bool isSuccess = false;
  179. if(ISO14443A_REQUEST_SN(Fd,moduleType,serialNumber) == true)
  180. {
  181. rfid->cardType = ISO14443A;
  182. if(cardLength == LENGTH_4)
  183. {
  184. rfid->snType = RFID_SN_TYPE_4BYTE;
  185. memcpy(rfid->currentCard, &serialNumber, 32);
  186. }
  187. else if(cardLength == LENGTH_7)
  188. {
  189. rfid->snType = RFID_SN_TYPE_7BYTE;
  190. memcpy(rfid->currentCard, &serialNumber, 32);
  191. }
  192. isSuccess = true;
  193. }
  194. else if(ISO14443B_REQUEST_SN(Fd,moduleType,serialNumber) == true)
  195. {
  196. rfid->cardType = IS014443B;
  197. rfid->snType = RFID_SN_TYPE_4BYTE;
  198. memcpy(rfid->currentCard, &serialNumber, 32);
  199. sleep(2);
  200. isSuccess = true;
  201. }
  202. else if(FELICA_REQUEST_SN(Fd,moduleType,serialNumber) == true)
  203. {
  204. rfid->cardType = FELICA;
  205. rfid->snType = RFID_SN_TYPE_6BYTE;
  206. memcpy(rfid->currentCard, &serialNumber, 32);
  207. sleep(2);
  208. isSuccess = true;
  209. }
  210. else
  211. {}
  212. return isSuccess;
  213. }
  214. //==========================================
  215. // ISO14443A Request SN function
  216. //==========================================
  217. bool ISO14443A_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
  218. {
  219. bool isSuccess = false;
  220. int tx_len = 4;
  221. unsigned char txByte[tx_len];
  222. unsigned char rxByte[254];
  223. unsigned char tmp[254];
  224. unsigned char TX_MESSAGE[254];
  225. unsigned char RX_MESSAGE[254];
  226. unsigned char TMP_MESSAGE[254];
  227. unsigned char TX_LENGTH;
  228. unsigned char RX_LENGTH;
  229. switch(moduleType)
  230. {
  231. case MODULE_EWT:
  232. default:
  233. //===============================
  234. // Command
  235. //===============================
  236. txByte[0] = tx_len-1;
  237. txByte[1] = RFID_CMD_ISO1443A_REQUEST;
  238. txByte[2] = REQA;
  239. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  240. if(Fd > 0)
  241. {
  242. memset(rxByte, 0, sizeof (rxByte));
  243. if(system_command(Fd, txByte, tx_len, rxByte) > 0)
  244. {
  245. memset(tmp, 0, sizeof tmp);
  246. memcpy(tmp, rxByte, sizeof(rxByte));
  247. if(tmp[1] == RFID_CMD_ISO1443A_REQUEST)
  248. {
  249. if(tmp[0] == 0x09)
  250. {
  251. DEBUG_INFO_1("MIFARE CLASSIC.\n");
  252. cardLength = LENGTH_4;
  253. memcpy(data, rxByte+2, cardLength);
  254. isSuccess = true;
  255. }
  256. else if(tmp[0] == 0x0C)
  257. {
  258. DEBUG_INFO_1("MIFARE PLUS.\n");
  259. cardLength = LENGTH_7;
  260. memcpy(data, rxByte+2, cardLength);
  261. isSuccess = true;
  262. }
  263. else
  264. {}
  265. }
  266. else if (tmp[1] == 0xDF)
  267. {
  268. cardLength = LENGTH_0;
  269. isSuccess = false;
  270. }
  271. else
  272. {}
  273. }
  274. else
  275. {}
  276. }
  277. else
  278. {}
  279. break;
  280. case MODULE_REYAX:
  281. if(Fd > 0)
  282. {
  283. memset(TX_MESSAGE, 0, sizeof(TX_MESSAGE));
  284. memset(RX_MESSAGE, 0, sizeof(RX_MESSAGE));
  285. strcpy((char*)TX_MESSAGE, "AT+SCAN=1\r\n");
  286. TX_LENGTH = strlen((char*)TX_MESSAGE);
  287. //DEBUG_INFO_1("ISO14443A TX_LENGTH : %d.\n", TX_LENGTH);
  288. //DEBUG_INFO_1("ISO14443A TX_MESSAGE : %s.\n", TX_MESSAGE);
  289. if((RX_LENGTH = at_command(Fd, TX_MESSAGE, TX_LENGTH, RX_MESSAGE)) > 0)
  290. {
  291. //DEBUG_INFO_1("ISO14443A RX_LENGTH : %d.\n", RX_LENGTH);
  292. //DEBUG_INFO_1("ISO14443A RX_MESSAGE : %s.\n", RX_MESSAGE);
  293. memset(TMP_MESSAGE, 0, sizeof(TMP_MESSAGE));
  294. if(strstr((char*)RX_MESSAGE, "+SCAN=ISO14443A:"))
  295. {
  296. if(RX_LENGTH == 26)
  297. {
  298. cardLength = LENGTH_4;
  299. memcpy(TMP_MESSAGE, RX_MESSAGE+16, (LENGTH_4*2));
  300. DEBUG_INFO_1("Mifare Classic tmp message : %s.\n", TMP_MESSAGE);
  301. sscanf((char*)TMP_MESSAGE, "%2X%2X%2X%2X", (unsigned int *)&data[0],
  302. (unsigned int *)&data[1],
  303. (unsigned int *)&data[2],
  304. (unsigned int *)&data[3]);
  305. isSuccess = true;
  306. }
  307. else if(RX_LENGTH == 32)
  308. {
  309. cardLength = LENGTH_7;
  310. memcpy(TMP_MESSAGE, RX_MESSAGE+16, (RFID_SN_TYPE_7BYTE*2));
  311. DEBUG_INFO_1("Mifare Plus tmp message : %s.\n", TMP_MESSAGE);
  312. sscanf((char*)TMP_MESSAGE, "%2X%2X%2X%2X%2X%2X%2X", (unsigned int *)&data[0],
  313. (unsigned int *)&data[1],
  314. (unsigned int *)&data[2],
  315. (unsigned int *)&data[3],
  316. (unsigned int *)&data[4],
  317. (unsigned int *)&data[5],
  318. (unsigned int *)&data[6]);
  319. isSuccess = true;
  320. }
  321. else
  322. {
  323. cardLength = LENGTH_0;
  324. isSuccess = false;
  325. }
  326. }
  327. else
  328. {}
  329. }
  330. else
  331. {}
  332. }
  333. else
  334. {}
  335. break;
  336. }
  337. return isSuccess;
  338. }
  339. //==========================================
  340. // ISO14443B Request SN function
  341. //==========================================
  342. bool ISO14443B_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
  343. {
  344. bool isSuccess = false;
  345. int cardLength;
  346. int tx_len = 5;
  347. unsigned char txByte[tx_len];
  348. unsigned char rxByte[254];
  349. unsigned char tmp[254];
  350. /*
  351. unsigned char TX_MESSAGE[254];
  352. unsigned char RX_MESSAGE[254];
  353. unsigned char TMP_MESSAGE[254];
  354. unsigned char TX_LENGTH;
  355. unsigned char RX_LENGTH;
  356. */
  357. switch(moduleType)
  358. {
  359. case MODULE_EWT:
  360. default:
  361. //===============================
  362. // Command
  363. //===============================
  364. txByte[0] = tx_len-1;
  365. txByte[1] = RFID_CMD_ISO1443B_REQUEST;
  366. txByte[2] = WUPA;
  367. txByte[3] = AFI;
  368. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  369. if(Fd > 0)
  370. {
  371. memset(rxByte, 0, sizeof (rxByte));
  372. if(system_command(Fd, txByte, tx_len, rxByte) > 0)
  373. {
  374. memset(tmp, 0, sizeof tmp);
  375. memcpy(tmp, rxByte, sizeof(rxByte));
  376. if(tmp[1] == RFID_CMD_ISO1443B_REQUEST)
  377. {
  378. DEBUG_INFO_1("ISO14443 TYPE B.\n");
  379. cardLength = LENGTH_4;
  380. memcpy(data, rxByte+3, cardLength);
  381. isSuccess = true;
  382. }
  383. else if(tmp[1] == 0x9F)
  384. {
  385. cardLength = LENGTH_0;
  386. isSuccess = false;
  387. }
  388. else
  389. {}
  390. }
  391. else
  392. {}
  393. }
  394. else
  395. {}
  396. break;
  397. case MODULE_REYAX:
  398. /*
  399. if(Fd > 0)
  400. {
  401. memset(TX_MESSAGE, 0, sizeof(TX_MESSAGE));
  402. memset(RX_MESSAGE, 0, sizeof(RX_MESSAGE));
  403. strcpy((char*)TX_MESSAGE, "AT+SCAN=2\r\n");
  404. TX_LENGTH = strlen((char*)TX_MESSAGE);
  405. //DEBUG_INFO_1("IS014443B TX_LENGTH : %d.\n", TX_LENGTH);
  406. //DEBUG_INFO_1("IS014443B TX_MESSAGE : %s.\n", TX_MESSAGE);
  407. if((RX_LENGTH = at_command(Fd, TX_MESSAGE, TX_LENGTH, RX_MESSAGE);) > 0)
  408. {
  409. //DEBUG_INFO_1("IS014443B RX_LENGTH : %d.\n", RX_LENGTH);
  410. //DEBUG_INFO_1("IS014443B RX MESSAGE : %s.\n", RX_MESSAGE);
  411. memset(TMP_MESSAGE, 0, sizeof TMP_MESSAGE);
  412. if(strstr((char*)RX_MESSAGE,"+SCAN=Felica:"))
  413. {
  414. if(RX_MESSAGE_LENGTH == 31)
  415. {
  416. cardLength = LENGTH_6;
  417. memcpy(TMP_MESSAGE, RX_MESSAGE+17, (LENGTH_6*2));
  418. DEBUG_INFO_1("IS014443B tmp message : %s...\n", TMP_MESSAGE);
  419. sscanf((char*)TMP_MESSAGE, "%2X%2X%2X%2X%2X%2X", (unsigned int *)&data[0],
  420. (unsigned int *)&data[1],
  421. (unsigned int *)&data[2],
  422. (unsigned int *)&data[3],
  423. (unsigned int *)&data[4],
  424. (unsigned int *)&data[5]);
  425. isSuccess = true;
  426. }
  427. else
  428. {
  429. cardLength = LENGTH_0;
  430. isSuccess = false;
  431. }
  432. }
  433. else
  434. {}
  435. }
  436. else
  437. {}
  438. }
  439. else
  440. {}
  441. */
  442. break;
  443. }
  444. return isSuccess;
  445. }
  446. //==========================================
  447. // FELICA Request SN function
  448. //==========================================
  449. bool FELICA_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
  450. {
  451. bool isSuccess = false;
  452. int cardLength;
  453. int tx_len = 9;
  454. unsigned char txByte[tx_len];
  455. unsigned char rxByte[254];
  456. unsigned char tmp[254];
  457. unsigned char TX_MESSAGE[254];
  458. unsigned char RX_MESSAGE[254];
  459. unsigned char TMP_MESSAGE[254];
  460. unsigned char TX_LENGTH;
  461. unsigned char RX_LENGTH;
  462. switch(moduleType)
  463. {
  464. case MODULE_EWT:
  465. default:
  466. //===============================
  467. // Command
  468. //===============================
  469. txByte[0] = tx_len-1;
  470. txByte[1] = RFID_CMD_FELICA_POLLING_REQUEST;
  471. txByte[2] = 0x06;
  472. txByte[3] = 0x00;
  473. txByte[4] = 0xFF;
  474. txByte[5] = 0xFF;
  475. txByte[6] = 0x01;
  476. txByte[7] = 0x00;
  477. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  478. if(Fd > 0)
  479. {
  480. memset(rxByte, 0, sizeof (rxByte));
  481. if(system_command(Fd, txByte, tx_len, rxByte) > 0)
  482. {
  483. memset(tmp, 0, sizeof tmp);
  484. memcpy(tmp, rxByte, sizeof(rxByte));
  485. if(tmp[1] == RFID_CMD_FELICA_POLLING_REQUEST)
  486. {
  487. DEBUG_INFO_1("FELICA.\n");
  488. cardLength = LENGTH_6;
  489. memcpy(data, rxByte+6, cardLength);
  490. isSuccess = true;
  491. }
  492. else if(tmp[1] == 0xD0)
  493. {
  494. cardLength = LENGTH_0;
  495. isSuccess = false;
  496. }
  497. else
  498. {}
  499. }
  500. else
  501. {}
  502. }
  503. else
  504. {}
  505. break;
  506. case MODULE_REYAX:
  507. if(Fd > 0)
  508. {
  509. memset(TX_MESSAGE, 0, sizeof(TX_MESSAGE));
  510. memset(RX_MESSAGE, 0, sizeof(RX_MESSAGE));
  511. strcpy((char*)TX_MESSAGE, "AT+SCAN=4\r\n");
  512. TX_LENGTH = strlen((char*)TX_MESSAGE);
  513. //DEBUG_INFO_1("FELICA TX_LENGTH : %d.\n", TX_LENGTH);
  514. //DEBUG_INFO_1("FELICA TX_MESSAGE : %s.\n", TX_MESSAGE);
  515. if((RX_LENGTH = at_command(Fd, TX_MESSAGE, TX_LENGTH, RX_MESSAGE)) > 0)
  516. {
  517. //DEBUG_INFO_1("FELICA RX_LENGTH : %d.\n", RX_LENGTH);
  518. //DEBUG_INFO_1("FELICA RX_MESSAGE : %s.\n", RX_MESSAGE);
  519. memset(TMP_MESSAGE, 0, sizeof(TMP_MESSAGE));
  520. if(strstr((char*)RX_MESSAGE,"+SCAN=Felica:"))
  521. {
  522. if(RX_LENGTH == 31)
  523. {
  524. cardLength = LENGTH_6;
  525. memcpy(TMP_MESSAGE, RX_MESSAGE+17, (LENGTH_6*2));
  526. DEBUG_INFO_1("Felica tmp message : %s.\n", TMP_MESSAGE);
  527. sscanf((char*)TMP_MESSAGE, "%2X%2X%2X%2X%2X%2X", (unsigned int *)&data[0],
  528. (unsigned int *)&data[1],
  529. (unsigned int *)&data[2],
  530. (unsigned int *)&data[3],
  531. (unsigned int *)&data[4],
  532. (unsigned int *)&data[5]);
  533. isSuccess = true;
  534. }
  535. else
  536. {
  537. cardLength = LENGTH_0;
  538. isSuccess = false;
  539. }
  540. }
  541. else
  542. {}
  543. }
  544. else
  545. {}
  546. }
  547. else
  548. {}
  549. break;
  550. }
  551. return isSuccess;
  552. }
  553. //==========================================
  554. // Read block data from RFID card
  555. //==========================================
  556. bool getBlockRead(int Fd, int moduleType, int block, unsigned char keyId, unsigned char *data)
  557. {
  558. bool isSuccess = false;
  559. int i;
  560. int j = 0;
  561. int len = 11;
  562. unsigned char txByte[len];
  563. unsigned char rxByte[254];
  564. unsigned char tmp[254];
  565. switch(moduleType)
  566. {
  567. case MODULE_EWT:
  568. default:
  569. //===============================
  570. // Command
  571. //===============================
  572. txByte[0] = 0x0A;
  573. txByte[1] = RFID_CMD_BLOCK_READ;
  574. txByte[2] = keyId;
  575. txByte[3] = block;
  576. for(i = 4; i < 10; i++)
  577. {
  578. if( j < sizeof (sectorKeyA[0]))
  579. {
  580. txByte[i] = sectorKeyA[(int)(block/4)][j];
  581. j++;
  582. }
  583. }
  584. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  585. if(Fd > 0)
  586. {
  587. memset(rxByte, 0, sizeof(rxByte));
  588. if(system_command(Fd, txByte, len, rxByte) > 0)
  589. {
  590. memset(tmp, 0, sizeof tmp);
  591. memcpy(tmp, rxByte, sizeof (rxByte));
  592. if((tmp[1] == RFID_CMD_BLOCK_READ))
  593. {
  594. DEBUG_INFO_1("Read block successfully.\n");
  595. memcpy(data, rxByte+2, 16);
  596. isSuccess = true;
  597. }
  598. else if (tmp[1] == 0xDE)
  599. {
  600. DEBUG_INFO_1("Read block unsuccessfully.\n");
  601. }
  602. else
  603. {}
  604. }
  605. else
  606. {}
  607. }
  608. else
  609. {}
  610. break;
  611. }
  612. return isSuccess;
  613. }
  614. //==========================================
  615. // Write data into RFID card block
  616. //==========================================
  617. bool setBlockWrite(int Fd, int moduleType, int block, unsigned char keyid, unsigned char *data)
  618. {
  619. bool isSuccess = false;
  620. int i;
  621. int j = 0;
  622. int len = 27;
  623. unsigned char txByte[len];
  624. unsigned char rxByte[254];
  625. unsigned char tmp[254];
  626. switch(moduleType)
  627. {
  628. case MODULE_EWT:
  629. default:
  630. //===============================
  631. // Command
  632. //===============================
  633. txByte[0] = 0x1A;
  634. txByte[1] = RFID_CMD_BLOCK_WRITE;
  635. txByte[2] = keyid;
  636. txByte[3] = block;
  637. for(i = 4; i < 10; i++)
  638. {
  639. if( j < sizeof (sectorKeyA[0]))
  640. {
  641. txByte[i] = sectorKeyA[(int)(block/4)][j];
  642. j++;
  643. }
  644. }
  645. memcpy(txByte+10, data, 16);
  646. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,(ARRAY_SIZE(txByte)));
  647. if(Fd > 0)
  648. {
  649. memset(rxByte, 0, sizeof(rxByte));
  650. if(system_command(Fd, txByte, len, rxByte) > 0)
  651. {
  652. memset(tmp, 0, sizeof tmp);
  653. memcpy(tmp, rxByte, sizeof (rxByte));
  654. if(tmp[1] == RFID_CMD_BLOCK_WRITE)
  655. {
  656. DEBUG_INFO_1("Write block successfully.\n");
  657. isSuccess = true;
  658. }
  659. else if(tmp[1] == 0xDD)
  660. {
  661. DEBUG_INFO_1("Write block unsuccessfully.\n");
  662. isSuccess = false;
  663. }
  664. else
  665. {}
  666. }
  667. else
  668. {}
  669. }
  670. else
  671. {}
  672. break;
  673. }
  674. return isSuccess;
  675. }
  676. //==========================================
  677. // Buzzer set (EWT Module)
  678. //==========================================
  679. void setBuzzer(int Fd, int moduleType, unsigned char time)
  680. {
  681. int len = 4;
  682. unsigned char txByte[len];
  683. unsigned char rxByte[254];
  684. unsigned char tmp[254];
  685. switch(moduleType)
  686. {
  687. case MODULE_EWT:
  688. default:
  689. //===============================
  690. // Command
  691. //===============================
  692. txByte[0] = 0x03;
  693. txByte[1] = RFID_CMD_BUZZER_SET;
  694. if(time > 0x0A)
  695. {
  696. time = 0x05;
  697. txByte[2] = time;
  698. DEBUG_WARN_1("Value is out of range.\n");
  699. }
  700. else
  701. {
  702. txByte[2] = time;
  703. }
  704. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  705. if(Fd > 0)
  706. {
  707. memset(rxByte, 0, sizeof(rxByte));
  708. if(system_command(Fd, txByte, len, rxByte) > 0)
  709. {
  710. memset(tmp, 0, sizeof tmp);
  711. memcpy(tmp, rxByte, sizeof (rxByte));
  712. if(tmp[1] == 0x14)
  713. {
  714. DEBUG_INFO_1("Set Buzzer ok.\n");
  715. DEBUG_INFO_1("Set Buzzer %d ms.\n",time);
  716. }
  717. else if(tmp[1] == 0xEC)
  718. {
  719. DEBUG_INFO_1("Set Buzzer fail.\n");
  720. }
  721. else
  722. {}
  723. }
  724. else
  725. {}
  726. }
  727. else
  728. {}
  729. break;
  730. }
  731. }
  732. //==========================================
  733. // Halt RFID card (EWT)
  734. //==========================================
  735. void sethaltCard(int Fd, int moduleType)
  736. {
  737. int len = 3;
  738. unsigned char txByte[len];
  739. unsigned char rxByte[254];
  740. unsigned char tmp[254];
  741. switch(moduleType)
  742. {
  743. case MODULE_EWT:
  744. default:
  745. //===============================
  746. // Command
  747. //===============================
  748. txByte[0] = 0x02;
  749. txByte[1] = RFID_CMD_HALT_14443A;
  750. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  751. if(Fd > 0)
  752. {
  753. memset(rxByte, 0, sizeof(rxByte));
  754. if(system_command(Fd, txByte, len, rxByte) > 0)
  755. {
  756. memset(tmp, 0, sizeof tmp);
  757. memcpy(tmp, rxByte, sizeof (rxByte));
  758. if(tmp[1] == 0x28)
  759. {
  760. DEBUG_INFO_1("Halt card pass.\n");
  761. }
  762. else if(tmp[1] == 0xD7)
  763. {
  764. DEBUG_INFO_1("Halt card fail.\n");
  765. }
  766. else
  767. {}
  768. }
  769. else
  770. {}
  771. }
  772. else
  773. {}
  774. break;
  775. }
  776. }
  777. //==========================================
  778. // Set the RF Output Level
  779. //==========================================
  780. bool setRfOutputLevel(int Fd, int moduleType, int Value)
  781. {
  782. bool isSuccess = false;
  783. int len = 4;
  784. unsigned char txByte[len];
  785. unsigned char rxByte[254];
  786. unsigned char tmp[254];
  787. switch(moduleType)
  788. {
  789. case MODULE_EWT:
  790. default:
  791. //===============================
  792. // Command
  793. //===============================
  794. txByte[0] = 0x03;
  795. txByte[1] = RFID_CMD_RF_OUTPUT_LEVEL_SET;
  796. txByte[2] = Value;
  797. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  798. if(Fd > 0)
  799. {
  800. memset(rxByte, 0, sizeof(rxByte));
  801. if(system_command(Fd, txByte, len, rxByte) > 0)
  802. {
  803. memset(tmp, 0, sizeof tmp);
  804. memcpy(tmp, rxByte, sizeof (rxByte));
  805. if(tmp[1] == RFID_CMD_RF_OUTPUT_LEVEL_SET)
  806. {
  807. DEBUG_INFO_1("Set the RF Output Level : Pass...\n");
  808. if(Value == RF_STRONGEST)
  809. {
  810. DEBUG_INFO_1("Strongest...\n");
  811. }
  812. else if(Value == RF_STRONGER)
  813. {
  814. DEBUG_INFO_1("Strong...\n");
  815. }
  816. else if(Value == RF_WEAK)
  817. {
  818. DEBUG_INFO_1("Weak...\n");
  819. }
  820. else if(Value == RF_WEAKEST)
  821. {
  822. DEBUG_INFO_1("Weakest...\n");
  823. }
  824. isSuccess = true;
  825. }
  826. else if(tmp[1] == 0xFD)
  827. {
  828. DEBUG_INFO_1("Set the RF Output Level : Fail...\n");
  829. DEBUG_INFO_1("Unknow value !!! \n");
  830. DEBUG_INFO_1("Strongest : SET_RF_STRONGEST...\n");
  831. DEBUG_INFO_1("Strong : SET_RF_STRONGER...\n");
  832. DEBUG_INFO_1("Weak : SET_RF_WEAK...\n");
  833. DEBUG_INFO_1("Weakest : SET_RF_WEAKEST...\n");
  834. isSuccess = false;
  835. }
  836. else
  837. {}
  838. }
  839. else
  840. {}
  841. }
  842. else
  843. {}
  844. break;
  845. }
  846. return isSuccess;
  847. }
  848. //==========================================
  849. // Set the Default of Automatic Detecting Card
  850. //==========================================
  851. bool setDefaultOfAutomaticDetectingCard(int Fd, int moduleType, int Value)
  852. {
  853. bool isSuccess = false;
  854. int len = 4;
  855. unsigned char txByte[len];
  856. unsigned char rxByte[254];
  857. unsigned char tmp[254];
  858. switch(moduleType)
  859. {
  860. case MODULE_EWT:
  861. default:
  862. //===============================
  863. // Command
  864. //===============================
  865. txByte[0] = 0x03;
  866. txByte[1] = RFID_CMD_DEFAULT_AUTO_DETECTING_CARD;
  867. txByte[2] = Value;
  868. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  869. if(Fd > 0)
  870. {
  871. memset(rxByte, 0, sizeof(rxByte));
  872. if(system_command(Fd, txByte, len, rxByte) > 0)
  873. {
  874. memset(tmp, 0, sizeof tmp);
  875. memcpy(tmp, rxByte, sizeof (rxByte));
  876. if(tmp[1] == RFID_CMD_DEFAULT_AUTO_DETECTING_CARD)
  877. {
  878. if(Value == TURN_OFF)
  879. {
  880. DEBUG_INFO_1("Default of Automatic Detecting Card : OFF...\n");
  881. }
  882. else if (Value == TURN_ON)
  883. {
  884. DEBUG_INFO_1("Default of Automatic Detecting Card : ON...\n");
  885. }
  886. else if (Value == TURN_TEMPORARILY)
  887. {
  888. DEBUG_INFO_1("Default of Automatic Detecting Card : Temporarily open and close automatically detect card...\n");
  889. }
  890. isSuccess = true;
  891. }
  892. else if(tmp[1] == 0xE2)
  893. {
  894. DEBUG_INFO_1("Value : SET_DETECTING_OFF = OFF...\n");
  895. DEBUG_INFO_1("Value : SET_DETECTING_ON = ON...\n");
  896. DEBUG_INFO_1("Value : SET_DETECTING_TEMPORARILY = Temporarily open and close...\n");
  897. isSuccess = false;
  898. }
  899. else
  900. {}
  901. }
  902. else
  903. {}
  904. }
  905. else
  906. {}
  907. break;
  908. }
  909. return isSuccess;
  910. }