Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgornekich <n.gorbadey@gmail.com>2021-12-21 15:33:17 +0300
committerGitHub <noreply@github.com>2021-12-21 15:33:17 +0300
commitb0f582df9950c2a1a18c4f3b8a9a4fe4da4a3613 (patch)
treebc4e9396140202df0bb8642291532e27ab4bff9e /firmware
parent439fb9c18dde63e3b4420e618978226ab50e75ff (diff)
[FL-1972], [FL-1920] Mifare Ultralight and NTAG separation (#918)
* nfc: rename read mifare ultralight menu * nfc: separate ntag and mifare ultralight * nfc: save Mifare Ultralight type * nfc: add valid ack and nack messages * nfc: add compatible write command implementation * nfc: support f6 target
Diffstat (limited to 'firmware')
-rw-r--r--firmware/targets/f6/furi-hal/furi-hal-nfc.c39
-rw-r--r--firmware/targets/f7/furi-hal/furi-hal-nfc.c39
-rw-r--r--firmware/targets/furi-hal-include/furi-hal-nfc.h2
3 files changed, 76 insertions, 4 deletions
diff --git a/firmware/targets/f6/furi-hal/furi-hal-nfc.c b/firmware/targets/f6/furi-hal/furi-hal-nfc.c
index dbe5579c..ee1138d8 100644
--- a/firmware/targets/f6/furi-hal/furi-hal-nfc.c
+++ b/firmware/targets/f6/furi-hal/furi-hal-nfc.c
@@ -131,7 +131,7 @@ bool furi_hal_nfc_listen(uint8_t* uid, uint8_t uid_len, uint8_t* atqa, uint8_t s
}
bool furi_hal_nfc_get_first_frame(uint8_t** rx_buff, uint16_t** rx_len) {
- ReturnCode ret = rfalNfcDataExchangeStart(NULL, 0, rx_buff, rx_len, 0);
+ ReturnCode ret = rfalNfcDataExchangeStart(NULL, 0, rx_buff, rx_len, 0, RFAL_TXRX_FLAGS_DEFAULT);
return ret == ERR_NONE;
}
@@ -141,7 +141,42 @@ ReturnCode furi_hal_nfc_data_exchange(uint8_t* tx_buff, uint16_t tx_len, uint8_t
ReturnCode ret;
rfalNfcState state = RFAL_NFC_STATE_ACTIVATED;
- ret = rfalNfcDataExchangeStart(tx_buff, tx_len, rx_buff, rx_len, 0);
+ ret = rfalNfcDataExchangeStart(tx_buff, tx_len, rx_buff, rx_len, 0, RFAL_TXRX_FLAGS_DEFAULT);
+ if(ret != ERR_NONE) {
+ return ret;
+ }
+ uint32_t start = DWT->CYCCNT;
+ while(state != RFAL_NFC_STATE_DATAEXCHANGE_DONE) {
+ rfalNfcWorker();
+ state = rfalNfcGetState();
+ ret = rfalNfcDataExchangeGetStatus();
+ if(ret > ERR_SLEEP_REQ) {
+ return ret;
+ }
+ if(ret == ERR_BUSY) {
+ if(DWT->CYCCNT - start > 1000 * clocks_in_ms) {
+ return ERR_TIMEOUT;
+ }
+ continue;
+ } else {
+ start = DWT->CYCCNT;
+ }
+ taskYIELD();
+ }
+ if(deactivate) {
+ rfalNfcDeactivate(false);
+ rfalLowPowerModeStart();
+ }
+ return ERR_NONE;
+}
+
+ReturnCode furi_hal_nfc_raw_bitstream_exchange(uint8_t* tx_buff, uint16_t tx_bit_len, uint8_t** rx_buff, uint16_t** rx_bit_len, bool deactivate) {
+ furi_assert(rx_buff);
+ furi_assert(rx_bit_len);
+
+ ReturnCode ret;
+ rfalNfcState state = RFAL_NFC_STATE_ACTIVATED;
+ ret = rfalNfcDataExchangeStart(tx_buff, tx_bit_len, rx_buff, rx_bit_len, 0, RFAL_TXRX_FLAGS_RAW);
if(ret != ERR_NONE) {
return ret;
}
diff --git a/firmware/targets/f7/furi-hal/furi-hal-nfc.c b/firmware/targets/f7/furi-hal/furi-hal-nfc.c
index dbe5579c..ee1138d8 100644
--- a/firmware/targets/f7/furi-hal/furi-hal-nfc.c
+++ b/firmware/targets/f7/furi-hal/furi-hal-nfc.c
@@ -131,7 +131,7 @@ bool furi_hal_nfc_listen(uint8_t* uid, uint8_t uid_len, uint8_t* atqa, uint8_t s
}
bool furi_hal_nfc_get_first_frame(uint8_t** rx_buff, uint16_t** rx_len) {
- ReturnCode ret = rfalNfcDataExchangeStart(NULL, 0, rx_buff, rx_len, 0);
+ ReturnCode ret = rfalNfcDataExchangeStart(NULL, 0, rx_buff, rx_len, 0, RFAL_TXRX_FLAGS_DEFAULT);
return ret == ERR_NONE;
}
@@ -141,7 +141,42 @@ ReturnCode furi_hal_nfc_data_exchange(uint8_t* tx_buff, uint16_t tx_len, uint8_t
ReturnCode ret;
rfalNfcState state = RFAL_NFC_STATE_ACTIVATED;
- ret = rfalNfcDataExchangeStart(tx_buff, tx_len, rx_buff, rx_len, 0);
+ ret = rfalNfcDataExchangeStart(tx_buff, tx_len, rx_buff, rx_len, 0, RFAL_TXRX_FLAGS_DEFAULT);
+ if(ret != ERR_NONE) {
+ return ret;
+ }
+ uint32_t start = DWT->CYCCNT;
+ while(state != RFAL_NFC_STATE_DATAEXCHANGE_DONE) {
+ rfalNfcWorker();
+ state = rfalNfcGetState();
+ ret = rfalNfcDataExchangeGetStatus();
+ if(ret > ERR_SLEEP_REQ) {
+ return ret;
+ }
+ if(ret == ERR_BUSY) {
+ if(DWT->CYCCNT - start > 1000 * clocks_in_ms) {
+ return ERR_TIMEOUT;
+ }
+ continue;
+ } else {
+ start = DWT->CYCCNT;
+ }
+ taskYIELD();
+ }
+ if(deactivate) {
+ rfalNfcDeactivate(false);
+ rfalLowPowerModeStart();
+ }
+ return ERR_NONE;
+}
+
+ReturnCode furi_hal_nfc_raw_bitstream_exchange(uint8_t* tx_buff, uint16_t tx_bit_len, uint8_t** rx_buff, uint16_t** rx_bit_len, bool deactivate) {
+ furi_assert(rx_buff);
+ furi_assert(rx_bit_len);
+
+ ReturnCode ret;
+ rfalNfcState state = RFAL_NFC_STATE_ACTIVATED;
+ ret = rfalNfcDataExchangeStart(tx_buff, tx_bit_len, rx_buff, rx_bit_len, 0, RFAL_TXRX_FLAGS_RAW);
if(ret != ERR_NONE) {
return ret;
}
diff --git a/firmware/targets/furi-hal-include/furi-hal-nfc.h b/firmware/targets/furi-hal-include/furi-hal-nfc.h
index c05b4df9..babc7b18 100644
--- a/firmware/targets/furi-hal-include/furi-hal-nfc.h
+++ b/firmware/targets/furi-hal-include/furi-hal-nfc.h
@@ -87,6 +87,8 @@ bool furi_hal_nfc_get_first_frame(uint8_t** rx_buff, uint16_t** rx_len);
*/
ReturnCode furi_hal_nfc_data_exchange(uint8_t* tx_buff, uint16_t tx_len, uint8_t** rx_buff, uint16_t** rx_len, bool deactivate);
+ReturnCode furi_hal_nfc_raw_bitstream_exchange(uint8_t* tx_buff, uint16_t tx_bit_len, uint8_t** rx_buff, uint16_t** rx_bit_len, bool deactivate);
+
/** NFC deactivate and start sleep
*/
void furi_hal_nfc_deactivate();