diff --git a/sam_reader.c b/sam_reader.c index a65b0c8..ecc7128 100644 --- a/sam_reader.c +++ b/sam_reader.c @@ -26,8 +26,8 @@ static const char* seader_reader_cfg_header = "Seader USB Reader"; static const uint32_t seader_reader_cfg_version = 1; /* Grace SAM ATR used only if the live ATR was not captured. */ -static const uint8_t SEADER_READER_FALLBACK_ATR[] = { - 0x3b, 0x95, 0x96, 0x80, 0xb1, 0xfe, 0x55, 0x1f, 0xc7, 0x47, 0x72, 0x61, 0x63, 0x65, 0x13}; +static const uint8_t SEADER_READER_FALLBACK_ATR[] = + {0x3b, 0x95, 0x96, 0x80, 0xb1, 0xfe, 0x55, 0x1f, 0xc7, 0x47, 0x72, 0x61, 0x63, 0x65, 0x13}; struct SeaderReader { SeaderReaderConfig cfg; @@ -72,7 +72,8 @@ void seader_reader_settings_load(Seader* seader) { version != seader_reader_cfg_version) break; if(flipper_format_read_string(file, "Manufacturer", tmp)) { - strlcpy(seader->reader_manufacturer, furi_string_get_cstr(tmp), SEADER_READER_NAME_MAX); + strlcpy( + seader->reader_manufacturer, furi_string_get_cstr(tmp), SEADER_READER_NAME_MAX); } if(flipper_format_read_string(file, "Product", tmp)) { strlcpy(seader->reader_product, furi_string_get_cstr(tmp), SEADER_READER_NAME_MAX); @@ -96,8 +97,7 @@ void seader_reader_settings_save(Seader* seader) { if(!flipper_format_write_header_cstr( file, seader_reader_cfg_header, seader_reader_cfg_version)) break; - if(!flipper_format_write_string_cstr( - file, "Manufacturer", seader->reader_manufacturer)) + if(!flipper_format_write_string_cstr(file, "Manufacturer", seader->reader_manufacturer)) break; if(!flipper_format_write_string_cstr(file, "Product", seader->reader_product)) break; uint32_t pid = seader->reader_pid; @@ -111,9 +111,26 @@ void seader_reader_settings_save(Seader* seader) { /* Called from the USB gadget on ICC power-on (USB thread). */ /* Grace getSamVersion single-shot, used as a sacrificial warm-up. */ -static const uint8_t SEADER_READER_WARMUP[] = {0xA0, 0xDA, 0x02, 0x63, 0x00, 0x00, 0x0A, 0x44, 0x0A, - 0x44, 0x00, 0x00, 0x00, 0xA0, 0x02, 0x82, 0x00, 0x00, - 0x00}; +static const uint8_t SEADER_READER_WARMUP[] = { + 0xA0, + 0xDA, + 0x02, + 0x63, + 0x00, + 0x00, + 0x0A, + 0x44, + 0x0A, + 0x44, + 0x00, + 0x00, + 0x00, + 0xA0, + 0x02, + 0x82, + 0x00, + 0x00, + 0x00}; static void seader_reader_get_atr(void* ctx, uint8_t* atr, uint16_t* atr_len) { Seader* seader = ctx; @@ -228,7 +245,8 @@ static bool seader_reader_relay_once( *out_len = n; ok = true; } else { - seader_trace("Reader", "SAM RX none/short st=%d len=%lu", st, (unsigned long)reader->resp_len); + seader_trace( + "Reader", "SAM RX none/short st=%d len=%lu", st, (unsigned long)reader->resp_len); } furi_mutex_release(reader->lock); return ok; @@ -260,7 +278,13 @@ static bool seader_reader_xfr( uint16_t total = 0; if(!seader_reader_relay_once( - seader, reader, apdu, apdu_len, resp, SEADER_CCID_MAX_RESP, &total, + seader, + reader, + apdu, + apdu_len, + resp, + SEADER_CCID_MAX_RESP, + &total, SEADER_READER_TIMEOUT_MS)) { FURI_LOG_W(TAG, "SAM relay timeout/short"); resp[0] = 0x6F; @@ -275,7 +299,8 @@ static bool seader_reader_xfr( while(total >= 2 && resp[total - 2] == 0x61 && guard++ < 16) { uint8_t le = resp[total - 1]; total -= 2; /* strip the 61xx SW; keep any leading data */ - uint16_t cap = (total < SEADER_CCID_MAX_RESP) ? (uint16_t)(SEADER_CCID_MAX_RESP - total) : 0; + uint16_t cap = (total < SEADER_CCID_MAX_RESP) ? (uint16_t)(SEADER_CCID_MAX_RESP - total) : + 0; if(cap < 2) break; uint8_t get_response[5] = {0x00, 0xC0, 0x00, 0x00, le}; uint16_t got = 0; diff --git a/scenes/seader_scene_reader.c b/scenes/seader_scene_reader.c index 625b85a..e94f677 100644 --- a/scenes/seader_scene_reader.c +++ b/scenes/seader_scene_reader.c @@ -9,8 +9,7 @@ static void seader_scene_reader_render(Seader* seader) { } widget_reset(widget); - widget_add_string_element( - widget, 0, 0, AlignLeft, AlignTop, FontPrimary, "USB SAM Reader"); + widget_add_string_element(widget, 0, 0, AlignLeft, AlignTop, FontPrimary, "USB SAM Reader"); char line[48]; diff --git a/scenes/seader_scene_reader_name.c b/scenes/seader_scene_reader_name.c index 8585be6..8c191cc 100644 --- a/scenes/seader_scene_reader_name.c +++ b/scenes/seader_scene_reader_name.c @@ -44,8 +44,8 @@ bool seader_scene_reader_name_on_event(void* context, SceneManagerEvent event) { seader->reader_manuf_edit, seader->reader_manufacturer, SEADER_READER_NAME_MAX) != 0 || - strncmp(seader->reader_name_edit, seader->reader_product, SEADER_READER_NAME_MAX) != - 0; + strncmp( + seader->reader_name_edit, seader->reader_product, SEADER_READER_NAME_MAX) != 0; if(changed) { seader->reader_pid++; if(seader->reader_pid == 0) { @@ -53,9 +53,7 @@ bool seader_scene_reader_name_on_event(void* context, SceneManagerEvent event) { } } strlcpy( - seader->reader_manufacturer, - seader->reader_manuf_edit, - SEADER_READER_NAME_MAX); + seader->reader_manufacturer, seader->reader_manuf_edit, SEADER_READER_NAME_MAX); strlcpy(seader->reader_product, seader->reader_name_edit, SEADER_READER_NAME_MAX); seader_reader_settings_save(seader); scene_manager_search_and_switch_to_previous_scene( diff --git a/scenes/seader_scene_sam_present.c b/scenes/seader_scene_sam_present.c index e233b79..ff1ae2f 100644 --- a/scenes/seader_scene_sam_present.c +++ b/scenes/seader_scene_sam_present.c @@ -92,9 +92,9 @@ bool seader_scene_sam_present_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(seader->sam_present_menu_guard_active && (event.event == SubmenuIndexRead || event.event == SubmenuIndexSaved || - event.event == SubmenuIndexReaderEmulation || - event.event == SubmenuIndexReaderName || event.event == SubmenuIndexAPDURunner || - event.event == SubmenuIndexReadConfigCard || event.event == SubmenuIndexSamInfo)) { + event.event == SubmenuIndexReaderEmulation || event.event == SubmenuIndexReaderName || + event.event == SubmenuIndexAPDURunner || event.event == SubmenuIndexReadConfigCard || + event.event == SubmenuIndexSamInfo)) { seader->sam_present_menu_guard_active = false; consumed = true; } else if(event.event == SubmenuIndexRead) { diff --git a/usb_ccid_reader.c b/usb_ccid_reader.c index 2d2f5fe..6077213 100644 --- a/usb_ccid_reader.c +++ b/usb_ccid_reader.c @@ -237,7 +237,8 @@ static void ccid_send_slot_status(uint8_t seq) { ccid_send(p, 10); } -static void ccid_send_parameters(uint8_t seq, uint8_t proto, const uint8_t* params, uint8_t nparams) { +static void + ccid_send_parameters(uint8_t seq, uint8_t proto, const uint8_t* params, uint8_t nparams) { if(nparams > 7) nparams = 7; uint8_t* p = g_ccid->tx_buf; p[0] = RDR_TO_PC_PARAMETERS; /* 0x82 */ diff --git a/usb_ccid_reader.h b/usb_ccid_reader.h index fb4d0e6..a414579 100644 --- a/usb_ccid_reader.h +++ b/usb_ccid_reader.h @@ -17,7 +17,7 @@ #define SEADER_CCID_MAX_RESP 272u // Max CCID message length (advertised as dwMaxCCIDMessageLength), both // directions = 10-byte header + response body. -#define SEADER_CCID_MSG_MAX (10u + SEADER_CCID_MAX_RESP) +#define SEADER_CCID_MSG_MAX (10u + SEADER_CCID_MAX_RESP) typedef struct { uint16_t vid; @@ -30,7 +30,8 @@ typedef struct { // Relay one APDU to the SAM. Must always fill `resp`/`*resp_len` (e.g. 6F00 // on failure) and may block until the SAM answers. Returns true on success. - bool (*xfr)(void* ctx, const uint8_t* apdu, uint16_t apdu_len, uint8_t* resp, uint16_t* resp_len); + bool ( + *xfr)(void* ctx, const uint8_t* apdu, uint16_t apdu_len, uint8_t* resp, uint16_t* resp_len); void* ctx; } SeaderCcidReaderConfig;