mirror of
https://github.com/bettse/seader.git
synced 2026-08-27 21:40:06 +00:00
style: apply ufbt formatting
Claude-Session: https://claude.ai/code/session_017aeoATqoJv92Xiq5vnqaN8
This commit is contained in:
+36
-11
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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) {
|
||||
|
||||
+2
-1
@@ -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 */
|
||||
|
||||
+3
-2
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user