diff --git a/t_1.c b/t_1.c index 4a6edf4..d360e9b 100644 --- a/t_1.c +++ b/t_1.c @@ -38,6 +38,7 @@ void seader_t_1_reset() { } void seader_t_1_set_IFSD(Seader* seader) { + FURI_LOG_D(TAG, "Setting IFSD to %02X", IFSD_VALUE); SeaderWorker* seader_worker = seader->worker; SeaderUartBridge* seader_uart = seader_worker->uart; uint8_t frame[5]; @@ -68,7 +69,11 @@ void seader_t_1_IFSD_response(Seader* seader) { frame_len = seader_add_lrc(frame, frame_len); - seader_ccid_XfrBlock(seader_uart, frame, frame_len); + if(seader_worker->sam_comm_type == SeaderSamCommunicationTypeSec1210) { + seader_ccid_XfrBlock(seader_uart, frame, frame_len); + } else { + seader_uart_send(seader_uart, frame, frame_len); + } } void seader_t_1_send_ack(Seader* seader) { @@ -86,7 +91,11 @@ void seader_t_1_send_ack(Seader* seader) { //FURI_LOG_D(TAG, "Sending R-Block ACK: PCB: %02x", frame[1]); - seader_ccid_XfrBlock(seader_uart, frame, frame_len); + if(seader_worker->sam_comm_type == SeaderSamCommunicationTypeSec1210) { + seader_ccid_XfrBlock(seader_uart, frame, frame_len); + } else { + seader_uart_send(seader_uart, frame, frame_len); + } } BitBuffer* seader_t_1_tx_buffer; @@ -112,7 +121,11 @@ void seader_send_t1_chunk(Seader* seader, uint8_t PCB, uint8_t* chunk, size_t le frame_len = seader_add_lrc(frame, frame_len); FURI_LOG_D(TAG, "seader_send_t1_chunk T=1 frame: PCB: %02x, LEN: %02x", PCB, len); - seader_ccid_XfrBlock(seader_uart, frame, frame_len); + if(seader_worker->sam_comm_type == SeaderSamCommunicationTypeSec1210) { + seader_ccid_XfrBlock(seader_uart, frame, frame_len); + } else { + seader_uart_send(seader_uart, frame, frame_len); + } free(frame); } diff --git a/uart.c b/uart.c index df28d43..52e70f4 100644 --- a/uart.c +++ b/uart.c @@ -137,11 +137,7 @@ size_t seader_uart_process_buffer_raw(Seader* seader, uint8_t* cmd, size_t cmd_l if(seader_worker->callback) { seader_worker->callback(SeaderWorkerEventSamPresent, seader_worker->context); } - memset(cmd, 0, sizeof(SAM_ATR)); - cmd_len -= sizeof(SAM_ATR); - if(cmd_len > 0) { - memmove(cmd, cmd + sizeof(SAM_ATR), cmd_len); - } + return 0; } cmd++; @@ -241,6 +237,12 @@ SeaderUartBridge* seader_uart_enable(SeaderUartConfig* cfg, Seader* seader) { return seader_uart; } +void seader_uart_send(SeaderUartBridge* seader_uart, uint8_t* data, size_t len) { + memcpy(seader_uart->tx_buf, data, len); + seader_uart->tx_len = len; + furi_thread_flags_set(furi_thread_get_id(seader_uart->tx_thread), WorkerEvtSamRx); +} + int32_t seader_uart_tx_thread(void* context) { Seader* seader = (Seader*)context; SeaderUartBridge* seader_uart = seader->uart; diff --git a/uart.h b/uart.h index 0c345d0..853d1b5 100644 --- a/uart.h +++ b/uart.h @@ -18,3 +18,4 @@ void seader_uart_sam_reset(SeaderUartBridge* seader_uart); SeaderUartBridge* seader_uart_alloc(Seader* seader); void seader_uart_free(SeaderUartBridge* seader_uart); +void seader_uart_send(SeaderUartBridge* seader_uart, uint8_t* data, size_t len);