Merge branch 'pr/446' into 420

This commit is contained in:
RogueMaster
2022-11-25 01:40:03 -05:00
40 changed files with 3617 additions and 184 deletions

View File

@@ -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
1 entry status name type params
688 Function - cosl long double long double
689 Function + crc32_calc_buffer uint32_t uint32_t, const void*, size_t
690 Function + crc32_calc_file uint32_t File*, const FileCrcProgressCb, void*
Function - crypto1_bit uint8_t Crypto1*, uint8_t, int
691 Function - crypto1_byte uint8_t Crypto1*, uint8_t, int
692 Function - crypto1_decrypt void Crypto1*, uint8_t*, uint16_t, uint8_t*
693 Function - crypto1_encrypt void Crypto1*, uint8_t*, uint8_t*, uint16_t, uint8_t*, uint8_t*
725 Function + dialog_message_show DialogMessageButton DialogsApp*, const DialogMessage*
726 Function + dialog_message_show_storage_error void DialogsApp*, const char*
727 Function - difftime double time_t, time_t
728 Function - digital_sequence_add void DigitalSequence*, uint8_t
729 Function - digital_sequence_alloc DigitalSequence* uint32_t, const GpioPin*
730 Function - digital_sequence_clear void DigitalSequence*
731 Function - digital_sequence_free void DigitalSequence*
732 Function - digital_sequence_send _Bool DigitalSequence*
733 Function - digital_sequence_set_signal void DigitalSequence*, uint8_t, DigitalSignal*
734 Function - digital_signal_add void DigitalSignal*, uint32_t
735 Function - digital_signal_add_pulse void DigitalSignal*, uint32_t, _Bool
736 Function - digital_signal_alloc DigitalSignal* uint32_t
737 Function - digital_signal_append _Bool DigitalSignal*, DigitalSignal*
738 Function - digital_signal_free void DigitalSignal*
739 Function - digital_signal_get_edge uint32_t DigitalSignal*, uint32_t
740 Function - digital_signal_get_edges_cnt uint32_t DigitalSignal*
741 Function - digital_signal_get_start_level _Bool DigitalSignal*
742 Function - digital_signal_prepare_arr digital_signal_prepare void DigitalSignal*
743 Function - digital_signal_send void DigitalSignal*, const GpioPin*
744 Function - diprintf int int, const char*, ...
745 Function + dir_walk_alloc DirWalk* Storage*
1185 Function + furi_hal_nfc_exit_sleep void
1186 Function + furi_hal_nfc_field_off void
1187 Function + furi_hal_nfc_field_on void
1188 Function - furi_hal_nfc_gen_bitstream void FuriHalNfcTxRxContext*, uint8_t*, size_t
1189 Function - furi_hal_nfc_init void
1190 Function + furi_hal_nfc_is_busy _Bool
1191 Function + furi_hal_nfc_is_init _Bool
1209 Function + furi_hal_nfc_stop_cmd void
1210 Function + furi_hal_nfc_tx_rx _Bool FuriHalNfcTxRxContext*, uint16_t
1211 Function + furi_hal_nfc_tx_rx_full _Bool FuriHalNfcTxRxContext*
1212 Function - furi_hal_nfcv_listen_start void
1213 Function - furi_hal_os_init void
1214 Function + furi_hal_os_tick void
1215 Function + furi_hal_power_check_otg_status void
2016 Function + nfc_device_set_loading_callback void NfcDevice*, NfcLoadingCallback, void*
2017 Function + nfc_device_set_name void NfcDevice*, const char*
2018 Function + nfc_file_select _Bool NfcDevice*
2019 Function - nfc_util_bytes2num uint64_t uint8_t*, uint8_t
2020 Function - nfc_util_even_parity32 uint8_t uint32_t
2021 Function - nfc_util_num2bytes void uint64_t, uint8_t, uint8_t*
2022 Function - nfc_util_odd_parity8 uint8_t uint8_t
2023 Function - nfca_append_crc16 void uint8_t*, uint16_t
2024 Function - nfca_emulation_handler _Bool uint8_t*, uint16_t, uint8_t*, uint16_t*
2025 Function - nfca_get_crc16 uint16_t uint8_t*, uint16_t
2026 Function - nfca_signal_alloc NfcaSignal*
2027 Function - nfca_signal_encode void NfcaSignal*, uint8_t*, uint16_t, uint8_t*
2028 Function - nfca_signal_free void NfcaSignal*
2029 Function - nfca_trans_rx_continue void NfcaTransRxState*
2030 Function - nfca_trans_rx_deinit void NfcaTransRxState*
2031 Function - nfca_trans_rx_init void NfcaTransRxState*
2032 Function - nfca_trans_rx_loop _Bool NfcaTransRxState*, uint32_t
2033 Function - nfca_trans_rx_pause void NfcaTransRxState*
2034 Function - nfcv_emu_deinit void
2035 Function - nfcv_emu_init void FuriHalNfcDevData*, NfcVData*
2036 Function - nfcv_emu_loop _Bool FuriHalNfcDevData*, NfcVData*, uint32_t
2037 Function - nfcv_inventory ReturnCode uint8_t*
2038 Function - nfcv_read_blocks ReturnCode NfcVReader*, NfcVData*
2039 Function - nfcv_read_card _Bool NfcVReader*, FuriHalNfcDevData*, NfcVData*
2040 Function - nfcv_read_sysinfo ReturnCode FuriHalNfcDevData*, NfcVData*
2041 Function + notification_internal_message void NotificationApp*, const NotificationSequence*
2042 Function + notification_internal_message_block void NotificationApp*, const NotificationSequence*
2043 Function + notification_message void NotificationApp*, const NotificationSequence*
2139 Function + protocol_dict_render_data void ProtocolDict*, FuriString*, size_t
2140 Function + protocol_dict_set_data void ProtocolDict*, size_t, const uint8_t*, size_t
2141 Function - pselect int int, fd_set*, fd_set*, fd_set*, const timespec*, const sigset_t*
2142 Function - pulse_reader_alloc PulseReader* const GpioPin*, uint32_t
2143 Function - pulse_reader_free void PulseReader*
2144 Function - pulse_reader_receive uint32_t PulseReader*, int
2145 Function - pulse_reader_samples uint32_t PulseReader*
2146 Function - pulse_reader_set_bittime void PulseReader*, uint32_t
2147 Function - pulse_reader_set_timebase void PulseReader*, PulseReaderUnit
2148 Function - pulse_reader_start void PulseReader*
2149 Function - pulse_reader_stop void PulseReader*
2150 Function - putc int int, FILE*
2151 Function - putc_unlocked int int, FILE*
2152 Function - putchar int int

View File

@@ -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);