dallas_common.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #pragma once
  2. #include <one_wire/one_wire_host.h>
  3. #include <one_wire/one_wire_slave.h>
  4. #include <flipper_format/flipper_format.h>
  5. #define DALLAS_COMMON_MANUFACTURER_NAME "Dallas"
  6. #define DALLAS_COMMON_CMD_READ_ROM 0x33U
  7. #define DALLAS_COMMON_CMD_MATCH_ROM 0x55U
  8. #define DALLAS_COMMON_CMD_SKIP_ROM 0xCCU
  9. #define DALLAS_COMMON_CMD_COND_SEARCH 0xECU
  10. #define DALLAS_COMMON_CMD_SEARCH_ROM 0xF0U
  11. #define DALLAS_COMMON_CMD_READ_SCRATCH 0xAAU
  12. #define DALLAS_COMMON_CMD_WRITE_SCRATCH 0x0FU
  13. #define DALLAS_COMMON_CMD_COPY_SCRATCH 0x55U
  14. #define DALLAS_COMMON_CMD_READ_MEM 0xF0U
  15. #define DALLAS_COMMON_CMD_OVERDRIVE_SKIP_ROM 0x3CU
  16. #define DALLAS_COMMON_CMD_OVERDRIVE_MATCH_ROM 0x69U
  17. typedef enum {
  18. DallasCommonCommandStateIdle,
  19. DallasCommonCommandStateRomCmd,
  20. DallasCommonCommandStateMemCmd,
  21. } DallasCommonCommandState;
  22. typedef union {
  23. struct {
  24. uint8_t family_code;
  25. uint8_t serial_number[6];
  26. uint8_t checksum;
  27. } fields;
  28. uint8_t bytes[8];
  29. } DallasCommonRomData;
  30. typedef union {
  31. struct {
  32. uint8_t address_lo;
  33. uint8_t address_hi;
  34. uint8_t status;
  35. } fields;
  36. uint8_t bytes[3];
  37. } DallasCommonAddressRegs;
  38. /* Standard(ish) iButton commands */
  39. bool dallas_common_skip_rom(OneWireHost* host);
  40. bool dallas_common_read_rom(OneWireHost* host, DallasCommonRomData* rom_data);
  41. bool dallas_common_write_scratchpad(
  42. OneWireHost* host,
  43. uint16_t address,
  44. const uint8_t* data,
  45. size_t data_size);
  46. bool dallas_common_read_scratchpad(
  47. OneWireHost* host,
  48. DallasCommonAddressRegs* regs,
  49. uint8_t* data,
  50. size_t data_size);
  51. bool dallas_common_copy_scratchpad(
  52. OneWireHost* host,
  53. const DallasCommonAddressRegs* regs,
  54. uint32_t timeout_us);
  55. bool dallas_common_read_mem(OneWireHost* host, uint16_t address, uint8_t* data, size_t data_size);
  56. /* Combined operations */
  57. bool dallas_common_write_mem(
  58. OneWireHost* host,
  59. uint32_t timeout_us,
  60. size_t page_size,
  61. const uint8_t* data,
  62. size_t data_size);
  63. /* Emulation */
  64. bool dallas_common_emulate_search_rom(OneWireSlave* bus, const DallasCommonRomData* rom_data);
  65. bool dallas_common_emulate_read_rom(OneWireSlave* bus, const DallasCommonRomData* rom_data);
  66. bool dallas_common_emulate_read_mem(OneWireSlave* bus, const uint8_t* data, size_t data_size);
  67. /* Save & Load */
  68. bool dallas_common_save_rom_data(FlipperFormat* ff, const DallasCommonRomData* rom_data);
  69. bool dallas_common_load_rom_data(
  70. FlipperFormat* ff,
  71. uint32_t format_version,
  72. DallasCommonRomData* rom_data);
  73. /* Miscellaneous */
  74. bool dallas_common_is_valid_crc(const DallasCommonRomData* rom_data);
  75. void dallas_common_render_brief_data(
  76. FuriString* result,
  77. const DallasCommonRomData* rom_data,
  78. const uint8_t* mem_data,
  79. size_t mem_size,
  80. const char* mem_name);
  81. void dallas_common_render_crc_error(FuriString* result, const DallasCommonRomData* rom_data);
  82. void dallas_common_apply_edits(DallasCommonRomData* rom_data, uint8_t family_code);