1
mirror of https://github.com/flipperdevices/flipperzero-firmware.git synced 2025-12-12 20:59:50 +04:00

[FL-3827] iButton ID writing (#3734)

* Function naming corrections and enabled writing ID for all dallas blanks
* Enable ID writing for ds1971 and ds1996
* Sync API Symbols

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
Astra
2024-08-01 01:59:41 +09:00
committed by GitHub
parent 380ec2ac46
commit 01b402ba2b
23 changed files with 76 additions and 59 deletions

View File

@@ -156,7 +156,7 @@ void ibutton_cli_write(Cli* cli, FuriString* args) {
} }
if(!(ibutton_protocols_get_features(protocols, ibutton_key_get_protocol_id(key)) & if(!(ibutton_protocols_get_features(protocols, ibutton_key_get_protocol_id(key)) &
iButtonProtocolFeatureWriteBlank)) { iButtonProtocolFeatureWriteId)) {
ibutton_cli_print_usage(); ibutton_cli_print_usage();
break; break;
} }
@@ -165,7 +165,7 @@ void ibutton_cli_write(Cli* cli, FuriString* args) {
ibutton_cli_print_key(protocols, key); ibutton_cli_print_key(protocols, key);
printf("Press Ctrl+C to abort\r\n"); printf("Press Ctrl+C to abort\r\n");
ibutton_worker_write_blank_start(worker, key); ibutton_worker_write_id_start(worker, key);
while(true) { while(true) {
uint32_t flags = furi_event_flag_wait( uint32_t flags = furi_event_flag_wait(
write_context.event, EVENT_FLAG_IBUTTON_COMPLETE, FuriFlagWaitAny, 100); write_context.event, EVENT_FLAG_IBUTTON_COMPLETE, FuriFlagWaitAny, 100);

View File

@@ -36,7 +36,7 @@
typedef enum { typedef enum {
iButtonWriteModeInvalid, iButtonWriteModeInvalid,
iButtonWriteModeBlank, iButtonWriteModeId,
iButtonWriteModeCopy, iButtonWriteModeCopy,
} iButtonWriteMode; } iButtonWriteMode;

View File

@@ -5,7 +5,7 @@ typedef enum {
SubmenuIndexSave, SubmenuIndexSave,
SubmenuIndexEmulate, SubmenuIndexEmulate,
SubmenuIndexViewData, SubmenuIndexViewData,
SubmenuIndexWriteBlank, SubmenuIndexWriteId,
SubmenuIndexWriteCopy, SubmenuIndexWriteCopy,
} SubmenuIndex; } SubmenuIndex;
@@ -30,11 +30,11 @@ void ibutton_scene_read_key_menu_on_enter(void* context) {
ibutton_scene_read_key_menu_submenu_callback, ibutton_scene_read_key_menu_submenu_callback,
ibutton); ibutton);
if(features & iButtonProtocolFeatureWriteBlank) { if(features & iButtonProtocolFeatureWriteId) {
submenu_add_item( submenu_add_item(
submenu, submenu,
"Write ID", "Write ID",
SubmenuIndexWriteBlank, SubmenuIndexWriteId,
ibutton_scene_read_key_menu_submenu_callback, ibutton_scene_read_key_menu_submenu_callback,
ibutton); ibutton);
} }
@@ -78,8 +78,8 @@ bool ibutton_scene_read_key_menu_on_event(void* context, SceneManagerEvent event
dolphin_deed(DolphinDeedIbuttonEmulate); dolphin_deed(DolphinDeedIbuttonEmulate);
} else if(event.event == SubmenuIndexViewData) { } else if(event.event == SubmenuIndexViewData) {
scene_manager_next_scene(scene_manager, iButtonSceneViewData); scene_manager_next_scene(scene_manager, iButtonSceneViewData);
} else if(event.event == SubmenuIndexWriteBlank) { } else if(event.event == SubmenuIndexWriteId) {
ibutton->write_mode = iButtonWriteModeBlank; ibutton->write_mode = iButtonWriteModeId;
scene_manager_next_scene(scene_manager, iButtonSceneWrite); scene_manager_next_scene(scene_manager, iButtonSceneWrite);
} else if(event.event == SubmenuIndexWriteCopy) { } else if(event.event == SubmenuIndexWriteCopy) {
ibutton->write_mode = iButtonWriteModeCopy; ibutton->write_mode = iButtonWriteModeCopy;

View File

@@ -3,7 +3,7 @@
enum SubmenuIndex { enum SubmenuIndex {
SubmenuIndexEmulate, SubmenuIndexEmulate,
SubmenuIndexWriteBlank, SubmenuIndexWriteId,
SubmenuIndexWriteCopy, SubmenuIndexWriteCopy,
SubmenuIndexEdit, SubmenuIndexEdit,
SubmenuIndexRename, SubmenuIndexRename,
@@ -20,9 +20,9 @@ void ibutton_scene_saved_key_menu_on_enter(void* context) {
submenu_add_item(submenu, "Emulate", SubmenuIndexEmulate, ibutton_submenu_callback, ibutton); submenu_add_item(submenu, "Emulate", SubmenuIndexEmulate, ibutton_submenu_callback, ibutton);
if(features & iButtonProtocolFeatureWriteBlank) { if(features & iButtonProtocolFeatureWriteId) {
submenu_add_item( submenu_add_item(
submenu, "Write ID", SubmenuIndexWriteBlank, ibutton_submenu_callback, ibutton); submenu, "Write ID", SubmenuIndexWriteId, ibutton_submenu_callback, ibutton);
} }
if(features & iButtonProtocolFeatureWriteCopy) { if(features & iButtonProtocolFeatureWriteCopy) {
@@ -55,8 +55,8 @@ bool ibutton_scene_saved_key_menu_on_event(void* context, SceneManagerEvent even
if(event.event == SubmenuIndexEmulate) { if(event.event == SubmenuIndexEmulate) {
scene_manager_next_scene(scene_manager, iButtonSceneEmulate); scene_manager_next_scene(scene_manager, iButtonSceneEmulate);
dolphin_deed(DolphinDeedIbuttonEmulate); dolphin_deed(DolphinDeedIbuttonEmulate);
} else if(event.event == SubmenuIndexWriteBlank) { } else if(event.event == SubmenuIndexWriteId) {
ibutton->write_mode = iButtonWriteModeBlank; ibutton->write_mode = iButtonWriteModeId;
scene_manager_next_scene(scene_manager, iButtonSceneWrite); scene_manager_next_scene(scene_manager, iButtonSceneWrite);
} else if(event.event == SubmenuIndexWriteCopy) { } else if(event.event == SubmenuIndexWriteCopy) {
ibutton->write_mode = iButtonWriteModeCopy; ibutton->write_mode = iButtonWriteModeCopy;

View File

@@ -52,9 +52,9 @@ void ibutton_scene_write_on_enter(void* context) {
ibutton_worker_write_set_callback(worker, ibutton_scene_write_callback, ibutton); ibutton_worker_write_set_callback(worker, ibutton_scene_write_callback, ibutton);
if(ibutton->write_mode == iButtonWriteModeBlank) { if(ibutton->write_mode == iButtonWriteModeId) {
furi_string_set(tmp, "Writing ID"); furi_string_set(tmp, "Writing ID");
ibutton_worker_write_blank_start(worker, key); ibutton_worker_write_id_start(worker, key);
} else if(ibutton->write_mode == iButtonWriteModeCopy) { } else if(ibutton->write_mode == iButtonWriteModeCopy) {
furi_string_set(tmp, "Full Writing"); furi_string_set(tmp, "Full Writing");

View File

@@ -160,7 +160,7 @@ bool ibutton_protocols_read(iButtonProtocols* protocols, iButtonKey* key) {
return id != iButtonProtocolIdInvalid; return id != iButtonProtocolIdInvalid;
} }
bool ibutton_protocols_write_blank(iButtonProtocols* protocols, iButtonKey* key) { bool ibutton_protocols_write_id(iButtonProtocols* protocols, iButtonKey* key) {
furi_check(protocols); furi_check(protocols);
furi_check(key); furi_check(key);
@@ -168,7 +168,7 @@ bool ibutton_protocols_write_blank(iButtonProtocols* protocols, iButtonKey* key)
iButtonProtocolData* data = ibutton_key_get_protocol_data(key); iButtonProtocolData* data = ibutton_key_get_protocol_data(key);
GET_PROTOCOL_GROUP(id); GET_PROTOCOL_GROUP(id);
return GROUP_BASE->write_blank(GROUP_DATA, data, PROTOCOL_ID); return GROUP_BASE->write_id(GROUP_DATA, data, PROTOCOL_ID);
} }
bool ibutton_protocols_write_copy(iButtonProtocols* protocols, iButtonKey* key) { bool ibutton_protocols_write_copy(iButtonProtocols* protocols, iButtonKey* key) {

View File

@@ -88,7 +88,7 @@ bool ibutton_protocols_read(iButtonProtocols* protocols, iButtonKey* key);
* @param [in] key pointer to the key to be written * @param [in] key pointer to the key to be written
* @return true on success, false on failure * @return true on success, false on failure
*/ */
bool ibutton_protocols_write_blank(iButtonProtocols* protocols, iButtonKey* key); bool ibutton_protocols_write_id(iButtonProtocols* protocols, iButtonKey* key);
/** /**
* Write the key to another one of the same type * Write the key to another one of the same type

View File

@@ -7,7 +7,7 @@ typedef enum {
iButtonMessageEnd, iButtonMessageEnd,
iButtonMessageStop, iButtonMessageStop,
iButtonMessageRead, iButtonMessageRead,
iButtonMessageWriteBlank, iButtonMessageWriteId,
iButtonMessageWriteCopy, iButtonMessageWriteCopy,
iButtonMessageEmulate, iButtonMessageEmulate,
iButtonMessageNotifyEmulate, iButtonMessageNotifyEmulate,
@@ -78,11 +78,11 @@ void ibutton_worker_read_start(iButtonWorker* worker, iButtonKey* key) {
furi_message_queue_put(worker->messages, &message, FuriWaitForever) == FuriStatusOk); furi_message_queue_put(worker->messages, &message, FuriWaitForever) == FuriStatusOk);
} }
void ibutton_worker_write_blank_start(iButtonWorker* worker, iButtonKey* key) { void ibutton_worker_write_id_start(iButtonWorker* worker, iButtonKey* key) {
furi_check(worker); furi_check(worker);
furi_check(key); furi_check(key);
iButtonMessage message = {.type = iButtonMessageWriteBlank, .data.key = key}; iButtonMessage message = {.type = iButtonMessageWriteId, .data.key = key};
furi_check( furi_check(
furi_message_queue_put(worker->messages, &message, FuriWaitForever) == FuriStatusOk); furi_message_queue_put(worker->messages, &message, FuriWaitForever) == FuriStatusOk);
@@ -185,9 +185,9 @@ static int32_t ibutton_worker_thread(void* thread_context) {
ibutton_worker_set_key_p(worker, message.data.key); ibutton_worker_set_key_p(worker, message.data.key);
ibutton_worker_switch_mode(worker, iButtonWorkerModeRead); ibutton_worker_switch_mode(worker, iButtonWorkerModeRead);
break; break;
case iButtonMessageWriteBlank: case iButtonMessageWriteId:
ibutton_worker_set_key_p(worker, message.data.key); ibutton_worker_set_key_p(worker, message.data.key);
ibutton_worker_switch_mode(worker, iButtonWorkerModeWriteBlank); ibutton_worker_switch_mode(worker, iButtonWorkerModeWriteId);
break; break;
case iButtonMessageWriteCopy: case iButtonMessageWriteCopy:
ibutton_worker_set_key_p(worker, message.data.key); ibutton_worker_set_key_p(worker, message.data.key);

View File

@@ -84,7 +84,7 @@ void ibutton_worker_write_set_callback(
* @param worker * @param worker
* @param key * @param key
*/ */
void ibutton_worker_write_blank_start(iButtonWorker* worker, iButtonKey* key); void ibutton_worker_write_id_start(iButtonWorker* worker, iButtonKey* key);
/** /**
* Start write copy mode * Start write copy mode

View File

@@ -25,7 +25,7 @@ typedef struct {
typedef enum { typedef enum {
iButtonWorkerModeIdle, iButtonWorkerModeIdle,
iButtonWorkerModeRead, iButtonWorkerModeRead,
iButtonWorkerModeWriteBlank, iButtonWorkerModeWriteId,
iButtonWorkerModeWriteCopy, iButtonWorkerModeWriteCopy,
iButtonWorkerModeEmulate, iButtonWorkerModeEmulate,
} iButtonWorkerMode; } iButtonWorkerMode;

View File

@@ -20,7 +20,7 @@ static void ibutton_worker_mode_read_tick(iButtonWorker* worker);
static void ibutton_worker_mode_read_stop(iButtonWorker* worker); static void ibutton_worker_mode_read_stop(iButtonWorker* worker);
static void ibutton_worker_mode_write_common_start(iButtonWorker* worker); static void ibutton_worker_mode_write_common_start(iButtonWorker* worker);
static void ibutton_worker_mode_write_blank_tick(iButtonWorker* worker); static void ibutton_worker_mode_write_id_tick(iButtonWorker* worker);
static void ibutton_worker_mode_write_copy_tick(iButtonWorker* worker); static void ibutton_worker_mode_write_copy_tick(iButtonWorker* worker);
static void ibutton_worker_mode_write_common_stop(iButtonWorker* worker); static void ibutton_worker_mode_write_common_stop(iButtonWorker* worker);
@@ -40,7 +40,7 @@ const iButtonWorkerModeType ibutton_worker_modes[] = {
{ {
.quant = 1000, .quant = 1000,
.start = ibutton_worker_mode_write_common_start, .start = ibutton_worker_mode_write_common_start,
.tick = ibutton_worker_mode_write_blank_tick, .tick = ibutton_worker_mode_write_id_tick,
.stop = ibutton_worker_mode_write_common_stop, .stop = ibutton_worker_mode_write_common_stop,
}, },
{ {
@@ -123,10 +123,10 @@ void ibutton_worker_mode_write_common_start(iButtonWorker* worker) { //-V524
furi_hal_power_enable_otg(); furi_hal_power_enable_otg();
} }
void ibutton_worker_mode_write_blank_tick(iButtonWorker* worker) { void ibutton_worker_mode_write_id_tick(iButtonWorker* worker) {
furi_assert(worker->key); furi_assert(worker->key);
const bool success = ibutton_protocols_write_blank(worker->protocols, worker->key); const bool success = ibutton_protocols_write_id(worker->protocols, worker->key);
// TODO FL-3527: pass a proper result to the callback // TODO FL-3527: pass a proper result to the callback
const iButtonWorkerWriteResult result = success ? iButtonWorkerWriteOK : const iButtonWorkerWriteResult result = success ? iButtonWorkerWriteOK :
iButtonWorkerWriteNoDetect; iButtonWorkerWriteNoDetect;

View File

@@ -25,7 +25,7 @@ typedef struct {
const char* name; const char* name;
iButtonProtocolDallasReadWriteFunc read; iButtonProtocolDallasReadWriteFunc read;
iButtonProtocolDallasReadWriteFunc write_blank; iButtonProtocolDallasReadWriteFunc write_id;
iButtonProtocolDallasReadWriteFunc write_copy; iButtonProtocolDallasReadWriteFunc write_copy;
iButtonProtocolDallasEmulateFunc emulate; iButtonProtocolDallasEmulateFunc emulate;
iButtonProtocolDallasSaveFunc save; iButtonProtocolDallasSaveFunc save;

View File

@@ -5,6 +5,8 @@
#include "dallas_common.h" #include "dallas_common.h"
#include "../blanks/tm2004.h"
#define DS1971_FAMILY_CODE 0x14U #define DS1971_FAMILY_CODE 0x14U
#define DS1971_FAMILY_NAME "DS1971" #define DS1971_FAMILY_NAME "DS1971"
@@ -31,6 +33,7 @@ typedef struct {
} DS1971ProtocolData; } DS1971ProtocolData;
static bool dallas_ds1971_read(OneWireHost*, void*); static bool dallas_ds1971_read(OneWireHost*, void*);
static bool dallas_ds1971_write_id(OneWireHost*, iButtonProtocolData*);
static bool dallas_ds1971_write_copy(OneWireHost*, iButtonProtocolData*); static bool dallas_ds1971_write_copy(OneWireHost*, iButtonProtocolData*);
static void dallas_ds1971_emulate(OneWireSlave*, iButtonProtocolData*); static void dallas_ds1971_emulate(OneWireSlave*, iButtonProtocolData*);
static bool dallas_ds1971_load(FlipperFormat*, uint32_t, iButtonProtocolData*); static bool dallas_ds1971_load(FlipperFormat*, uint32_t, iButtonProtocolData*);
@@ -48,13 +51,14 @@ static bool ds1971_emulate_read_mem(OneWireSlave* bus, const uint8_t* data, size
const iButtonProtocolDallasBase ibutton_protocol_ds1971 = { const iButtonProtocolDallasBase ibutton_protocol_ds1971 = {
.family_code = DS1971_FAMILY_CODE, .family_code = DS1971_FAMILY_CODE,
.features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteCopy, .features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteId |
iButtonProtocolFeatureWriteCopy,
.data_size = sizeof(DS1971ProtocolData), .data_size = sizeof(DS1971ProtocolData),
.manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME,
.name = DS1971_FAMILY_NAME, .name = DS1971_FAMILY_NAME,
.read = dallas_ds1971_read, .read = dallas_ds1971_read,
.write_blank = NULL, // TODO FL-3531: Implement writing to blank .write_id = dallas_ds1971_write_id,
.write_copy = dallas_ds1971_write_copy, .write_copy = dallas_ds1971_write_copy,
.emulate = dallas_ds1971_emulate, .emulate = dallas_ds1971_emulate,
.save = dallas_ds1971_save, .save = dallas_ds1971_save,
@@ -74,6 +78,11 @@ bool dallas_ds1971_read(OneWireHost* host, iButtonProtocolData* protocol_data) {
dallas_ds1971_read_mem(host, 0, data->eeprom_data, DS1971_EEPROM_DATA_SIZE); dallas_ds1971_read_mem(host, 0, data->eeprom_data, DS1971_EEPROM_DATA_SIZE);
} }
bool dallas_ds1971_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) {
DS1971ProtocolData* data = protocol_data;
return tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData));
}
bool dallas_ds1971_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) { bool dallas_ds1971_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) {
DS1971ProtocolData* data = protocol_data; DS1971ProtocolData* data = protocol_data;

View File

@@ -23,7 +23,7 @@ typedef struct {
} DS1990ProtocolData; } DS1990ProtocolData;
static bool dallas_ds1990_read(OneWireHost*, iButtonProtocolData*); static bool dallas_ds1990_read(OneWireHost*, iButtonProtocolData*);
static bool dallas_ds1990_write_blank(OneWireHost*, iButtonProtocolData*); static bool dallas_ds1990_write_id(OneWireHost*, iButtonProtocolData*);
static void dallas_ds1990_emulate(OneWireSlave*, iButtonProtocolData*); static void dallas_ds1990_emulate(OneWireSlave*, iButtonProtocolData*);
static bool dallas_ds1990_load(FlipperFormat*, uint32_t, iButtonProtocolData*); static bool dallas_ds1990_load(FlipperFormat*, uint32_t, iButtonProtocolData*);
static bool dallas_ds1990_save(FlipperFormat*, const iButtonProtocolData*); static bool dallas_ds1990_save(FlipperFormat*, const iButtonProtocolData*);
@@ -36,13 +36,13 @@ static void dallas_ds1990_apply_edits(iButtonProtocolData*);
const iButtonProtocolDallasBase ibutton_protocol_ds1990 = { const iButtonProtocolDallasBase ibutton_protocol_ds1990 = {
.family_code = DS1990_FAMILY_CODE, .family_code = DS1990_FAMILY_CODE,
.features = iButtonProtocolFeatureWriteBlank, .features = iButtonProtocolFeatureWriteId,
.data_size = sizeof(DS1990ProtocolData), .data_size = sizeof(DS1990ProtocolData),
.manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME,
.name = DS1990_FAMILY_NAME, .name = DS1990_FAMILY_NAME,
.read = dallas_ds1990_read, .read = dallas_ds1990_read,
.write_blank = dallas_ds1990_write_blank, .write_id = dallas_ds1990_write_id,
.write_copy = NULL, /* No data to write a copy */ .write_copy = NULL, /* No data to write a copy */
.emulate = dallas_ds1990_emulate, .emulate = dallas_ds1990_emulate,
.save = dallas_ds1990_save, .save = dallas_ds1990_save,
@@ -61,7 +61,7 @@ bool dallas_ds1990_read(OneWireHost* host, iButtonProtocolData* protocol_data) {
return onewire_host_reset(host) && dallas_common_read_rom(host, &data->rom_data); return onewire_host_reset(host) && dallas_common_read_rom(host, &data->rom_data);
} }
bool dallas_ds1990_write_blank(OneWireHost* host, iButtonProtocolData* protocol_data) { bool dallas_ds1990_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) {
DS1990ProtocolData* data = protocol_data; DS1990ProtocolData* data = protocol_data;
return rw1990_write_v1(host, data->rom_data.bytes, sizeof(DallasCommonRomData)) || return rw1990_write_v1(host, data->rom_data.bytes, sizeof(DallasCommonRomData)) ||

View File

@@ -31,7 +31,7 @@ typedef struct {
} DS1992ProtocolData; } DS1992ProtocolData;
static bool dallas_ds1992_read(OneWireHost*, void*); static bool dallas_ds1992_read(OneWireHost*, void*);
static bool dallas_ds1992_write_blank(OneWireHost*, iButtonProtocolData*); static bool dallas_ds1992_write_id(OneWireHost*, iButtonProtocolData*);
static bool dallas_ds1992_write_copy(OneWireHost*, iButtonProtocolData*); static bool dallas_ds1992_write_copy(OneWireHost*, iButtonProtocolData*);
static void dallas_ds1992_emulate(OneWireSlave*, iButtonProtocolData*); static void dallas_ds1992_emulate(OneWireSlave*, iButtonProtocolData*);
static bool dallas_ds1992_load(FlipperFormat*, uint32_t, iButtonProtocolData*); static bool dallas_ds1992_load(FlipperFormat*, uint32_t, iButtonProtocolData*);
@@ -46,14 +46,14 @@ static void dallas_ds1992_apply_edits(iButtonProtocolData*);
const iButtonProtocolDallasBase ibutton_protocol_ds1992 = { const iButtonProtocolDallasBase ibutton_protocol_ds1992 = {
.family_code = DS1992_FAMILY_CODE, .family_code = DS1992_FAMILY_CODE,
.features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteBlank | .features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteId |
iButtonProtocolFeatureWriteCopy, iButtonProtocolFeatureWriteCopy,
.data_size = sizeof(DS1992ProtocolData), .data_size = sizeof(DS1992ProtocolData),
.manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME,
.name = DS1992_FAMILY_NAME, .name = DS1992_FAMILY_NAME,
.read = dallas_ds1992_read, .read = dallas_ds1992_read,
.write_blank = dallas_ds1992_write_blank, .write_id = dallas_ds1992_write_id,
.write_copy = dallas_ds1992_write_copy, .write_copy = dallas_ds1992_write_copy,
.emulate = dallas_ds1992_emulate, .emulate = dallas_ds1992_emulate,
.save = dallas_ds1992_save, .save = dallas_ds1992_save,
@@ -73,10 +73,9 @@ bool dallas_ds1992_read(OneWireHost* host, iButtonProtocolData* protocol_data) {
dallas_common_read_mem(host, 0, data->sram_data, DS1992_SRAM_DATA_SIZE); dallas_common_read_mem(host, 0, data->sram_data, DS1992_SRAM_DATA_SIZE);
} }
bool dallas_ds1992_write_blank(OneWireHost* host, iButtonProtocolData* protocol_data) { bool dallas_ds1992_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) {
DS1992ProtocolData* data = protocol_data; DS1992ProtocolData* data = protocol_data;
// TODO FL-3532: Make this work, currently broken return tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData));
return tm2004_write(host, (uint8_t*)data, sizeof(DallasCommonRomData) + DS1992_SRAM_DATA_SIZE);
} }
bool dallas_ds1992_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) { bool dallas_ds1992_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) {

View File

@@ -5,6 +5,8 @@
#include "dallas_common.h" #include "dallas_common.h"
#include "../blanks/tm2004.h"
#define DS1996_FAMILY_CODE 0x0CU #define DS1996_FAMILY_CODE 0x0CU
#define DS1996_FAMILY_NAME "DS1996" #define DS1996_FAMILY_NAME "DS1996"
@@ -29,6 +31,7 @@ typedef struct {
} DS1996ProtocolData; } DS1996ProtocolData;
static bool dallas_ds1996_read(OneWireHost*, void*); static bool dallas_ds1996_read(OneWireHost*, void*);
static bool dallas_ds1996_write_id(OneWireHost*, iButtonProtocolData*);
static bool dallas_ds1996_write_copy(OneWireHost*, iButtonProtocolData*); static bool dallas_ds1996_write_copy(OneWireHost*, iButtonProtocolData*);
static void dallas_ds1996_emulate(OneWireSlave*, iButtonProtocolData*); static void dallas_ds1996_emulate(OneWireSlave*, iButtonProtocolData*);
static bool dallas_ds1996_load(FlipperFormat*, uint32_t, iButtonProtocolData*); static bool dallas_ds1996_load(FlipperFormat*, uint32_t, iButtonProtocolData*);
@@ -43,13 +46,14 @@ static void dallas_ds1996_apply_edits(iButtonProtocolData*);
const iButtonProtocolDallasBase ibutton_protocol_ds1996 = { const iButtonProtocolDallasBase ibutton_protocol_ds1996 = {
.family_code = DS1996_FAMILY_CODE, .family_code = DS1996_FAMILY_CODE,
.features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteCopy, .features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteId |
iButtonProtocolFeatureWriteCopy,
.data_size = sizeof(DS1996ProtocolData), .data_size = sizeof(DS1996ProtocolData),
.manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME,
.name = DS1996_FAMILY_NAME, .name = DS1996_FAMILY_NAME,
.read = dallas_ds1996_read, .read = dallas_ds1996_read,
.write_blank = NULL, /* Data too big for known blanks */ .write_id = dallas_ds1996_write_id,
.write_copy = dallas_ds1996_write_copy, .write_copy = dallas_ds1996_write_copy,
.emulate = dallas_ds1996_emulate, .emulate = dallas_ds1996_emulate,
.save = dallas_ds1996_save, .save = dallas_ds1996_save,
@@ -83,6 +87,11 @@ bool dallas_ds1996_read(OneWireHost* host, iButtonProtocolData* protocol_data) {
return success; return success;
} }
bool dallas_ds1996_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) {
DS1996ProtocolData* data = protocol_data;
return tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData));
}
bool dallas_ds1996_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) { bool dallas_ds1996_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) {
DS1996ProtocolData* data = protocol_data; DS1996ProtocolData* data = protocol_data;
bool success = false; bool success = false;

View File

@@ -20,7 +20,7 @@ typedef struct {
} DallasGenericProtocolData; } DallasGenericProtocolData;
static bool ds_generic_read(OneWireHost*, iButtonProtocolData*); static bool ds_generic_read(OneWireHost*, iButtonProtocolData*);
static bool ds_generic_write_blank(OneWireHost*, iButtonProtocolData*); static bool ds_generic_write_id(OneWireHost*, iButtonProtocolData*);
static void ds_generic_emulate(OneWireSlave*, iButtonProtocolData*); static void ds_generic_emulate(OneWireSlave*, iButtonProtocolData*);
static bool ds_generic_load(FlipperFormat*, uint32_t, iButtonProtocolData*); static bool ds_generic_load(FlipperFormat*, uint32_t, iButtonProtocolData*);
static bool ds_generic_save(FlipperFormat*, const iButtonProtocolData*); static bool ds_generic_save(FlipperFormat*, const iButtonProtocolData*);
@@ -33,13 +33,13 @@ static void ds_generic_apply_edits(iButtonProtocolData*);
const iButtonProtocolDallasBase ibutton_protocol_ds_generic = { const iButtonProtocolDallasBase ibutton_protocol_ds_generic = {
.family_code = DALLAS_GENERIC_FAMILY_CODE, .family_code = DALLAS_GENERIC_FAMILY_CODE,
.features = iButtonProtocolFeatureWriteBlank, .features = iButtonProtocolFeatureWriteId,
.data_size = sizeof(DallasGenericProtocolData), .data_size = sizeof(DallasGenericProtocolData),
.manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME,
.name = DALLAS_GENERIC_FAMILY_NAME, .name = DALLAS_GENERIC_FAMILY_NAME,
.read = ds_generic_read, .read = ds_generic_read,
.write_blank = ds_generic_write_blank, .write_id = ds_generic_write_id,
.write_copy = NULL, /* No data to write a copy */ .write_copy = NULL, /* No data to write a copy */
.emulate = ds_generic_emulate, .emulate = ds_generic_emulate,
.save = ds_generic_save, .save = ds_generic_save,
@@ -58,7 +58,7 @@ bool ds_generic_read(OneWireHost* host, iButtonProtocolData* protocol_data) {
return onewire_host_reset(host) && dallas_common_read_rom(host, &data->rom_data); return onewire_host_reset(host) && dallas_common_read_rom(host, &data->rom_data);
} }
bool ds_generic_write_blank(OneWireHost* host, iButtonProtocolData* protocol_data) { bool ds_generic_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) {
DallasGenericProtocolData* data = protocol_data; DallasGenericProtocolData* data = protocol_data;
return tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData)); return tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData));
} }

View File

@@ -133,13 +133,13 @@ static bool ibutton_protocol_group_dallas_read(
return success; return success;
} }
static bool ibutton_protocol_group_dallas_write_blank( static bool ibutton_protocol_group_dallas_write_id(
iButtonProtocolGroupDallas* group, iButtonProtocolGroupDallas* group,
iButtonProtocolData* data, iButtonProtocolData* data,
iButtonProtocolLocalId id) { iButtonProtocolLocalId id) {
furi_assert(id < iButtonProtocolDSMax); furi_assert(id < iButtonProtocolDSMax);
const iButtonProtocolDallasBase* protocol = ibutton_protocols_dallas[id]; const iButtonProtocolDallasBase* protocol = ibutton_protocols_dallas[id];
furi_assert(protocol->features & iButtonProtocolFeatureWriteBlank); furi_assert(protocol->features & iButtonProtocolFeatureWriteId);
OneWireHost* host = group->host; OneWireHost* host = group->host;
@@ -148,7 +148,7 @@ static bool ibutton_protocol_group_dallas_write_blank(
FURI_CRITICAL_ENTER(); FURI_CRITICAL_ENTER();
const bool success = protocol->write_blank(host, data); const bool success = protocol->write_id(host, data);
onewire_host_stop(host); onewire_host_stop(host);
FURI_CRITICAL_EXIT(); FURI_CRITICAL_EXIT();
@@ -307,7 +307,7 @@ const iButtonProtocolGroupBase ibutton_protocol_group_dallas = {
.get_name = (iButtonProtocolGroupGetStringFunc)ibutton_protocol_group_dallas_get_name, .get_name = (iButtonProtocolGroupGetStringFunc)ibutton_protocol_group_dallas_get_name,
.read = (iButtonProtocolGroupReadFunc)ibutton_protocol_group_dallas_read, .read = (iButtonProtocolGroupReadFunc)ibutton_protocol_group_dallas_read,
.write_blank = (iButtonProtocolGroupWriteFunc)ibutton_protocol_group_dallas_write_blank, .write_id = (iButtonProtocolGroupWriteFunc)ibutton_protocol_group_dallas_write_id,
.write_copy = (iButtonProtocolGroupWriteFunc)ibutton_protocol_group_dallas_write_copy, .write_copy = (iButtonProtocolGroupWriteFunc)ibutton_protocol_group_dallas_write_copy,
.emulate_start = (iButtonProtocolGroupApplyFunc)ibutton_protocol_group_dallas_emulate_start, .emulate_start = (iButtonProtocolGroupApplyFunc)ibutton_protocol_group_dallas_emulate_start,

View File

@@ -284,7 +284,7 @@ const iButtonProtocolGroupBase ibutton_protocol_group_misc = {
.get_name = (iButtonProtocolGroupGetStringFunc)ibutton_protocol_group_misc_get_name, .get_name = (iButtonProtocolGroupGetStringFunc)ibutton_protocol_group_misc_get_name,
.read = (iButtonProtocolGroupReadFunc)ibutton_protocol_group_misc_read, .read = (iButtonProtocolGroupReadFunc)ibutton_protocol_group_misc_read,
.write_blank = NULL, .write_id = NULL,
.write_copy = NULL, .write_copy = NULL,
.emulate_start = (iButtonProtocolGroupApplyFunc)ibutton_protocol_group_misc_emulate_start, .emulate_start = (iButtonProtocolGroupApplyFunc)ibutton_protocol_group_misc_emulate_start,

View File

@@ -11,7 +11,7 @@ enum {
typedef enum { typedef enum {
iButtonProtocolFeatureExtData = (1U << 0), iButtonProtocolFeatureExtData = (1U << 0),
iButtonProtocolFeatureWriteBlank = (1U << 1), iButtonProtocolFeatureWriteId = (1U << 1),
iButtonProtocolFeatureWriteCopy = (1U << 2), iButtonProtocolFeatureWriteCopy = (1U << 2),
} iButtonProtocolFeature; } iButtonProtocolFeature;

View File

@@ -84,7 +84,7 @@ typedef struct {
iButtonProtocolGroupGetStringFunc get_name; iButtonProtocolGroupGetStringFunc get_name;
iButtonProtocolGroupReadFunc read; iButtonProtocolGroupReadFunc read;
iButtonProtocolGroupWriteFunc write_blank; iButtonProtocolGroupWriteFunc write_id;
iButtonProtocolGroupWriteFunc write_copy; iButtonProtocolGroupWriteFunc write_copy;
iButtonProtocolGroupApplyFunc emulate_start; iButtonProtocolGroupApplyFunc emulate_start;

View File

@@ -1,5 +1,5 @@
entry,status,name,type,params entry,status,name,type,params
Version,+,69.0,, Version,+,70.0,,
Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli.h,,
1 entry status name type params
2 Version + 69.0 70.0
3 Header + applications/services/bt/bt_service/bt.h
4 Header + applications/services/bt/bt_service/bt_keys_storage.h
5 Header + applications/services/cli/cli.h

View File

@@ -1,5 +1,5 @@
entry,status,name,type,params entry,status,name,type,params
Version,+,69.0,, Version,+,70.0,,
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
@@ -1950,7 +1950,7 @@ Function,+,ibutton_protocols_render_data,void,"iButtonProtocols*, const iButtonK
Function,+,ibutton_protocols_render_error,void,"iButtonProtocols*, const iButtonKey*, FuriString*" Function,+,ibutton_protocols_render_error,void,"iButtonProtocols*, const iButtonKey*, FuriString*"
Function,+,ibutton_protocols_render_uid,void,"iButtonProtocols*, const iButtonKey*, FuriString*" Function,+,ibutton_protocols_render_uid,void,"iButtonProtocols*, const iButtonKey*, FuriString*"
Function,+,ibutton_protocols_save,_Bool,"iButtonProtocols*, const iButtonKey*, const char*" Function,+,ibutton_protocols_save,_Bool,"iButtonProtocols*, const iButtonKey*, const char*"
Function,+,ibutton_protocols_write_blank,_Bool,"iButtonProtocols*, iButtonKey*" Function,+,ibutton_protocols_write_id,_Bool,"iButtonProtocols*, iButtonKey*"
Function,+,ibutton_protocols_write_copy,_Bool,"iButtonProtocols*, iButtonKey*" Function,+,ibutton_protocols_write_copy,_Bool,"iButtonProtocols*, iButtonKey*"
Function,+,ibutton_worker_alloc,iButtonWorker*,iButtonProtocols* Function,+,ibutton_worker_alloc,iButtonWorker*,iButtonProtocols*
Function,+,ibutton_worker_emulate_set_callback,void,"iButtonWorker*, iButtonWorkerEmulateCallback, void*" Function,+,ibutton_worker_emulate_set_callback,void,"iButtonWorker*, iButtonWorkerEmulateCallback, void*"
@@ -1961,7 +1961,7 @@ Function,+,ibutton_worker_read_start,void,"iButtonWorker*, iButtonKey*"
Function,+,ibutton_worker_start_thread,void,iButtonWorker* Function,+,ibutton_worker_start_thread,void,iButtonWorker*
Function,+,ibutton_worker_stop,void,iButtonWorker* Function,+,ibutton_worker_stop,void,iButtonWorker*
Function,+,ibutton_worker_stop_thread,void,iButtonWorker* Function,+,ibutton_worker_stop_thread,void,iButtonWorker*
Function,+,ibutton_worker_write_blank_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_write_id_start,void,"iButtonWorker*, iButtonKey*"
Function,+,ibutton_worker_write_copy_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_write_copy_start,void,"iButtonWorker*, iButtonKey*"
Function,+,ibutton_worker_write_set_callback,void,"iButtonWorker*, iButtonWorkerWriteCallback, void*" Function,+,ibutton_worker_write_set_callback,void,"iButtonWorker*, iButtonWorkerWriteCallback, void*"
Function,+,icon_animation_alloc,IconAnimation*,const Icon* Function,+,icon_animation_alloc,IconAnimation*,const Icon*
1 entry status name type params
2 Version + 69.0 70.0
3 Header + applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h
4 Header + applications/services/bt/bt_service/bt.h
5 Header + applications/services/bt/bt_service/bt_keys_storage.h
1950 Function + ibutton_protocols_render_error void iButtonProtocols*, const iButtonKey*, FuriString*
1951 Function + ibutton_protocols_render_uid void iButtonProtocols*, const iButtonKey*, FuriString*
1952 Function + ibutton_protocols_save _Bool iButtonProtocols*, const iButtonKey*, const char*
1953 Function + ibutton_protocols_write_blank ibutton_protocols_write_id _Bool iButtonProtocols*, iButtonKey*
1954 Function + ibutton_protocols_write_copy _Bool iButtonProtocols*, iButtonKey*
1955 Function + ibutton_worker_alloc iButtonWorker* iButtonProtocols*
1956 Function + ibutton_worker_emulate_set_callback void iButtonWorker*, iButtonWorkerEmulateCallback, void*
1961 Function + ibutton_worker_start_thread void iButtonWorker*
1962 Function + ibutton_worker_stop void iButtonWorker*
1963 Function + ibutton_worker_stop_thread void iButtonWorker*
1964 Function + ibutton_worker_write_blank_start ibutton_worker_write_id_start void iButtonWorker*, iButtonKey*
1965 Function + ibutton_worker_write_copy_start void iButtonWorker*, iButtonKey*
1966 Function + ibutton_worker_write_set_callback void iButtonWorker*, iButtonWorkerWriteCallback, void*
1967 Function + icon_animation_alloc IconAnimation* const Icon*