Skip to content

Commit d84592f

Browse files
NFC: add specific FeliCa type read option
1 parent eaa2dea commit d84592f

17 files changed

+3005
-3398
lines changed

applications/main/nfc/nfc_cli.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,17 @@ static void nfc_cli_emulate(Cli* cli, FuriString* args) {
7474
FuriHalNfcDevData params = {
7575
.uid = {0x36, 0x9C, 0xe7, 0xb1, 0x0A, 0xC1, 0x34},
7676
.uid_len = 7,
77-
.a_data = {
78-
.atqa = {0x44, 0x00},
79-
.sak = 0x00,
80-
},
77+
.a_data =
78+
{
79+
.atqa = {0x44, 0x00},
80+
.sak = 0x00,
81+
},
8182
.type = FuriHalNfcTypeA,
8283
};
8384

8485
while(!cli_cmd_interrupt_received(cli)) {
85-
if(furi_hal_nfc_listen(params.uid, params.uid_len, params.a_data.atqa, params.a_data.sak, false, 100)) {
86+
if(furi_hal_nfc_listen(
87+
params.uid, params.uid_len, params.a_data.atqa, params.a_data.sak, false, 100)) {
8688
printf("Reader detected\r\n");
8789
furi_hal_nfc_sleep();
8890
}

applications/main/nfc/scenes/nfc_scene_felica_read_success.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ void nfc_scene_felica_read_success_on_enter(void* context) {
2929

3030
FelicaSystem* current_system = felica_data->systems;
3131
while(current_system) {
32-
furi_string_cat_printf(temp_str, "\nSystem %04X (#%d):", current_system->code, current_system->number);
32+
furi_string_cat_printf(
33+
temp_str, "\nSystem %04X (#%d):", current_system->code, current_system->number);
3334
furi_string_cat_printf(temp_str, "\nIDm:\n ");
3435
for(size_t i = 0; i < 8; i++) {
3536
furi_string_cat_printf(temp_str, "%02X", current_system->idm[i]);

applications/main/nfc/scenes/nfc_scene_nfc_data_info.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ void nfc_scene_nfc_data_info_on_enter(void* context) {
5151
for(size_t i = 0; i < nfc_data->uid_len; i++) {
5252
furi_string_cat_printf(temp_str, " %02X", nfc_data->uid[i]);
5353
}
54-
furi_string_cat_printf(temp_str, "\nATQA: %02X %02X ", nfc_data->a_data.atqa[1], nfc_data->a_data.atqa[0]);
54+
furi_string_cat_printf(
55+
temp_str, "\nATQA: %02X %02X ", nfc_data->a_data.atqa[1], nfc_data->a_data.atqa[0]);
5556
furi_string_cat_printf(temp_str, " SAK: %02X", nfc_data->a_data.sak);
5657

5758
// Set application specific data

applications/main/nfc/scenes/nfc_scene_nfca_read_success.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ void nfc_scene_nfca_read_success_on_enter(void* context) {
3030
for(size_t i = 0; i < data->uid_len; i++) {
3131
furi_string_cat_printf(temp_str, " %02X", data->uid[i]);
3232
}
33-
furi_string_cat_printf(temp_str, "\nATQA: %02X %02X ", data->a_data.atqa[1], data->a_data.atqa[0]);
33+
furi_string_cat_printf(
34+
temp_str, "\nATQA: %02X %02X ", data->a_data.atqa[1], data->a_data.atqa[0]);
3435
furi_string_cat_printf(temp_str, " SAK: %02X", data->a_data.sak);
3536

3637
widget_add_text_scroll_element(widget, 0, 0, 128, 52, furi_string_get_cstr(temp_str));

applications/main/nfc/scenes/nfc_scene_read_card_type.c

+12
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ enum SubmenuIndex {
77
SubmenuIndexReadMfUltralight,
88
SubmenuIndexReadEMV,
99
SubmenuIndexReadNFCA,
10+
SubmenuIndexReadFelica,
1011
};
1112

1213
void nfc_scene_read_card_type_submenu_callback(void* context, uint32_t index) {
@@ -49,6 +50,12 @@ void nfc_scene_read_card_type_on_enter(void* context) {
4950
SubmenuIndexReadNFCA,
5051
nfc_scene_read_card_type_submenu_callback,
5152
nfc);
53+
submenu_add_item(
54+
submenu,
55+
"Read FeliCa",
56+
SubmenuIndexReadFelica,
57+
nfc_scene_read_card_type_submenu_callback,
58+
nfc);
5259
uint32_t state = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneReadCardType);
5360
submenu_set_selected_item(submenu, state);
5461

@@ -85,6 +92,11 @@ bool nfc_scene_read_card_type_on_event(void* context, SceneManagerEvent event) {
8592
scene_manager_next_scene(nfc->scene_manager, NfcSceneRead);
8693
consumed = true;
8794
}
95+
if(event.event == SubmenuIndexReadFelica) {
96+
nfc->dev->dev_data.read_mode = NfcReadModeFelica;
97+
scene_manager_next_scene(nfc->scene_manager, NfcSceneRead);
98+
consumed = true;
99+
}
88100
scene_manager_set_scene_state(nfc->scene_manager, NfcSceneReadCardType, event.event);
89101
}
90102
return consumed;

firmware/targets/f7/api_symbols.csv

+2,780-3,201
Large diffs are not rendered by default.

lib/nfc/helpers/reader_analyzer.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,7 @@ const FuriHalNfcDevData reader_analyzer_nfc_data[] = {
4343
.type = FuriHalNfcTypeA,
4444
.uid_len = 7,
4545
.uid = {0x04, 0x77, 0x70, 0x2A, 0x23, 0x4F, 0x80},
46-
.a_data = {
47-
.sak = 0x08,
48-
.atqa = {0x44, 0x00},
49-
.cuid = 0x2A234F80}},
46+
.a_data = {.sak = 0x08, .atqa = {0x44, 0x00}, .cuid = 0x2A234F80}},
5047
};
5148

5249
void reader_analyzer_parse(ReaderAnalyzer* instance, uint8_t* buffer, size_t size) {

lib/nfc/nfc_device.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1127,7 +1127,7 @@ static bool nfc_device_load_data(NfcDevice* dev, FuriString* path, bool show_dia
11271127
cuid_start = &data->uid[3];
11281128
}
11291129
data->a_data.cuid = (cuid_start[0] << 24) | (cuid_start[1] << 16) | (cuid_start[2] << 8) |
1130-
(cuid_start[3]);
1130+
(cuid_start[3]);
11311131
// Parse other data
11321132
if(dev->format == NfcDeviceSaveFormatMifareUl) {
11331133
if(!nfc_device_load_mifare_ul_data(file, dev)) break;

lib/nfc/nfc_device.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ typedef enum {
6161
NfcReadModeMfDesfire,
6262
NfcReadModeEMV,
6363
NfcReadModeNFCA,
64-
NfcReadModeNFCF,
64+
NfcReadModeFelica,
6565
} NfcReadMode;
6666

6767
typedef struct {

lib/nfc/nfc_worker.c

+11
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,17 @@ void nfc_worker_read_type(NfcWorker* nfc_worker) {
499499
event = NfcWorkerEventReadUidNfcA;
500500
break;
501501
}
502+
} else if(nfc_data->type == FuriHalNfcTypeF) {
503+
if(read_mode == NfcReadModeFelica) {
504+
nfc_worker->dev_data->protocol = NfcDeviceProtocolFelica;
505+
if(nfc_worker_read_felica(nfc_worker, &tx_rx)) {
506+
nfc_worker->dev_data->protocol = NfcDeviceProtocolFelica;
507+
if(nfc_worker_read_felica(nfc_worker, &tx_rx)) {
508+
event = NfcWorkerEventReadFelica;
509+
break;
510+
}
511+
}
512+
}
502513
} else {
503514
if(!card_not_detected_notified) {
504515
nfc_worker->callback(NfcWorkerEventNoCardDetected, nfc_worker->context);

lib/nfc/parsers/plantain_4k_parser.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ bool plantain_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx
7171

7272
MfClassicReader reader = {};
7373
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
74-
reader.type = mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
74+
reader.type =
75+
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
7576
for(size_t i = 0; i < COUNT_OF(plantain_keys_4k); i++) {
7677
mf_classic_reader_add_sector(
7778
&reader,

lib/nfc/parsers/plantain_parser.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ bool plantain_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {
4646

4747
MfClassicReader reader = {};
4848
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
49-
reader.type = mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
49+
reader.type =
50+
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
5051
for(size_t i = 0; i < COUNT_OF(plantain_keys); i++) {
5152
mf_classic_reader_add_sector(
5253
&reader, plantain_keys[i].sector, plantain_keys[i].key_a, plantain_keys[i].key_b);

lib/nfc/parsers/troika_4k_parser.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ bool troika_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx)
6868

6969
MfClassicReader reader = {};
7070
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
71-
reader.type = mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
71+
reader.type =
72+
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
7273
for(size_t i = 0; i < COUNT_OF(troika_4k_keys); i++) {
7374
mf_classic_reader_add_sector(
7475
&reader, troika_4k_keys[i].sector, troika_4k_keys[i].key_a, troika_4k_keys[i].key_b);

lib/nfc/parsers/troika_parser.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ bool troika_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {
4444

4545
MfClassicReader reader = {};
4646
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
47-
reader.type = mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
47+
reader.type =
48+
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
4849

4950
for(size_t i = 0; i < COUNT_OF(troika_keys); i++) {
5051
mf_classic_reader_add_sector(

lib/nfc/parsers/two_cities.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ bool two_cities_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx)
7272

7373
MfClassicReader reader = {};
7474
FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data;
75-
reader.type = mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
75+
reader.type =
76+
mf_classic_get_classic_type(nfc_a_data->atqa[0], nfc_a_data->atqa[1], nfc_a_data->sak);
7677
for(size_t i = 0; i < COUNT_OF(two_cities_keys_4k); i++) {
7778
mf_classic_reader_add_sector(
7879
&reader,

0 commit comments

Comments
 (0)