mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-14 12:48:35 -07:00
implement ISO14433-A fully in software for pointless experimenting reasons and improving the DigitalReader / SignalSequence code in performance
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
entry,status,name,type,params
|
||||
Version,+,7.28,,
|
||||
Version,+,7.33,,
|
||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||
Header,+,applications/services/cli/cli.h,,
|
||||
Header,+,applications/services/cli/cli_vcp.h,,
|
||||
@@ -669,7 +669,6 @@ Function,-,coshl,long double,long double
|
||||
Function,-,cosl,long double,long double
|
||||
Function,+,crc32_calc_buffer,uint32_t,"uint32_t, const void*, size_t"
|
||||
Function,+,crc32_calc_file,uint32_t,"File*, const FileCrcProgressCb, void*"
|
||||
Function,-,crypto1_bit,uint8_t,"Crypto1*, uint8_t, int"
|
||||
Function,-,crypto1_byte,uint8_t,"Crypto1*, uint8_t, int"
|
||||
Function,-,crypto1_decrypt,void,"Crypto1*, uint8_t*, uint16_t, uint8_t*"
|
||||
Function,-,crypto1_encrypt,void,"Crypto1*, uint8_t*, uint8_t*, uint16_t, uint8_t*, uint8_t*"
|
||||
@@ -708,13 +707,13 @@ Function,+,dialog_message_show,DialogMessageButton,"DialogsApp*, const DialogMes
|
||||
Function,+,dialog_message_show_storage_error,void,"DialogsApp*, const char*"
|
||||
Function,-,difftime,double,"time_t, time_t"
|
||||
Function,-,digital_sequence_add,void,"DigitalSequence*, uint8_t"
|
||||
Function,-,digital_sequence_alloc,DigitalSequence*,uint32_t
|
||||
Function,-,digital_sequence_alloc,DigitalSequence*,"uint32_t, const GpioPin*"
|
||||
Function,-,digital_sequence_clear,void,DigitalSequence*
|
||||
Function,-,digital_sequence_free,void,DigitalSequence*
|
||||
Function,-,digital_sequence_send,_Bool,"DigitalSequence*, const GpioPin*"
|
||||
Function,-,digital_sequence_send_signal,_Bool,DigitalSignal*
|
||||
Function,-,digital_sequence_send,_Bool,DigitalSequence*
|
||||
Function,-,digital_sequence_set_signal,void,"DigitalSequence*, uint8_t, DigitalSignal*"
|
||||
Function,-,digital_signal_add,void,"DigitalSignal*, uint32_t"
|
||||
Function,-,digital_signal_add_pulse,void,"DigitalSignal*, uint32_t, _Bool"
|
||||
Function,-,digital_signal_alloc,DigitalSignal*,uint32_t
|
||||
Function,-,digital_signal_append,_Bool,"DigitalSignal*, DigitalSignal*"
|
||||
Function,-,digital_signal_free,void,DigitalSignal*
|
||||
@@ -1166,6 +1165,7 @@ Function,+,furi_hal_nfc_emulate_nfca,_Bool,"uint8_t*, uint8_t, uint8_t*, uint8_t
|
||||
Function,+,furi_hal_nfc_exit_sleep,void,
|
||||
Function,+,furi_hal_nfc_field_off,void,
|
||||
Function,+,furi_hal_nfc_field_on,void,
|
||||
Function,-,furi_hal_nfc_gen_bitstream,void,"FuriHalNfcTxRxContext*, uint8_t*, size_t"
|
||||
Function,-,furi_hal_nfc_init,void,
|
||||
Function,+,furi_hal_nfc_is_busy,_Bool,
|
||||
Function,+,furi_hal_nfc_is_init,_Bool,
|
||||
@@ -1967,6 +1967,11 @@ Function,-,nfca_get_crc16,uint16_t,"uint8_t*, uint16_t"
|
||||
Function,-,nfca_signal_alloc,NfcaSignal*,
|
||||
Function,-,nfca_signal_encode,void,"NfcaSignal*, uint8_t*, uint16_t, uint8_t*"
|
||||
Function,-,nfca_signal_free,void,NfcaSignal*
|
||||
Function,-,nfca_trans_rx_continue,void,NfcaTransRxState*
|
||||
Function,-,nfca_trans_rx_deinit,void,NfcaTransRxState*
|
||||
Function,-,nfca_trans_rx_init,void,NfcaTransRxState*
|
||||
Function,-,nfca_trans_rx_loop,_Bool,"NfcaTransRxState*, uint32_t"
|
||||
Function,-,nfca_trans_rx_pause,void,NfcaTransRxState*
|
||||
Function,-,nfcv_emu_deinit,void,
|
||||
Function,-,nfcv_emu_init,void,"FuriHalNfcDevData*, NfcVData*"
|
||||
Function,-,nfcv_emu_loop,_Bool,"FuriHalNfcDevData*, NfcVData*, uint32_t"
|
||||
|
||||
|
@@ -523,6 +523,7 @@ bool furi_hal_nfc_emulate_nfca(
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool furi_hal_nfc_transparent_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_t timeout_ms) {
|
||||
furi_assert(tx_rx->nfca_signal);
|
||||
|
||||
@@ -536,7 +537,7 @@ static bool furi_hal_nfc_transparent_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_
|
||||
// Send signal
|
||||
FURI_CRITICAL_ENTER();
|
||||
nfca_signal_encode(tx_rx->nfca_signal, tx_rx->tx_data, tx_rx->tx_bits, tx_rx->tx_parity);
|
||||
digital_signal_send(tx_rx->nfca_signal->tx_signal, &gpio_spi_r_mosi);
|
||||
digital_sequence_send(tx_rx->nfca_signal->tx_signal);
|
||||
FURI_CRITICAL_EXIT();
|
||||
|
||||
// Configure gpio back to SPI and exit transparent
|
||||
@@ -601,6 +602,94 @@ static bool furi_hal_nfc_transparent_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool furi_hal_nfc_fully_transparent_raw_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_t timeout_ms) {
|
||||
furi_assert(tx_rx);
|
||||
|
||||
bool received = false;
|
||||
|
||||
tx_rx->rx_bits = 0;
|
||||
|
||||
if(tx_rx->tx_bits) {
|
||||
nfca_trans_rx_pause(&tx_rx->nfca_trans_state);
|
||||
furi_hal_gpio_write(&gpio_spi_r_mosi, false);
|
||||
digital_sequence_send(tx_rx->nfca_signal->tx_signal);
|
||||
furi_hal_gpio_write(&gpio_spi_r_mosi, false);
|
||||
nfca_trans_rx_continue(&tx_rx->nfca_trans_state);
|
||||
|
||||
if(tx_rx->sniff_tx) {
|
||||
tx_rx->sniff_tx(tx_rx->tx_data, tx_rx->tx_bits, false, tx_rx->sniff_context);
|
||||
}
|
||||
}
|
||||
|
||||
if(timeout_ms) {
|
||||
tx_rx->nfca_trans_state.bits_received = 0;
|
||||
received = nfca_trans_rx_loop(&tx_rx->nfca_trans_state, timeout_ms);
|
||||
|
||||
if(received) {
|
||||
if(tx_rx->nfca_trans_state.bits_received > 7) {
|
||||
tx_rx->rx_bits = tx_rx->nfca_trans_state.bits_received/9 * 8;
|
||||
for(size_t pos = 0; pos < tx_rx->rx_bits/8; pos++) {
|
||||
tx_rx->rx_data[pos] = tx_rx->nfca_trans_state.frame_data[pos];
|
||||
}
|
||||
} else {
|
||||
tx_rx->rx_bits = tx_rx->nfca_trans_state.bits_received;
|
||||
tx_rx->rx_data[0] = tx_rx->nfca_trans_state.frame_data[0] & ~(0xFF << tx_rx->rx_bits);
|
||||
}
|
||||
|
||||
if(tx_rx->sniff_rx) {
|
||||
tx_rx->sniff_rx(tx_rx->rx_data, tx_rx->rx_bits, false, tx_rx->sniff_context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return received;
|
||||
}
|
||||
|
||||
static bool furi_hal_nfc_fully_transparent_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_t timeout_ms) {
|
||||
furi_assert(tx_rx);
|
||||
|
||||
bool received = false;
|
||||
|
||||
tx_rx->rx_bits = 0;
|
||||
|
||||
if(tx_rx->tx_bits) {
|
||||
nfca_trans_rx_pause(&tx_rx->nfca_trans_state);
|
||||
FURI_CRITICAL_ENTER();
|
||||
furi_hal_gpio_write(&gpio_spi_r_mosi, false);
|
||||
nfca_signal_encode(tx_rx->nfca_signal, tx_rx->tx_data, tx_rx->tx_bits, tx_rx->tx_parity);
|
||||
digital_sequence_send(tx_rx->nfca_signal->tx_signal);
|
||||
furi_hal_gpio_write(&gpio_spi_r_mosi, false);
|
||||
FURI_CRITICAL_EXIT();
|
||||
nfca_trans_rx_continue(&tx_rx->nfca_trans_state);
|
||||
|
||||
if(tx_rx->sniff_tx) {
|
||||
tx_rx->sniff_tx(tx_rx->tx_data, tx_rx->tx_bits, false, tx_rx->sniff_context);
|
||||
}
|
||||
}
|
||||
|
||||
if(timeout_ms) {
|
||||
tx_rx->nfca_trans_state.bits_received = 0;
|
||||
received = nfca_trans_rx_loop(&tx_rx->nfca_trans_state, timeout_ms);
|
||||
|
||||
if(received) {
|
||||
if(tx_rx->nfca_trans_state.bits_received > 7) {
|
||||
tx_rx->rx_bits = tx_rx->nfca_trans_state.bits_received/9 * 8;
|
||||
memcpy(tx_rx->rx_data, tx_rx->nfca_trans_state.frame_data, tx_rx->nfca_trans_state.bits_received/9);
|
||||
} else {
|
||||
tx_rx->rx_bits = tx_rx->nfca_trans_state.bits_received;
|
||||
tx_rx->rx_data[0] = tx_rx->nfca_trans_state.frame_data[0] & ~(0xFF << tx_rx->rx_bits);
|
||||
}
|
||||
|
||||
if(tx_rx->sniff_rx) {
|
||||
tx_rx->sniff_rx(tx_rx->rx_data, tx_rx->rx_bits, false, tx_rx->sniff_context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return received;
|
||||
}
|
||||
|
||||
|
||||
static uint32_t furi_hal_nfc_tx_rx_get_flag(FuriHalNfcTxRxType type) {
|
||||
uint32_t flags = 0;
|
||||
|
||||
@@ -674,9 +763,39 @@ uint16_t furi_hal_nfc_bitstream_to_data_and_parity(
|
||||
return curr_byte * 8;
|
||||
}
|
||||
|
||||
static uint8_t furi_hal_nfc_gen_parity(uint8_t value) {
|
||||
value ^= (value >> 4);
|
||||
value ^= (value >> 2);
|
||||
value ^= (value >> 1);
|
||||
|
||||
return (value ^ 1) & 1;
|
||||
}
|
||||
|
||||
void furi_hal_nfc_gen_bitstream(FuriHalNfcTxRxContext* tx_rx, uint8_t *buffer, size_t len) {
|
||||
for(size_t pos = 0; pos < len; pos++) {
|
||||
uint32_t parity_bit_num = pos % 8;
|
||||
uint8_t bit = furi_hal_nfc_gen_parity(buffer[pos]);
|
||||
|
||||
tx_rx->tx_data[pos] = buffer[pos];
|
||||
tx_rx->tx_parity[pos / 8] &= ~(1 << (7 - parity_bit_num));
|
||||
tx_rx->tx_parity[pos / 8] |= bit << (7 - parity_bit_num);
|
||||
}
|
||||
tx_rx->tx_bits = len * 8;
|
||||
}
|
||||
|
||||
bool furi_hal_nfc_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_t timeout_ms) {
|
||||
furi_assert(tx_rx);
|
||||
|
||||
if(tx_rx->tx_rx_type == FuriHalNfcTxRxFullyRawTransparent) {
|
||||
return furi_hal_nfc_fully_transparent_raw_tx_rx(tx_rx, timeout_ms);
|
||||
}
|
||||
if(tx_rx->tx_rx_type == FuriHalNfcTxRxFullyTransparent) {
|
||||
return furi_hal_nfc_fully_transparent_tx_rx(tx_rx, timeout_ms);
|
||||
}
|
||||
if(tx_rx->tx_rx_type == FuriHalNfcTxRxTransparent) {
|
||||
return furi_hal_nfc_transparent_tx_rx(tx_rx, timeout_ms);
|
||||
}
|
||||
|
||||
ReturnCode ret;
|
||||
rfalNfcState state = RFAL_NFC_STATE_ACTIVATED;
|
||||
uint8_t temp_tx_buff[FURI_HAL_NFC_DATA_BUFF_SIZE] = {};
|
||||
@@ -684,9 +803,7 @@ bool furi_hal_nfc_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_t timeout_ms) {
|
||||
uint8_t* temp_rx_buff = NULL;
|
||||
uint16_t* temp_rx_bits = NULL;
|
||||
|
||||
if(tx_rx->tx_rx_type == FuriHalNfcTxRxTransparent) {
|
||||
return furi_hal_nfc_transparent_tx_rx(tx_rx, timeout_ms);
|
||||
}
|
||||
//FURI_LOG_D(TAG, "furi_hal_nfc_tx_rx %u", tx_rx->tx_rx_type);
|
||||
|
||||
// Prepare data for FIFO if necessary
|
||||
uint32_t flags = furi_hal_nfc_tx_rx_get_flag(tx_rx->tx_rx_type);
|
||||
|
||||
Reference in New Issue
Block a user