mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-10 05:59:08 -07:00
Merge branch 'pr/446' into 420
This commit is contained in:
@@ -688,7 +688,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*"
|
||||
@@ -726,13 +725,21 @@ Function,+,dialog_message_set_text,void,"DialogMessage*, const char*, uint8_t, u
|
||||
Function,+,dialog_message_show,DialogMessageButton,"DialogsApp*, const DialogMessage*"
|
||||
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, const GpioPin*"
|
||||
Function,-,digital_sequence_clear,void,DigitalSequence*
|
||||
Function,-,digital_sequence_free,void,DigitalSequence*
|
||||
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*
|
||||
Function,-,digital_signal_get_edge,uint32_t,"DigitalSignal*, uint32_t"
|
||||
Function,-,digital_signal_get_edges_cnt,uint32_t,DigitalSignal*
|
||||
Function,-,digital_signal_get_start_level,_Bool,DigitalSignal*
|
||||
Function,-,digital_signal_prepare_arr,void,DigitalSignal*
|
||||
Function,-,digital_signal_prepare,void,DigitalSignal*
|
||||
Function,-,digital_signal_send,void,"DigitalSignal*, const GpioPin*"
|
||||
Function,-,diprintf,int,"int, const char*, ..."
|
||||
Function,+,dir_walk_alloc,DirWalk*,Storage*
|
||||
@@ -1178,6 +1185,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,
|
||||
@@ -1201,6 +1209,7 @@ Function,+,furi_hal_nfc_stop,void,
|
||||
Function,+,furi_hal_nfc_stop_cmd,void,
|
||||
Function,+,furi_hal_nfc_tx_rx,_Bool,"FuriHalNfcTxRxContext*, uint16_t"
|
||||
Function,+,furi_hal_nfc_tx_rx_full,_Bool,FuriHalNfcTxRxContext*
|
||||
Function,-,furi_hal_nfcv_listen_start,void,
|
||||
Function,-,furi_hal_os_init,void,
|
||||
Function,+,furi_hal_os_tick,void,
|
||||
Function,+,furi_hal_power_check_otg_status,void,
|
||||
@@ -2007,12 +2016,28 @@ Function,+,nfc_device_save_shadow,_Bool,"NfcDevice*, const char*"
|
||||
Function,+,nfc_device_set_loading_callback,void,"NfcDevice*, NfcLoadingCallback, void*"
|
||||
Function,+,nfc_device_set_name,void,"NfcDevice*, const char*"
|
||||
Function,+,nfc_file_select,_Bool,NfcDevice*
|
||||
Function,-,nfc_util_bytes2num,uint64_t,"uint8_t*, uint8_t"
|
||||
Function,-,nfc_util_even_parity32,uint8_t,uint32_t
|
||||
Function,-,nfc_util_num2bytes,void,"uint64_t, uint8_t, uint8_t*"
|
||||
Function,-,nfc_util_odd_parity8,uint8_t,uint8_t
|
||||
Function,-,nfca_append_crc16,void,"uint8_t*, uint16_t"
|
||||
Function,-,nfca_emulation_handler,_Bool,"uint8_t*, uint16_t, uint8_t*, uint16_t*"
|
||||
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"
|
||||
Function,-,nfcv_inventory,ReturnCode,uint8_t*
|
||||
Function,-,nfcv_read_blocks,ReturnCode,"NfcVReader*, NfcVData*"
|
||||
Function,-,nfcv_read_card,_Bool,"NfcVReader*, FuriHalNfcDevData*, NfcVData*"
|
||||
Function,-,nfcv_read_sysinfo,ReturnCode,"FuriHalNfcDevData*, NfcVData*"
|
||||
Function,+,notification_internal_message,void,"NotificationApp*, const NotificationSequence*"
|
||||
Function,+,notification_internal_message_block,void,"NotificationApp*, const NotificationSequence*"
|
||||
Function,+,notification_message,void,"NotificationApp*, const NotificationSequence*"
|
||||
@@ -2114,6 +2139,14 @@ Function,+,protocol_dict_render_brief_data,void,"ProtocolDict*, FuriString*, siz
|
||||
Function,+,protocol_dict_render_data,void,"ProtocolDict*, FuriString*, size_t"
|
||||
Function,+,protocol_dict_set_data,void,"ProtocolDict*, size_t, const uint8_t*, size_t"
|
||||
Function,-,pselect,int,"int, fd_set*, fd_set*, fd_set*, const timespec*, const sigset_t*"
|
||||
Function,-,pulse_reader_alloc,PulseReader*,"const GpioPin*, uint32_t"
|
||||
Function,-,pulse_reader_free,void,PulseReader*
|
||||
Function,-,pulse_reader_receive,uint32_t,"PulseReader*, int"
|
||||
Function,-,pulse_reader_samples,uint32_t,PulseReader*
|
||||
Function,-,pulse_reader_set_bittime,void,"PulseReader*, uint32_t"
|
||||
Function,-,pulse_reader_set_timebase,void,"PulseReader*, PulseReaderUnit"
|
||||
Function,-,pulse_reader_start,void,PulseReader*
|
||||
Function,-,pulse_reader_stop,void,PulseReader*
|
||||
Function,-,putc,int,"int, FILE*"
|
||||
Function,-,putc_unlocked,int,"int, FILE*"
|
||||
Function,-,putchar,int,int
|
||||
|
||||
|
@@ -367,6 +367,39 @@ void furi_hal_nfc_listen_start(FuriHalNfcDevData* nfc_data) {
|
||||
st25r3916ExecuteCommand(ST25R3916_CMD_GOTO_SENSE);
|
||||
}
|
||||
|
||||
void furi_hal_nfcv_listen_start() {
|
||||
|
||||
furi_hal_gpio_init(&gpio_nfc_irq_rfid_pull, GpioModeInput, GpioPullDown, GpioSpeedVeryHigh);
|
||||
// Clear interrupts
|
||||
st25r3916ClearInterrupts();
|
||||
// Mask all interrupts
|
||||
st25r3916DisableInterrupts(ST25R3916_IRQ_MASK_ALL);
|
||||
// RESET
|
||||
st25r3916ExecuteCommand(ST25R3916_CMD_STOP);
|
||||
// Setup registers
|
||||
st25r3916WriteRegister(
|
||||
ST25R3916_REG_OP_CONTROL,
|
||||
ST25R3916_REG_OP_CONTROL_en | ST25R3916_REG_OP_CONTROL_rx_en |
|
||||
ST25R3916_REG_OP_CONTROL_en_fd_auto_efd);
|
||||
st25r3916WriteRegister(
|
||||
ST25R3916_REG_MODE,
|
||||
ST25R3916_REG_MODE_targ_targ | ST25R3916_REG_MODE_om3 | ST25R3916_REG_MODE_om0);
|
||||
st25r3916WriteRegister(
|
||||
ST25R3916_REG_PASSIVE_TARGET,
|
||||
ST25R3916_REG_PASSIVE_TARGET_fdel_2 | ST25R3916_REG_PASSIVE_TARGET_fdel_0 |
|
||||
ST25R3916_REG_PASSIVE_TARGET_d_ac_ap2p | ST25R3916_REG_PASSIVE_TARGET_d_212_424_1r);
|
||||
st25r3916WriteRegister(ST25R3916_REG_MASK_RX_TIMER, 0x02);
|
||||
|
||||
// Mask interrupts
|
||||
uint32_t clear_irq_mask =
|
||||
(ST25R3916_IRQ_MASK_RXE | ST25R3916_IRQ_MASK_RXE_PTA | ST25R3916_IRQ_MASK_WU_A_X |
|
||||
ST25R3916_IRQ_MASK_WU_A);
|
||||
st25r3916EnableInterrupts(clear_irq_mask);
|
||||
|
||||
// Go to sense
|
||||
st25r3916ExecuteCommand(ST25R3916_CMD_GOTO_SENSE);
|
||||
}
|
||||
|
||||
void rfal_interrupt_callback_handler() {
|
||||
furi_event_flag_set(event, EVENT_FLAG_INTERRUPT);
|
||||
}
|
||||
@@ -490,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);
|
||||
|
||||
@@ -503,9 +537,8 @@ 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();
|
||||
furi_hal_gpio_write(&gpio_spi_r_mosi, false);
|
||||
|
||||
// Configure gpio back to SPI and exit transparent
|
||||
furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_nfc);
|
||||
@@ -569,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;
|
||||
|
||||
@@ -642,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] = {};
|
||||
@@ -652,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