rfid-writer.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "rfid-writer.h"
  2. #include <api-hal.h>
  3. #include "protocols/protocol-emmarin.h"
  4. extern COMP_HandleTypeDef hcomp1;
  5. /**
  6. * @brief all timings are specified in field clocks (field clock = 125 kHz, 8 us)
  7. *
  8. */
  9. class T55xxTiming {
  10. public:
  11. constexpr static const uint16_t wait_time = 400;
  12. constexpr static const uint8_t start_gap = 15;
  13. constexpr static const uint8_t write_gap = 10;
  14. constexpr static const uint8_t data_0 = 24;
  15. constexpr static const uint8_t data_1 = 56;
  16. constexpr static const uint16_t program = 700;
  17. };
  18. class T55xxCmd {
  19. public:
  20. constexpr static const uint8_t opcode_page_0 = 0b10;
  21. constexpr static const uint8_t opcode_page_1 = 0b11;
  22. constexpr static const uint8_t opcode_reset = 0b00;
  23. };
  24. RfidWriter::RfidWriter() {
  25. }
  26. RfidWriter::~RfidWriter() {
  27. }
  28. void RfidWriter::start() {
  29. api_hal_rfid_tim_read(125000, 0.5);
  30. api_hal_rfid_pins_read();
  31. }
  32. void RfidWriter::stop() {
  33. api_hal_rfid_tim_read_stop();
  34. api_hal_rfid_tim_reset();
  35. api_hal_rfid_pins_reset();
  36. }
  37. void RfidWriter::write_gap(uint32_t gap_time) {
  38. api_hal_rfid_tim_read_stop();
  39. delay_us(gap_time * 8);
  40. api_hal_rfid_tim_read_start();
  41. }
  42. void RfidWriter::write_bit(bool value) {
  43. if(value) {
  44. delay_us(T55xxTiming::data_1 * 8);
  45. } else {
  46. delay_us(T55xxTiming::data_0 * 8);
  47. }
  48. write_gap(T55xxTiming::write_gap);
  49. }
  50. void RfidWriter::write_byte(uint8_t value) {
  51. for(uint8_t i = 0; i < 8; i++) {
  52. write_bit((value >> i) & 1);
  53. }
  54. }
  55. void RfidWriter::write_block(uint8_t page, uint8_t block, bool lock_bit, uint32_t data) {
  56. // wait to power card
  57. api_hal_rfid_tim_read_start();
  58. delay_us(T55xxTiming::wait_time * 8);
  59. // start gap
  60. write_gap(T55xxTiming::start_gap);
  61. // opcode
  62. switch(page) {
  63. case 0:
  64. write_bit(1);
  65. write_bit(0);
  66. break;
  67. case 1:
  68. write_bit(1);
  69. write_bit(1);
  70. break;
  71. default:
  72. furi_check(false);
  73. break;
  74. }
  75. // lock bit
  76. write_bit(lock_bit);
  77. // data
  78. for(uint8_t i = 0; i < 32; i++) {
  79. write_bit((data >> (31 - i)) & 1);
  80. }
  81. // block address
  82. write_bit((block >> 2) & 1);
  83. write_bit((block >> 1) & 1);
  84. write_bit((block >> 0) & 1);
  85. delay_us(T55xxTiming::program * 8);
  86. api_hal_rfid_tim_read_stop();
  87. }
  88. void RfidWriter::write_em(uint8_t em_data[5]) {
  89. ProtocolEMMarin em_card;
  90. uint64_t em_encoded_data;
  91. em_card.encode(em_data, 5, reinterpret_cast<uint8_t*>(&em_encoded_data), sizeof(uint64_t));
  92. uint32_t em_config_block_data = 0b01100000000101001000000001000000;
  93. __disable_irq();
  94. write_block(0, 0, false, em_config_block_data);
  95. write_block(0, 1, false, em_encoded_data);
  96. write_block(0, 2, false, em_encoded_data >> 32);
  97. __enable_irq();
  98. }