picopass_poller_i.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "picopass_poller_i.h"
  2. #include <nfc/helpers/iso14443_crc.h>
  3. #define PICOPASS_POLLER_FWT_FC (100000)
  4. #define TAG "Picopass"
  5. static PicopassError picopass_poller_process_error(NfcError error) {
  6. PicopassError ret = PicopassErrorNone;
  7. switch(error) {
  8. case NfcErrorNone:
  9. ret = PicopassErrorNone;
  10. break;
  11. default:
  12. ret = PicopassErrorTimeout;
  13. break;
  14. }
  15. return ret;
  16. }
  17. PicopassError picopass_poller_send_frame(
  18. PicopassPoller* instance,
  19. BitBuffer* tx_buffer,
  20. BitBuffer* rx_buffer,
  21. uint32_t fwt_fc) {
  22. PicopassError ret = PicopassErrorNone;
  23. do {
  24. NfcError error = nfc_poller_trx(instance->nfc, tx_buffer, rx_buffer, fwt_fc);
  25. if(error != NfcErrorNone) {
  26. ret = picopass_poller_process_error(error);
  27. break;
  28. }
  29. if(!iso13239_crc_check(Iso13239CrcTypePicopass, rx_buffer)) {
  30. ret = PicopassErrorIncorrectCrc;
  31. break;
  32. }
  33. iso13239_crc_trim(instance->rx_buffer);
  34. } while(false);
  35. return ret;
  36. }
  37. PicopassError picopass_poller_actall(PicopassPoller* instance) {
  38. PicopassError ret = PicopassErrorNone;
  39. bit_buffer_reset(instance->tx_buffer);
  40. bit_buffer_append_byte(instance->tx_buffer, RFAL_PICOPASS_CMD_ACTALL);
  41. NfcError error = nfc_poller_trx(
  42. instance->nfc, instance->tx_buffer, instance->rx_buffer, PICOPASS_POLLER_FWT_FC);
  43. if(error != NfcErrorIncompleteFrame) {
  44. ret = picopass_poller_process_error(error);
  45. }
  46. return ret;
  47. }
  48. PicopassError picopass_poller_identify(
  49. PicopassPoller* instance,
  50. PicopassColResSerialNum* col_res_serial_num) {
  51. PicopassError ret = PicopassErrorNone;
  52. do {
  53. bit_buffer_reset(instance->tx_buffer);
  54. bit_buffer_append_byte(instance->tx_buffer, RFAL_PICOPASS_CMD_READ_OR_IDENTIFY);
  55. ret = picopass_poller_send_frame(
  56. instance, instance->tx_buffer, instance->rx_buffer, PICOPASS_POLLER_FWT_FC);
  57. if(ret != PicopassErrorNone) break;
  58. if(bit_buffer_get_size_bytes(instance->rx_buffer) != sizeof(PicopassColResSerialNum)) {
  59. ret = PicopassErrorProtocol;
  60. break;
  61. }
  62. bit_buffer_write_bytes(
  63. instance->rx_buffer, col_res_serial_num->data, sizeof(PicopassColResSerialNum));
  64. } while(false);
  65. return ret;
  66. }
  67. PicopassError picopass_poller_select(
  68. PicopassPoller* instance,
  69. PicopassColResSerialNum* col_res_serial_num,
  70. PicopassSerialNum* serial_num) {
  71. PicopassError ret = PicopassErrorNone;
  72. do {
  73. bit_buffer_reset(instance->tx_buffer);
  74. bit_buffer_append_byte(instance->tx_buffer, RFAL_PICOPASS_CMD_SELECT);
  75. bit_buffer_append_bytes(
  76. instance->tx_buffer, col_res_serial_num->data, sizeof(PicopassColResSerialNum));
  77. ret = picopass_poller_send_frame(
  78. instance, instance->tx_buffer, instance->rx_buffer, PICOPASS_POLLER_FWT_FC);
  79. if(ret != PicopassErrorNone) break;
  80. if(bit_buffer_get_size_bytes(instance->rx_buffer) != sizeof(PicopassSerialNum)) {
  81. ret = PicopassErrorProtocol;
  82. break;
  83. }
  84. bit_buffer_write_bytes(instance->rx_buffer, serial_num->data, sizeof(PicopassSerialNum));
  85. } while(false);
  86. return ret;
  87. }