view target-utils/simagent/byterx.c @ 783:c136a1a2474b

simagent: initial implementation of APDU exchange
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 13 Mar 2021 22:06:08 +0000
parents badc5399d641
children
line wrap: on
line source

#include <stdlib.h>
#include "types.h"
#include "simregs.h"
#include "timeout.h"

rx_sim_byte(count)
	unsigned count;
{
	for (; count; count--) {
		if (!(SIMREGS.stat & SIM_STAT_FEMPTY))
			return SIMREGS.drx;
	}
	return(-1);
}

rx_sim_byte_hl()
{
	int rc;
	unsigned parcnt;

	for (parcnt = 0; parcnt < 3; parcnt++) {
		rc = rx_sim_byte(SIM_WAIT_TIMEOUT);
		if (rc < 0) {
			printf("ERROR: timeout waiting for SIM response\n");
			return(-1);
		}
		if (rc & 0x100)
			return rc & 0xFF;
	}
	printf("ERROR: received bad parity 3 times in a row\n");
	return(-1);
}

flush_rx_fifo()
{
	unsigned count;

	for (count = 0; ; ) {
		if (SIMREGS.stat & SIM_STAT_FEMPTY)
			break;
		(void) SIMREGS.drx;
		if (++count >= 32) {
			printf("ERROR: Rx FIFO flush does not end\n");
			return(-1);
		}
	}
	return(0);
}

void
cmd_sertimeout(argbulk)
	char *argbulk;
{
	char *argv[2];
	int count;

	if (parse_args(argbulk, 1, 1, argv, 0) < 0)
		return;
	count = atoi(argv[0]);
	rx_sim_byte(count);
}