t5577.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "t5577.h"
  2. #include <furi.h>
  3. #include <furi_hal_rfid.h>
  4. #define T5577_TIMING_WAIT_TIME 400
  5. #define T5577_TIMING_START_GAP 30
  6. #define T5577_TIMING_WRITE_GAP 18
  7. #define T5577_TIMING_DATA_0 24
  8. #define T5577_TIMING_DATA_1 56
  9. #define T5577_TIMING_PROGRAM 700
  10. #define T5577_OPCODE_PAGE_0 0b10
  11. #define T5577_OPCODE_PAGE_1 0b11
  12. #define T5577_OPCODE_RESET 0b00
  13. static void t5577_start() {
  14. furi_hal_rfid_tim_read(125000, 0.5);
  15. furi_hal_rfid_pins_read();
  16. furi_hal_rfid_tim_read_start();
  17. // do not ground the antenna
  18. furi_hal_rfid_pin_pull_release();
  19. }
  20. static void t5577_stop() {
  21. furi_hal_rfid_tim_read_stop();
  22. furi_hal_rfid_tim_reset();
  23. furi_hal_rfid_pins_reset();
  24. }
  25. static void t5577_write_gap(uint32_t gap_time) {
  26. furi_hal_rfid_tim_read_stop();
  27. furi_delay_us(gap_time * 8);
  28. furi_hal_rfid_tim_read_start();
  29. }
  30. static void t5577_write_bit(bool value) {
  31. if(value) {
  32. furi_delay_us(T5577_TIMING_DATA_1 * 8);
  33. } else {
  34. furi_delay_us(T5577_TIMING_DATA_0 * 8);
  35. }
  36. t5577_write_gap(T5577_TIMING_WRITE_GAP);
  37. }
  38. static void t5577_write_opcode(uint8_t value) {
  39. t5577_write_bit((value >> 1) & 1);
  40. t5577_write_bit((value >> 0) & 1);
  41. }
  42. static void t5577_write_reset() {
  43. t5577_write_gap(T5577_TIMING_START_GAP);
  44. t5577_write_bit(1);
  45. t5577_write_bit(0);
  46. }
  47. static void t5577_write_block(uint8_t block, bool lock_bit, uint32_t data) {
  48. furi_delay_us(T5577_TIMING_WAIT_TIME * 8);
  49. // start gap
  50. t5577_write_gap(T5577_TIMING_START_GAP);
  51. // opcode for page 0
  52. t5577_write_opcode(T5577_OPCODE_PAGE_0);
  53. // lock bit
  54. t5577_write_bit(lock_bit);
  55. // data
  56. for(uint8_t i = 0; i < 32; i++) {
  57. t5577_write_bit((data >> (31 - i)) & 1);
  58. }
  59. // block address
  60. t5577_write_bit((block >> 2) & 1);
  61. t5577_write_bit((block >> 1) & 1);
  62. t5577_write_bit((block >> 0) & 1);
  63. furi_delay_us(T5577_TIMING_PROGRAM * 8);
  64. furi_delay_us(T5577_TIMING_WAIT_TIME * 8);
  65. t5577_write_reset();
  66. }
  67. void t5577_write(LFRFIDT5577* data) {
  68. t5577_start();
  69. FURI_CRITICAL_ENTER();
  70. for(size_t i = 0; i < data->blocks_to_write; i++) {
  71. t5577_write_block(i, false, data->block[i]);
  72. }
  73. t5577_write_reset();
  74. FURI_CRITICAL_EXIT();
  75. t5577_stop();
  76. }