From 7be6dbd0c012afb2ce8ddbb03df4af45688c1dd3 Mon Sep 17 00:00:00 2001 From: whowechina Date: Sun, 21 Jan 2024 12:59:47 +0800 Subject: [PATCH] Optimization on nfc part --- Production/Firmware/aic_pico.uf2 | Bin 120832 -> 120832 bytes firmware/src/aime.c | 4 ++-- firmware/src/commands.c | 38 ++++++++----------------------- firmware/src/main.c | 10 +++----- firmware/src/nfc.c | 28 ++++++++++++++++++++++- firmware/src/nfc.h | 6 ++++- firmware/src/pn5180.c | 4 +++- 7 files changed, 49 insertions(+), 41 deletions(-) diff --git a/Production/Firmware/aic_pico.uf2 b/Production/Firmware/aic_pico.uf2 index b95e0ce91af145f21ddb579cd18b1a8413890a5d..fc87b7bb11cefcbeb1773e936b011d303419da0a 100644 GIT binary patch delta 15077 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.rgb ? "ON" : "OFF", @@ -53,32 +54,11 @@ static void handle_factory_reset() static void handle_nfc() { - bool ret; - -// ret = pn532_config_rf(); -// printf("RF: %d\n", ret); - - ret = pn532_config_sam(); - printf("Sam: %d\n", ret); - - uint8_t buf[32]; - int len = sizeof(buf); - - ret = pn532_poll_mifare(buf, &len); - printf("Mifare: %d -", len); - - if (ret) { - for (int i = 0; i < len; i++) { - printf(" %02x", buf[i]); - } - } - printf("\n"); - - printf("Felica: "); - if (pn532_poll_felica(buf, buf + 8, buf + 16, false)) { - for (int i = 0; i < 18; i++) { - printf(" %02x%s", buf[i], (i % 8 == 7) ? "," : ""); - } + printf("NFC module: %s\n", nfc_module_name()); + nfc_card_t card = nfc_detect_card(); + printf("Card %s:", nfc_card_name(card.card_type)); + for (int i = 0; i < card.len; i++) { + printf(" %02x", card.uid[i]); } printf("\n"); } @@ -152,7 +132,7 @@ void commands_init() cli_register("display", handle_display, "Display all settings."); cli_register("save", handle_save, "Save config to flash."); cli_register("factory", handle_factory_reset, "Reset everything to default."); - cli_register("nfc", handle_nfc, "NFC debug."); + cli_register("nfc", handle_nfc, "NFC module."); cli_register("light", handle_light, "Turn on/off lights."); cli_register("level", handle_level, "Set light level."); } diff --git a/firmware/src/main.c b/firmware/src/main.c index 4baaec9..2b0bc56 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -130,10 +130,7 @@ void detect_card() break; case NFC_CARD_VICINITY: hid_cardio.current[0] = REPORT_ID_EAMU; - // 15693 cards store uid in reverse byte order - for (int i = 0; i < 8; i++) { - hid_cardio.current[i + 1] = card.uid[7 - i]; - } + memcpy(hid_cardio.current + 1, card.uid, 8); break; default: memset(hid_cardio.current, 0, 9); @@ -142,9 +139,8 @@ void detect_card() return; } - if (card.card_type != NFC_CARD_NULL) { - const char *card_type_str[3] = { "MIFARE", "FeliCa", "15693" }; - printf("\n%s:", card_type_str[card.card_type - 1]); + if (card.card_type != NFC_CARD_NONE) { + printf("\n%s:", nfc_card_name(card.card_type)); for (int i = 0; i < card.len; i++) { printf(" %02x", hid_cardio.current[i + 1]); } diff --git a/firmware/src/nfc.c b/firmware/src/nfc.c index 11819f8..d457ab5 100644 --- a/firmware/src/nfc.c +++ b/firmware/src/nfc.c @@ -21,6 +21,32 @@ static enum { NFC_MODULE_UNKNOWN, } nfc_module = NFC_MODULE_UNKNOWN; +static const char *nfc_module_names[] = { + "PN532", + "PN5180", + "Unknown", +}; + +const char *nfc_module_name() +{ + return nfc_module_names[nfc_module]; +} + +static const char *nfc_card_names[] = { + "None", + "MIFARE", + "FeliCa", + "15693" +}; + +const char *nfc_card_name(nfc_card_type card_type) +{ + if (card_type >= sizeof(nfc_card_names) / sizeof(nfc_card_names[0])) { + return "Unknown"; + } + return nfc_card_names[card_type]; +} + static bool null_poll_mifare(uint8_t uid[7], int *len) { return false; @@ -121,7 +147,7 @@ nfc_card_t nfc_detect_card() if (!nfc_detect_mifare(&card) && !nfc_detect_felica(&card) && !nfc_detect_vicinity(&card)) { - card.card_type = NFC_CARD_NULL; + card.card_type = NFC_CARD_NONE; } return card; diff --git a/firmware/src/nfc.h b/firmware/src/nfc.h index d0255d3..e5f6acd 100644 --- a/firmware/src/nfc.h +++ b/firmware/src/nfc.h @@ -10,12 +10,14 @@ #include "hardware/i2c.h" typedef enum { - NFC_CARD_NULL = 0, + NFC_CARD_NONE = 0, NFC_CARD_MIFARE, NFC_CARD_FELICA, NFC_CARD_VICINITY, } nfc_card_type; +const char *nfc_card_name(nfc_card_type card_type); + typedef void (*nfc_wait_loop_t)(); typedef struct { nfc_card_type card_type; @@ -31,6 +33,8 @@ typedef struct { void nfc_init(nfc_wait_loop_t loop); nfc_card_t nfc_detect_card(); +const char *nfc_module_name(); + bool nfc_mifare_auth(const uint8_t uid[4], uint8_t block_id, uint8_t key_id, const uint8_t *key); bool nfc_mifare_read(uint8_t block_id, uint8_t block_data[16]); diff --git a/firmware/src/pn5180.c b/firmware/src/pn5180.c index c5f25d7..8247e81 100644 --- a/firmware/src/pn5180.c +++ b/firmware/src/pn5180.c @@ -361,7 +361,9 @@ bool pn5180_poll_vicinity(uint8_t uid[8]) if (len == 10) { uint8_t id[10]; pn5180_read_data(id, len); - memmove(uid, id + 2, 8); + for (int i = 0; i < 8; i++) { + uid[i] = id[9 - i]; // 15693 stores id in reversed byte order + } result = true; }