Merge branch 'ofw-dev' into xfw-dev

This commit is contained in:
Willy-JL
2024-01-18 02:32:35 +00:00
85 changed files with 4746 additions and 977 deletions
+14
View File
@@ -78,6 +78,20 @@ CC1101Status cc1101_get_status(FuriHalSpiBusHandle* handle) {
return cc1101_strobe(handle, CC1101_STROBE_SNOP);
}
bool cc1101_wait_status_state(FuriHalSpiBusHandle* handle, CC1101State state, uint32_t timeout_us) {
bool result = false;
CC1101Status status = {0};
FuriHalCortexTimer timer = furi_hal_cortex_timer_get(timeout_us);
while(!furi_hal_cortex_timer_is_expired(timer)) {
status = cc1101_strobe(handle, CC1101_STROBE_SNOP);
if(status.STATE == state) {
result = true;
break;
}
}
return result;
}
CC1101Status cc1101_shutdown(FuriHalSpiBusHandle* handle) {
return cc1101_strobe(handle, CC1101_STROBE_SPWD);
}
+10
View File
@@ -59,6 +59,16 @@ CC1101Status cc1101_reset(FuriHalSpiBusHandle* handle);
*/
CC1101Status cc1101_get_status(FuriHalSpiBusHandle* handle);
/** Wait specific chip state
*
* @param handle The SPI bus handle
* @param[in] state The state to wait
* @param[in] timeout_us The timeout in microseconds
*
* @return true on success, false otherwise
*/
bool cc1101_wait_status_state(FuriHalSpiBusHandle* handle, CC1101State state, uint32_t timeout_us);
/** Enable shutdown mode
*
* @param handle - pointer to FuriHalSpiHandle
+2 -2
View File
@@ -101,7 +101,7 @@ static bool protocol_fdx_b_can_be_decoded(ProtocolFDXB* protocol) {
void protocol_fdx_b_decode(ProtocolFDXB* protocol) {
// remove parity
bit_lib_remove_bit_every_nth(protocol->encoded_data, 3, 13 * 9, 9);
bit_lib_remove_bit_every_nth(protocol->encoded_data, 3, 14 * 9, 9);
// remove header pattern
for(size_t i = 0; i < 11; i++)
@@ -119,7 +119,7 @@ void protocol_fdx_b_decode(ProtocolFDXB* protocol) {
// 72 xxxxxxxx
// 80 eeeeeeee 24 bits of extra data if present.
// 88 eeeeeeee eg. $123456.
// 92 eeeeeeee
// 96 eeeeeeee
// copy data without checksum
bit_lib_copy_bits(protocol->data, 0, 64, protocol->encoded_data, 0);
+6 -1
View File
@@ -252,7 +252,12 @@ const uint8_t* iso14443_4a_get_historical_bytes(const Iso14443_4aData* data, uin
furi_assert(count);
*count = simple_array_get_count(data->ats_data.t1_tk);
return simple_array_cget_data(data->ats_data.t1_tk);
const uint8_t* hist_bytes = NULL;
if(*count > 0) {
hist_bytes = simple_array_cget_data(data->ats_data.t1_tk);
}
return hist_bytes;
}
bool iso14443_4a_supports_bit_rate(const Iso14443_4aData* data, Iso14443_4aBitRate bit_rate) {
+53 -38
View File
@@ -179,44 +179,53 @@ bool mf_desfire_file_settings_parse(MfDesfireFileSettings* data, const BitBuffer
const size_t data_size = bit_buffer_get_size_bytes(buf);
const size_t min_data_size =
sizeof(MfDesfireFileSettingsHeader) + sizeof(MfDesfireFileSettingsData);
const size_t max_data_size =
sizeof(MfDesfireFileSettingsHeader) + sizeof(MfDesfireFileSettingsValue);
if(data_size < min_data_size) break;
if(data_size <= max_data_size) {
MfDesfireFileSettingsLayout layout;
bit_buffer_write_bytes(buf, &layout, sizeof(MfDesfireFileSettingsLayout));
MfDesfireFileSettingsLayout layout;
bit_buffer_write_bytes(buf, &layout, sizeof(MfDesfireFileSettingsLayout));
data->type = layout.header.type;
data->comm = layout.header.comm;
data->access_rights = layout.header.access_rights;
data->type = layout.header.type;
data->comm = layout.header.comm;
data->access_rights = layout.header.access_rights;
if(data->type == MfDesfireFileTypeStandard || data->type == MfDesfireFileTypeBackup) {
if(data_size != min_data_size) break;
if(data->type == MfDesfireFileTypeStandard || data->type == MfDesfireFileTypeBackup) {
if(data_size != min_data_size) break;
data->data.size = layout.data.size;
} else if(data->type == MfDesfireFileTypeValue) {
if(data_size !=
sizeof(MfDesfireFileSettingsHeader) + sizeof(MfDesfireFileSettingsValue))
break;
data->data.size = layout.data.size;
data->value.lo_limit = layout.value.lo_limit;
data->value.hi_limit = layout.value.hi_limit;
data->value.limited_credit_value = layout.value.limited_credit_value;
data->value.limited_credit_enabled = layout.value.limited_credit_enabled;
} else if(data->type == MfDesfireFileTypeValue) {
if(data_size !=
sizeof(MfDesfireFileSettingsHeader) + sizeof(MfDesfireFileSettingsValue))
} else if(
data->type == MfDesfireFileTypeLinearRecord ||
data->type == MfDesfireFileTypeCyclicRecord) {
if(data_size !=
sizeof(MfDesfireFileSettingsHeader) + sizeof(MfDesfireFileSettingsRecord))
break;
data->record.size = layout.record.size;
data->record.max = layout.record.max;
data->record.cur = layout.record.cur;
} else {
break;
data->value.lo_limit = layout.value.lo_limit;
data->value.hi_limit = layout.value.hi_limit;
data->value.limited_credit_value = layout.value.limited_credit_value;
data->value.limited_credit_enabled = layout.value.limited_credit_enabled;
} else if(
data->type == MfDesfireFileTypeLinearRecord ||
data->type == MfDesfireFileTypeCyclicRecord) {
if(data_size !=
sizeof(MfDesfireFileSettingsHeader) + sizeof(MfDesfireFileSettingsRecord))
break;
data->record.size = layout.record.size;
data->record.max = layout.record.max;
data->record.cur = layout.record.cur;
}
} else {
break;
// TODO FL-3750: process HID Desfire command response here
// Set default fields for now
data->type = 0;
data->comm = 0;
data->access_rights = 0;
data->data.size = 0;
}
parsed = true;
@@ -478,19 +487,25 @@ bool mf_desfire_application_load(MfDesfireApplication* data, const char* prefix,
do {
if(!mf_desfire_key_settings_load(&data->key_settings, prefix, ff)) break;
const uint32_t key_version_count = data->key_settings.max_keys;
simple_array_init(data->key_versions, key_version_count);
uint32_t i;
for(i = 0; i < key_version_count; ++i) {
if(!mf_desfire_key_version_load(simple_array_get(data->key_versions, i), prefix, i, ff))
break;
const uint32_t key_version_count = data->key_settings.max_keys;
if(key_version_count) {
simple_array_init(data->key_versions, key_version_count);
for(i = 0; i < key_version_count; ++i) {
if(!mf_desfire_key_version_load(
simple_array_get(data->key_versions, i), prefix, i, ff))
break;
}
if(i != key_version_count) break;
}
if(i != key_version_count) break;
uint32_t file_count;
if(!mf_desfire_file_count_load(&file_count, prefix, ff)) break;
if(!mf_desfire_file_count_load(&file_count, prefix, ff)) {
success = true;
break;
}
simple_array_init(data->file_ids, file_count);
if(!mf_desfire_file_ids_load(simple_array_get_data(data->file_ids), file_count, prefix, ff))
+4 -1
View File
@@ -278,7 +278,10 @@ void signal_reader_start(SignalReader* instance, SignalReaderCallback callback,
// Start DMA irq, higher priority than normal
furi_hal_interrupt_set_isr_ex(
SIGNAL_READER_DMA_GPIO_IRQ, 14, furi_hal_sw_digital_pin_dma_rx_isr, instance);
SIGNAL_READER_DMA_GPIO_IRQ,
FuriHalInterruptPriorityHighest,
furi_hal_sw_digital_pin_dma_rx_isr,
instance);
// Start DMA Sync timer
LL_DMA_EnableChannel(SIGNAL_READER_DMA_CNT_SYNC_DEF);
+45 -42
View File
@@ -1,52 +1,55 @@
#include "value_index.h"
#include <math.h>
uint8_t value_index_int32(const int32_t value, const int32_t values[], uint8_t values_count) {
int64_t last_value = INT64_MIN;
uint8_t index = 0;
for(uint8_t i = 0; i < values_count; i++) {
if((value >= last_value) && (value <= values[i])) {
index = i;
break;
}
last_value = values[i];
}
return index;
}
size_t value_index_int32(const int32_t value, const int32_t values[], size_t values_count) {
size_t index = 0;
uint8_t value_index_uint32(const uint32_t value, const uint32_t values[], uint8_t values_count) {
int64_t last_value = INT64_MIN;
uint8_t index = 0;
for(uint8_t i = 0; i < values_count; i++) {
if((value >= last_value) && (value <= values[i])) {
index = i;
break;
}
last_value = values[i];
}
return index;
}
uint8_t value_index_float(const float value, const float values[], uint8_t values_count) {
const float epsilon = 0.01f;
float last_value = values[0];
uint8_t index = 0;
for(uint8_t i = 0; i < values_count; i++) {
if((value >= last_value - epsilon) && (value <= values[i] + epsilon)) {
index = i;
break;
}
last_value = values[i];
}
return index;
}
uint8_t value_index_bool(const bool value, const bool values[], uint8_t values_count) {
uint8_t index = 0;
for(uint8_t i = 0; i < values_count; i++) {
for(size_t i = 0; i < values_count; i++) {
if(value == values[i]) {
index = i;
break;
}
}
return index;
}
size_t value_index_uint32(const uint32_t value, const uint32_t values[], size_t values_count) {
size_t index = 0;
for(size_t i = 0; i < values_count; i++) {
if(value == values[i]) {
index = i;
break;
}
}
return index;
}
size_t value_index_float(const float value, const float values[], size_t values_count) {
size_t index = 0;
for(size_t i = 0; i < values_count; i++) {
const float epsilon = fabsf(values[i] * 0.01f);
if(fabsf(values[i] - value) <= epsilon) {
index = i;
break;
}
}
return index;
}
size_t value_index_bool(const bool value, const bool values[], size_t values_count) {
size_t index = 0;
for(size_t i = 0; i < values_count; i++) {
if(value == values[i]) {
index = i;
break;
}
}
return index;
}
+5 -4
View File
@@ -2,6 +2,7 @@
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
@@ -18,7 +19,7 @@ extern "C" {
*
* @return value's index.
*/
uint8_t value_index_int32(const int32_t value, const int32_t values[], uint8_t values_count);
size_t value_index_int32(const int32_t value, const int32_t values[], size_t values_count);
/** Get the index of a uint32_t array element which is closest to the given value.
*
@@ -31,7 +32,7 @@ uint8_t value_index_int32(const int32_t value, const int32_t values[], uint8_t v
*
* @return value's index.
*/
uint8_t value_index_uint32(const uint32_t value, const uint32_t values[], uint8_t values_count);
size_t value_index_uint32(const uint32_t value, const uint32_t values[], size_t values_count);
/** Get the index of a float array element which is closest to the given value.
*
@@ -44,7 +45,7 @@ uint8_t value_index_uint32(const uint32_t value, const uint32_t values[], uint8_
*
* @return value's index.
*/
uint8_t value_index_float(const float value, const float values[], uint8_t values_count);
size_t value_index_float(const float value, const float values[], size_t values_count);
/** Get the index of a bool array element which is equal to the given value.
*
@@ -57,7 +58,7 @@ uint8_t value_index_float(const float value, const float values[], uint8_t value
*
* @return value's index.
*/
uint8_t value_index_bool(const bool value, const bool values[], uint8_t values_count);
size_t value_index_bool(const bool value, const bool values[], size_t values_count);
#ifdef __cplusplus
}