aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristina Quast <chrysh.ng+git@gmail.com>2015-05-02 17:56:32 +0200
committerChristina Quast <chrysh.ng+git@gmail.com>2015-05-02 17:56:32 +0200
commitbe235275faa2e76320364f49f03b1e07188fcb13 (patch)
treef03edc13afef6a4bf7ad6c7092d68b8f5a1fe3c7
parent7a7f98c9f2d531e6fb4e2e4c9bebf877eca4fc48 (diff)
Added not working PTS parsing to host communication
-rw-r--r--firmware/Makefile2
-rw-r--r--firmware/src_simtrace/host_communication.c23
-rw-r--r--firmware/src_simtrace/iso7816_uart.c504
-rw-r--r--firmware/src_simtrace/simtrace.h30
4 files changed, 85 insertions, 474 deletions
diff --git a/firmware/Makefile b/firmware/Makefile
index 7c1438f..b494f7c 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -138,7 +138,7 @@ C_CMSIS = core_cm3.o
C_LOWLEVEL = board_cstartup_gnu.o board_lowlevel.o syscalls.o exceptions.o
C_LIBLEVEL = spi.o pio.o pmc.o usart.o pio_it.o pio_capture.o uart_console.o iso7816_4.o wdt.o led.o tc.o
C_CCID = cciddriver.o USBD.o USBDDriver.o USBD_HAL.o USBRequests.o USBDCallbacks.o USBDescriptors.o USBDDriverCallbacks.o
-C_SIMTRACE = simtrace_iso7816.o usb.o ccid.o sniffer.o phone.o mitm.o ringbuffer.o host_communication.o #tc_etu.o
+C_SIMTRACE = simtrace_iso7816.o usb.o ccid.o sniffer.o phone.o mitm.o ringbuffer.o host_communication.o iso7816_uart.o #tc_etu.o
C_APPLEVEL = main.o
C_OBJECTS = $(C_CMSIS) $(C_LOWLEVEL) $(C_LIBLEVEL) $(C_APPLEVEL) $(C_CCID) $(C_SIMTRACE)
diff --git a/firmware/src_simtrace/host_communication.c b/firmware/src_simtrace/host_communication.c
index 2bf600c..fcec1c1 100644
--- a/firmware/src_simtrace/host_communication.c
+++ b/firmware/src_simtrace/host_communication.c
@@ -1,6 +1,9 @@
#include "board.h"
static volatile bool write_to_host_in_progress = false;
+static struct iso7816_3_handle ih = {0};
+static bool check_for_pts = false;
+static enum pts_state state;
void USB_write_callback(uint8_t *pArg, uint8_t status, uint32_t transferred, uint32_t remaining)
{
@@ -37,6 +40,26 @@ int check_data_from_phone()
if((rbuf_is_empty(&sim_rcv_buf) || write_to_host_in_progress == true)) {
return ret;
}
+ if ((check_for_pts == false) && (rbuf_peek(&sim_rcv_buf) == 0xff)) {
+// FIXME: set var to false
+ check_for_pts = true;
+ ih = (struct iso7816_3_handle){0};
+ }
+ if (check_for_pts == true) {
+ while (!rbuf_is_empty(&sim_rcv_buf) && (ih.pts_state != PTS_END)) {
+ state = process_byte_pts(&ih, rbuf_read(&sim_rcv_buf));
+ }
+ if (ih.pts_bytes_processed > 6 && ih.pts_state != PTS_END) {
+ int i;
+ for (i = 0; i < ih.pts_bytes_processed; i++)
+ printf("s: %x", ih.pts_req[i]);
+ check_for_pts = false;
+ rbuf_write(&sim_rcv_buf, ih.pts_req[i]);
+ } else {
+ printf("fin pts\n", ih.pts_state);
+ check_for_pts = false;
+ }
+ }
ret = send_to_host();
return ret;
}
diff --git a/firmware/src_simtrace/iso7816_uart.c b/firmware/src_simtrace/iso7816_uart.c
index cd1a2f0..7d01395 100644
--- a/firmware/src_simtrace/iso7816_uart.c
+++ b/firmware/src_simtrace/iso7816_uart.c
@@ -17,63 +17,8 @@
*
*/
-#include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-#include <AT91SAM7.h>
-#include <lib_AT91SAM7.h>
-#include <openpcd.h>
-
-#include <simtrace_usb.h>
-
-#include <os/usb_handler.h>
-#include <os/dbgu.h>
-#include <os/pio_irq.h>
-
-#include "../simtrace.h"
-#include "../openpcd.h"
-
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-
-static const AT91PS_USART usart = AT91C_BASE_US0;
-
-enum iso7816_3_state {
- ISO7816_S_RESET, /* in Reset */
- ISO7816_S_WAIT_ATR, /* waiting for ATR to start */
- ISO7816_S_IN_ATR, /* while we are receiving the ATR */
- ISO7816_S_WAIT_APDU, /* waiting for start of new APDU */
- ISO7816_S_IN_APDU, /* inside a single APDU */
- ISO7816_S_IN_PTS, /* while we are inside the PTS / PSS */
-};
-
-/* detailed sub-states of ISO7816_S_IN_ATR */
-enum atr_state {
- ATR_S_WAIT_TS,
- ATR_S_WAIT_T0,
- ATR_S_WAIT_TA,
- ATR_S_WAIT_TB,
- ATR_S_WAIT_TC,
- ATR_S_WAIT_TD,
- ATR_S_WAIT_HIST,
- ATR_S_WAIT_TCK,
- ATR_S_DONE,
-};
-
-/* detailed sub-states of ISO7816_S_IN_PTS */
-enum pts_state {
- PTS_S_WAIT_REQ_PTSS,
- PTS_S_WAIT_REQ_PTS0,
- PTS_S_WAIT_REQ_PTS1,
- PTS_S_WAIT_REQ_PTS2,
- PTS_S_WAIT_REQ_PTS3,
- PTS_S_WAIT_REQ_PCK,
- PTS_S_WAIT_RESP_PTSS = PTS_S_WAIT_REQ_PTSS | 0x10,
- PTS_S_WAIT_RESP_PTS0 = PTS_S_WAIT_REQ_PTS0 | 0x10,
- PTS_S_WAIT_RESP_PTS1 = PTS_S_WAIT_REQ_PTS1 | 0x10,
- PTS_S_WAIT_RESP_PTS2 = PTS_S_WAIT_REQ_PTS2 | 0x10,
- PTS_S_WAIT_RESP_PTS3 = PTS_S_WAIT_REQ_PTS3 | 0x10,
- PTS_S_WAIT_RESP_PCK = PTS_S_WAIT_REQ_PCK | 0x10,
-};
+#include "board.h"
+#include "errno.h"
#define _PTSS 0
#define _PTS0 1
@@ -82,49 +27,26 @@ enum pts_state {
#define _PTS3 4
#define _PCK 5
-struct iso7816_3_handle {
- enum iso7816_3_state state;
-
- u_int8_t fi;
- u_int8_t di;
- u_int8_t wi;
- u_int32_t waiting_time;
-
- enum atr_state atr_state;
- u_int8_t atr_idx;
- u_int8_t atr_hist_len;
- u_int8_t atr_last_td;
- u_int8_t atr[64];
-
- enum pts_state pts_state;
- u_int8_t pts_req[6];
- u_int8_t pts_resp[6];
-
- struct simtrace_hdr sh;
-
- int rctx_must_be_sent;
- struct req_ctx *rctx;
-};
-
-struct iso7816_3_handle isoh;
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+static struct Usart_info usart_info = {.base = USART_PHONE, .id = ID_USART_PHONE, .state = USART_RCV};
/* Table 6 from ISO 7816-3 */
-static const u_int16_t fi_table[] = {
+static const uint16_t fi_table[] = {
0, 372, 558, 744, 1116, 1488, 1860, 0,
0, 512, 768, 1024, 1536, 2048, 0, 0
};
/* Table 7 from ISO 7816-3 */
-static const u_int8_t di_table[] = {
+static const uint8_t di_table[] = {
0, 1, 2, 4, 8, 16, 0, 0,
0, 0, 2, 4, 8, 16, 32, 64,
};
/* compute the F/D ratio based on Fi and Di values */
-static int compute_fidi_ratio(u_int8_t fi, u_int8_t di)
+static int compute_fidi_ratio(uint8_t fi, uint8_t di)
{
- u_int16_t f, d;
+ uint16_t f, d;
int ret;
if (fi >= ARRAY_SIZE(fi_table) ||
@@ -147,194 +69,19 @@ static int compute_fidi_ratio(u_int8_t fi, u_int8_t di)
return ret;
}
-static void refill_rctx(struct iso7816_3_handle *ih)
-{
- struct req_ctx *rctx;
-
- rctx = req_ctx_find_get(0, RCTX_STATE_FREE,
- RCTX_STATE_LIBRFID_BUSY);
- if (!rctx) {
- ih->rctx = NULL;
- return;
- }
-
- ih->sh.cmd = SIMTRACE_MSGT_DATA;
-
- /* reserve spece at start of rctx */
- rctx->tot_len = sizeof(struct simtrace_hdr);
-
- ih->rctx = rctx;
-}
-
-static void send_rctx(struct iso7816_3_handle *ih)
-{
- struct req_ctx *rctx = ih->rctx;
-
- if (!rctx)
- return;
-
- /* copy the simtrace header */
- memcpy(rctx->data, &ih->sh, sizeof(ih->sh));
-
- req_ctx_set_state(rctx, RCTX_STATE_UDP_EP2_PENDING);
-
- memset(&ih->sh, 0, sizeof(ih->sh));
- ih->rctx = NULL;
-}
-
-
-/* Update the ATR sub-state */
-static void set_atr_state(struct iso7816_3_handle *ih, enum atr_state new_atrs)
-{
- if (new_atrs == ATR_S_WAIT_TS) {
- ih->atr_idx = 0;
- ih->atr_hist_len = 0;
- ih->atr_last_td = 0;
- memset(ih->atr, 0, sizeof(ih->atr));
- } else if (ih->atr_state == new_atrs)
- return;
-
- //DEBUGPCR("ATR state %u -> %u", ih->atr_state, new_atrs);
- ih->atr_state = new_atrs;
-}
-
-#define ISO7816_3_INIT_WTIME 9600
-#define ISO7816_3_DEFAULT_WI 10
-
static void update_fidi(struct iso7816_3_handle *ih)
{
int rc;
rc = compute_fidi_ratio(ih->fi, ih->di);
if (rc > 0 && rc < 0x400) {
- DEBUGPCR("computed Fi(%u) Di(%u) ratio: %d", ih->fi, ih->di, rc);
- /* make sure UART uses new F/D ratio */
- usart->US_CR |= AT91C_US_RXDIS | AT91C_US_RSTRX;
- usart->US_FIDI = rc & 0x3ff;
- usart->US_CR |= AT91C_US_RXEN | AT91C_US_STTTO;
- /* notify ETU timer about this */
- tc_etu_set_etu(rc);
+ TRACE_INFO("computed Fi(%u) Di(%u) ratio: %d", ih->fi, ih->di, rc);
+/* make sure UART uses new F/D ratio */
+ USART_PHONE->US_CR |= US_CR_RXDIS | US_CR_RSTRX;
+ USART_PHONE->US_FIDI = rc & 0x3ff;
+ USART_PHONE->US_CR |= US_CR_RXEN | US_CR_STTTO;
} else
- DEBUGPCRF("computed FiDi ratio %d unsupported", rc);
-}
-
-/* Update the ISO 7816-3 APDU receiver state */
-static void set_state(struct iso7816_3_handle *ih, enum iso7816_3_state new_state)
-{
- if (new_state == ISO7816_S_RESET) {
- usart->US_CR |= AT91C_US_RXDIS | AT91C_US_RSTRX;
- } else if (new_state == ISO7816_S_WAIT_ATR) {
- /* Reset to initial Fi / Di ratio */
- ih->fi = 1;
- ih->di = 1;
- update_fidi(ih);
- /* initialize todefault WI, this will be overwritten if we
- * receive TC2, and it will be programmed into hardware after
- * ATR is finished */
- ih->wi = ISO7816_3_DEFAULT_WI;
- /* update waiting time to initial waiting time */
- ih->waiting_time = ISO7816_3_INIT_WTIME;
- tc_etu_set_wtime(ih->waiting_time);
- /* Set ATR sub-state to initial state */
- set_atr_state(ih, ATR_S_WAIT_TS);
- /* Notice that we are just coming out of reset */
- ih->sh.flags |= SIMTRACE_FLAG_ATR;
- }
-
- if (ih->state == new_state)
- return;
-
- //DEBUGPCR("7816 state %u -> %u", ih->state, new_state);
- ih->state = new_state;
-}
-
-/* determine the next ATR state based on received interface byte */
-static enum atr_state next_intb_state(struct iso7816_3_handle *ih, u_int8_t ch)
-{
- switch (ih->atr_state) {
- case ATR_S_WAIT_TD:
- case ATR_S_WAIT_T0:
- ih->atr_last_td = ch;
- goto from_td;
- case ATR_S_WAIT_TC:
- if ((ih->atr_last_td & 0x0f) == 0x02) {
- /* TC2 contains WI */
- ih->wi = ch;
- }
- goto from_tc;
- case ATR_S_WAIT_TB:
- goto from_tb;
- case ATR_S_WAIT_TA:
- goto from_ta;
- default:
- DEBUGPCR("something wrong, old_state != TA");
- return ATR_S_WAIT_TCK;
- }
-
-from_td:
- if (ih->atr_last_td & 0x10)
- return ATR_S_WAIT_TA;
-from_ta:
- if (ih->atr_last_td & 0x20)
- return ATR_S_WAIT_TB;
-from_tb:
- if (ih->atr_last_td & 0x40)
- return ATR_S_WAIT_TC;
-from_tc:
- if (ih->atr_last_td & 0x80)
- return ATR_S_WAIT_TD;
-
- return ATR_S_WAIT_HIST;
-}
-
-/* process an incomng ATR byte */
-static enum iso7816_3_state
-process_byte_atr(struct iso7816_3_handle *ih, u_int8_t byte)
-{
- /* add byte to ATR buffer */
- ih->atr[ih->atr_idx] = byte;
- ih->atr_idx++;
-
- switch (ih->atr_state) {
- case ATR_S_WAIT_TS:
- /* FIXME: if we don't have the RST line we might get this */
- if (byte == 0) {
- ih->atr_idx--;
- break;
- }
- /* FIXME: check inverted logic */
- set_atr_state(ih, ATR_S_WAIT_T0);
- break;
- case ATR_S_WAIT_T0:
- /* obtain the number of historical bytes */
- ih->atr_hist_len = byte & 0xf;
- /* Mask out the hist-byte-length to indiicate T=0 */
- set_atr_state(ih, next_intb_state(ih, byte & 0xf0));
- break;
- case ATR_S_WAIT_TA:
- case ATR_S_WAIT_TB:
- case ATR_S_WAIT_TC:
- case ATR_S_WAIT_TD:
- set_atr_state(ih, next_intb_state(ih, byte));
- break;
- case ATR_S_WAIT_HIST:
- ih->atr_hist_len--;
- /* after all historical bytes are recieved, go to TCK */
- if (ih->atr_hist_len == 0)
- set_atr_state(ih, ATR_S_WAIT_TCK);
- break;
- case ATR_S_WAIT_TCK:
- /* FIXME: process and verify the TCK */
- set_atr_state(ih, ATR_S_DONE);
- /* send off the USB context */
- ih->rctx_must_be_sent = 1;
- /* update the waiting time */
- ih->waiting_time = 960 * di_table[ih->di] * ih->wi;
- tc_etu_set_wtime(ih->waiting_time);
- return ISO7816_S_WAIT_APDU;
- }
-
- return ISO7816_S_IN_ATR;
+ TRACE_INFO("computed FiDi ratio %d unsupported", rc);
}
/* Update the ATR sub-state */
@@ -347,10 +94,13 @@ static void set_pts_state(struct iso7816_3_handle *ih, enum pts_state new_ptss)
/* Determine the next PTS state */
static enum pts_state next_pts_state(struct iso7816_3_handle *ih)
{
- u_int8_t is_resp = ih->pts_state & 0x10;
- u_int8_t sstate = ih->pts_state & 0x0f;
- u_int8_t *pts_ptr;
+ uint8_t is_resp = ih->pts_state & 0x10;
+ uint8_t sstate = ih->pts_state & 0x0f;
+ uint8_t *pts_ptr;
+ if (ih->pts_state == PTS_END) {
+ return PTS_END;
+ }
if (!is_resp)
pts_ptr = ih->pts_req;
else
@@ -387,9 +137,9 @@ from_pts3:
return PTS_S_WAIT_REQ_PCK | is_resp;
}
-static enum iso7816_3_state
-process_byte_pts(struct iso7816_3_handle *ih, u_int8_t byte)
+enum pts_state process_byte_pts(struct iso7816_3_handle *ih, uint8_t byte)
{
+ printf("PTS: %x, stat: %x\n", byte, ih->pts_state);
switch (ih->pts_state) {
case PTS_S_WAIT_REQ_PTSS:
ih->pts_req[_PTSS] = byte;
@@ -420,7 +170,7 @@ process_byte_pts(struct iso7816_3_handle *ih, u_int8_t byte)
/* This must be TA1 */
ih->fi = byte >> 4;
ih->di = byte & 0xf;
- DEBUGPCR("found Fi=%u Di=%u", ih->fi, ih->di);
+ TRACE_DEBUG("found Fi=%u Di=%u", ih->fi, ih->di);
ih->pts_resp[_PTS1] = byte;
break;
case PTS_S_WAIT_RESP_PTS2:
@@ -432,210 +182,18 @@ process_byte_pts(struct iso7816_3_handle *ih, u_int8_t byte)
case PTS_S_WAIT_RESP_PCK:
ih->pts_resp[_PCK] = byte;
/* FIXME: check PCK */
- set_pts_state(ih, PTS_S_WAIT_REQ_PTSS);
+ for (int i = 0; ih->pts_resp != 0; i++)
+ ISO7816_SendChar(ih->pts_req[i], &usart_info);
/* update baud rate generator with Fi/Di */
update_fidi(ih);
+ //set_pts_state(ih, PTS_S_WAIT_REQ_PTSS);
/* Wait for the next APDU */
- return ISO7816_S_WAIT_APDU;
+ ih->pts_state = PTS_END;
+ case PTS_END:
+ TRACE_INFO("PTS state PTS_END reached");
}
/* calculate the next state and set it */
set_pts_state(ih, next_pts_state(ih));
-
- return ISO7816_S_IN_PTS;
-}
-
-static void process_byte(struct iso7816_3_handle *ih, u_int8_t byte)
-{
- int new_state = -1;
- struct req_ctx *rctx;
-
- if (!ih->rctx)
- refill_rctx(ih);
-
- switch (ih->state) {
- case ISO7816_S_RESET:
- break;
- case ISO7816_S_WAIT_ATR:
- case ISO7816_S_IN_ATR:
- new_state = process_byte_atr(ih, byte);
- break;
- case ISO7816_S_WAIT_APDU:
- if (byte == 0xff) {
- new_state = process_byte_pts(ih, byte);
- goto out_silent;
- }
- case ISO7816_S_IN_APDU:
- new_state = ISO7816_S_IN_APDU;
- break;
- case ISO7816_S_IN_PTS:
- new_state = process_byte_pts(ih, byte);
- goto out_silent;
- }
-
- /* The USB buffer could be gone in case the timer expired or code above
- * this line explicitly sent it off */
- if (!ih->rctx)
- refill_rctx(ih);
-
- rctx = ih->rctx;
- if (!rctx) {
- DEBUGPCR("==> Lost byte, missing rctx");
- return;
- }
-
- /* store the byte in the USB request context */
- rctx->data[rctx->tot_len] = byte;
- rctx->tot_len++;
-
- if (rctx->tot_len >= rctx->size || ih->rctx_must_be_sent) {
- ih->rctx_must_be_sent = 0;
- send_rctx(ih);
- }
-
-out_silent:
- if (new_state != -1)
- set_state(ih, new_state);
-}
-
-/* timeout of work waiting time during receive */
-void iso7816_wtime_expired(void)
-{
- /* Always flush the URB at Rx timeout as this indicates end of APDU */
- if (isoh.rctx) {
- isoh.sh.flags |= SIMTRACE_FLAG_WTIME_EXP;
- send_rctx(&isoh);
- }
- if (isoh.state == ISO7816_S_IN_PTS) {
- /* Timout during PTS: Card does not support PTS */
- }
- set_state(&isoh, ISO7816_S_WAIT_APDU);
-}
-
-static __ramfunc void usart_irq(void)
-{
- u_int32_t csr = usart->US_CSR;
- u_int8_t octet;
-
- //DEBUGP("USART IRQ, CSR=0x%08x\n", csr);
-
- if (csr & AT91C_US_RXRDY) {
- /* at least one character received */
- octet = usart->US_RHR & 0xff;
- //DEBUGP("%02x ", octet);
- process_byte(&isoh, octet);
- }
-
- if (csr & AT91C_US_TXRDY) {
- /* nothing to transmit anymore */
- }
-
- if (csr & (AT91C_US_PARE|AT91C_US_FRAME|AT91C_US_OVRE)) {
- /* FIXME: some error has occurrerd */
- }
-}
-
-/* handler for the RST input pin state change */
-static void reset_pin_irq(u_int32_t pio)
-{
- if (!AT91F_PIO_IsInputSet(AT91C_BASE_PIOA, pio)) {
- DEBUGPCR("nRST");
- set_state(&isoh, ISO7816_S_RESET);
- } else {
- DEBUGPCR("RST");
- set_state(&isoh, ISO7816_S_WAIT_ATR);
- }
-}
-
-void iso_uart_dump(void)
-{
- u_int32_t csr = usart->US_CSR;
-
- DEBUGPCR("USART CSR=0x%08x", csr);
-}
-
-void iso_uart_rst(unsigned int state)
-{
- DEBUGPCR("USART set nRST set state=%u", state);
- switch (state) {
- case 0:
- AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, SIMTRACE_PIO_nRST);
- AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, SIMTRACE_PIO_nRST);
- break;
- case 1:
- AT91F_PIO_SetOutput(AT91C_BASE_PIOA, SIMTRACE_PIO_nRST);
- AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, SIMTRACE_PIO_nRST);
- break;
- default:
- AT91F_PIO_CfgInput(AT91C_BASE_PIOA, SIMTRACE_PIO_nRST);
- break;
- }
-}
-
-void iso_uart_rx_mode(void)
-{
- DEBUGPCR("USART Entering Rx Mode");
- /* Enable receive interrupts */
- usart->US_IER = AT91C_US_RXRDY | AT91C_US_OVRE | AT91C_US_FRAME |
- AT91C_US_PARE | AT91C_US_NACK | AT91C_US_ITERATION;
-
- /* call interrupt handler once to set initial state RESET / ATR */
- reset_pin_irq(SIMTRACE_PIO_nRST);
-}
-
-void iso_uart_clk_master(unsigned int master)
-{
- DEBUGPCR("USART Clock Master %u", master);
- if (master) {
- usart->US_MR = AT91C_US_USMODE_ISO7816_0 | AT91C_US_CLKS_CLOCK |
- AT91C_US_CHRL_8_BITS | AT91C_US_NBSTOP_1_BIT |
- AT91C_US_CKLO;
- usart->US_BRGR = (0x0000 << 16) | 16;
- } else {
- usart->US_MR = AT91C_US_USMODE_ISO7816_0 | AT91C_US_CLKS_EXT |
- AT91C_US_CHRL_8_BITS | AT91C_US_NBSTOP_1_BIT |
- AT91C_US_CKLO;
- usart->US_BRGR = (0x0000 << 16) | 0x0001;
- }
-}
-
-void iso_uart_init(void)
-{
- DEBUGPCR("USART Initializing");
-
- refill_rctx(&isoh);
-
- /* make sure we get clock from the power management controller */
- AT91F_US0_CfgPMC();
-
- /* configure all 3 signals as input */
- AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, SIMTRACE_PIO_IO, SIMTRACE_PIO_CLK);
- AT91F_PIO_CfgInput(AT91C_BASE_PIOA, SIMTRACE_PIO_nRST);
-
- AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_US0,
- OPENPCD_IRQ_PRIO_USART,
- AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, &usart_irq);
- AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US0);
-
- usart->US_CR = AT91C_US_RXDIS | AT91C_US_TXDIS |
- (AT91C_US_RSTRX | AT91C_US_RSTTX);
- /* FIXME: wait for some time */
- usart->US_CR = AT91C_US_RXDIS | AT91C_US_TXDIS;
-
- /* ISO7816 T=0 mode with external clock input */
- usart->US_MR = AT91C_US_USMODE_ISO7816_0 | AT91C_US_CLKS_EXT |
- AT91C_US_CHRL_8_BITS | AT91C_US_NBSTOP_1_BIT |
- AT91C_US_CKLO;
-
- /* Disable all interrupts */
- usart->US_IDR = 0xff;
- /* Clock Divider = 1, i.e. no division of SCLK */
- usart->US_BRGR = (0x0000 << 16) | 0x0001;
- /* Disable Receiver Time-out */
- usart->US_RTOR = 0;
- /* Disable Transmitter Timeguard */
- usart->US_TTGR = 0;
-
- pio_irq_register(SIMTRACE_PIO_nRST, &reset_pin_irq);
- AT91F_PIO_CfgInputFilter(AT91C_BASE_PIOA, SIMTRACE_PIO_nRST);
- pio_irq_enable(SIMTRACE_PIO_nRST);
+ printf("stat: %x\n", ih->pts_state);
+ return ih->pts_state;
}
diff --git a/firmware/src_simtrace/simtrace.h b/firmware/src_simtrace/simtrace.h
index 1c6b871..ad9b7b5 100644
--- a/firmware/src_simtrace/simtrace.h
+++ b/firmware/src_simtrace/simtrace.h
@@ -58,7 +58,37 @@ typedef struct {
extern const USBConfigurationDescriptor *configurationDescriptorsArr[];
+/*** PTS parsing ***/
+/* detailed sub-states of ISO7816_S_IN_PTS */
+enum pts_state {
+ PTS_S_WAIT_REQ_PTSS,
+ PTS_S_WAIT_REQ_PTS0,
+ PTS_S_WAIT_REQ_PTS1,
+ PTS_S_WAIT_REQ_PTS2,
+ PTS_S_WAIT_REQ_PTS3,
+ PTS_S_WAIT_REQ_PCK,
+ PTS_S_WAIT_RESP_PTSS = PTS_S_WAIT_REQ_PTSS | 0x10,
+ PTS_S_WAIT_RESP_PTS0 = PTS_S_WAIT_REQ_PTS0 | 0x10,
+ PTS_S_WAIT_RESP_PTS1 = PTS_S_WAIT_REQ_PTS1 | 0x10,
+ PTS_S_WAIT_RESP_PTS2 = PTS_S_WAIT_REQ_PTS2 | 0x10,
+ PTS_S_WAIT_RESP_PTS3 = PTS_S_WAIT_REQ_PTS3 | 0x10,
+ PTS_S_WAIT_RESP_PCK = PTS_S_WAIT_REQ_PCK | 0x10,
+ PTS_END
+};
+
+struct iso7816_3_handle {
+ uint8_t fi;
+ uint8_t di;
+
+ enum pts_state pts_state;
+ uint8_t pts_req[6];
+ uint8_t pts_resp[6];
+ uint8_t pts_bytes_processed;
+};
+
int check_data_from_phone();
+enum pts_state process_byte_pts(struct iso7816_3_handle *ih, uint8_t byte);
+
void ISR_PhoneRST( const Pin *pPin);
/* Configure functions */