Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/ibutton/protocols/blanks/rw1990.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ static bool rw1990_read_and_compare(OneWireHost* host, const uint8_t* data, size
}

bool rw1990_write_v1(OneWireHost* host, const uint8_t* data, size_t data_size) {
onewire_host_set_timings_default(host);

// Unlock sequence
onewire_host_reset(host);
onewire_host_write(host, RW1990_1_CMD_WRITE_RECORD_FLAG);
Expand Down Expand Up @@ -67,6 +69,8 @@ bool rw1990_write_v1(OneWireHost* host, const uint8_t* data, size_t data_size) {
}

bool rw1990_write_v2(OneWireHost* host, const uint8_t* data, size_t data_size) {
onewire_host_set_timings_default(host);

// Unlock sequence
onewire_host_reset(host);
onewire_host_write(host, RW1990_2_CMD_WRITE_RECORD_FLAG);
Expand Down
58 changes: 58 additions & 0 deletions lib/ibutton/protocols/blanks/tm01x.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#include <core/kernel.h>
#include <one_wire/one_wire_host.h>
#include <one_wire/maxim_crc.h>
#include "tm01x.h"

// Commands for TM01x
#define TM01X_CMD_WRITE_FLAG 0xC1
#define TM01X_CMD_WRITE_ROM 0xC5
#define TM01X_CMD_READ_ROM 0x33

#define TM01X_CMD_FINALIZE_CYFRAL 0xCA
#define TM01X_CMD_FINALIZE_METAKOM 0xCB

static void tm01x_write_byte(OneWireHost* host, uint8_t value) {
for(uint8_t bitMask = 0x01; bitMask; bitMask <<= 1) {
onewire_host_write_bit(host, (bool)(bitMask & value));
furi_delay_us(5000); // 5ms pause after each bit
}
}

// Helper function to read and verify written data
static bool tm01x_read_and_verify(OneWireHost* host, const uint8_t* data, size_t data_size) {
bool success = false;

if(onewire_host_reset(host)) {
success = true;
onewire_host_write(host, TM01X_CMD_READ_ROM);

for(size_t i = 0; i < data_size; ++i) {
if(data[i] != onewire_host_read(host)) {
success = false;
break;
}
}
}

return success;
}

bool tm01x_write_dallas(OneWireHost* host, const uint8_t* data, size_t data_size) {
// Set TM01x specific timings
onewire_host_set_timings_tm01x(host);

// Write sequence
onewire_host_reset(host);
onewire_host_write(host, TM01X_CMD_WRITE_FLAG);
onewire_host_write_bit(host, true);
furi_delay_us(5000);

onewire_host_reset(host);
onewire_host_write(host, TM01X_CMD_WRITE_ROM);

for(size_t i = 0; i < data_size; ++i) {
tm01x_write_byte(host, data[i]);
}

return tm01x_read_and_verify(host, data, data_size);
}
6 changes: 6 additions & 0 deletions lib/ibutton/protocols/blanks/tm01x.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#pragma once

#include <core/kernel.h>
#include <one_wire/one_wire_host.h>

bool tm01x_write_dallas(OneWireHost* host, const uint8_t* data, size_t data_size);
2 changes: 2 additions & 0 deletions lib/ibutton/protocols/blanks/tm2004.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
#define TM2004_ANSWER_READ_MEMORY 0xF5

bool tm2004_write(OneWireHost* host, const uint8_t* data, size_t data_size) {
onewire_host_set_timings_default(host);

onewire_host_reset(host);
onewire_host_write(host, TM2004_CMD_WRITE_ROM);
// Starting writing from address 0x0000
Expand Down
5 changes: 3 additions & 2 deletions lib/ibutton/protocols/dallas/protocol_ds1990.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

#include "../blanks/rw1990.h"
#include "../blanks/tm2004.h"

#include "../blanks/tm01x.h"
#define DS1990_FAMILY_CODE 0x01U
#define DS1990_FAMILY_NAME "DS1990"

Expand Down Expand Up @@ -66,7 +66,8 @@ bool dallas_ds1990_write_id(OneWireHost* host, iButtonProtocolData* protocol_dat

return rw1990_write_v1(host, data->rom_data.bytes, sizeof(DallasCommonRomData)) ||
rw1990_write_v2(host, data->rom_data.bytes, sizeof(DallasCommonRomData)) ||
tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData));
tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData)) ||
tm01x_write_dallas(host, data->rom_data.bytes, sizeof(DallasCommonRomData));
}

static bool dallas_ds1990_reset_callback(bool is_short, void* context) {
Expand Down
46 changes: 36 additions & 10 deletions lib/one_wire/one_wire_host.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@
#include "one_wire_host.h"

typedef struct {
uint16_t a;
uint16_t b;
uint16_t c;
uint16_t d;
uint16_t e;
uint16_t f;
uint16_t g;
uint16_t h;
uint16_t i;
uint16_t j;
uint16_t a; // Write 1 low time
uint16_t b; // Write 1 high time
uint16_t c; // Write 0 low time
uint16_t d; // Write 0 high time
uint16_t e; // Read low time
uint16_t f; // Read high time
uint16_t g; // Reset pre-delay
uint16_t h; // Reset pulse
uint16_t i; // Presence detect
uint16_t j; // Reset post-delay
} OneWireHostTimings;

static const OneWireHostTimings onewire_host_timings_normal = {
Expand Down Expand Up @@ -46,6 +46,20 @@ static const OneWireHostTimings onewire_host_timings_overdrive = {
.j = 40,
};

// TM01x specific timings
static const OneWireHostTimings onewire_host_timings_tm01x = {
.a = 5,
.b = 80,
.c = 70,
.d = 10,
.e = 5,
.f = 70,
.g = 0,
.h = 740,
.i = 140,
.j = 410,
};

struct OneWireHost {
const GpioPin* gpio_pin;
const OneWireHostTimings* timings;
Expand Down Expand Up @@ -354,3 +368,15 @@ void onewire_host_set_overdrive(OneWireHost* host, bool set) {

host->timings = set ? &onewire_host_timings_overdrive : &onewire_host_timings_normal;
}

void onewire_host_set_timings_default(OneWireHost* host) {
furi_check(host);

host->timings = &onewire_host_timings_normal;
}

void onewire_host_set_timings_tm01x(OneWireHost* host) {
furi_check(host);

host->timings = &onewire_host_timings_tm01x;
}
4 changes: 4 additions & 0 deletions lib/one_wire/one_wire_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ bool onewire_host_search(OneWireHost* host, uint8_t* new_addr, OneWireHostSearch
*/
void onewire_host_set_overdrive(OneWireHost* host, bool set);

void onewire_host_set_timings_default(OneWireHost* host);

void onewire_host_set_timings_tm01x(OneWireHost* host);

#ifdef __cplusplus
}
#endif
2 changes: 2 additions & 0 deletions targets/f18/api_symbols.csv
Original file line number Diff line number Diff line change
Expand Up @@ -2283,6 +2283,8 @@ Function,+,onewire_host_reset,_Bool,OneWireHost*
Function,+,onewire_host_reset_search,void,OneWireHost*
Function,+,onewire_host_search,_Bool,"OneWireHost*, uint8_t*, OneWireHostSearchMode"
Function,+,onewire_host_set_overdrive,void,"OneWireHost*, _Bool"
Function,+,onewire_host_set_timings_default,void,OneWireHost*
Function,+,onewire_host_set_timings_tm01x,void,OneWireHost*
Function,+,onewire_host_start,void,OneWireHost*
Function,+,onewire_host_stop,void,OneWireHost*
Function,+,onewire_host_target_search,void,"OneWireHost*, uint8_t"
Expand Down
2 changes: 2 additions & 0 deletions targets/f7/api_symbols.csv
Original file line number Diff line number Diff line change
Expand Up @@ -2935,6 +2935,8 @@ Function,+,onewire_host_reset,_Bool,OneWireHost*
Function,+,onewire_host_reset_search,void,OneWireHost*
Function,+,onewire_host_search,_Bool,"OneWireHost*, uint8_t*, OneWireHostSearchMode"
Function,+,onewire_host_set_overdrive,void,"OneWireHost*, _Bool"
Function,+,onewire_host_set_timings_default,void,OneWireHost*
Function,+,onewire_host_set_timings_tm01x,void,OneWireHost*
Function,+,onewire_host_start,void,OneWireHost*
Function,+,onewire_host_stop,void,OneWireHost*
Function,+,onewire_host_target_search,void,"OneWireHost*, uint8_t"
Expand Down
Loading