# HG changeset patch # User Mychaela Falconia # Date 1615673859 0 # Node ID 56506e9165bc61f221a1119a36760dd74b0320e2 # Parent 839bf41e7be0c607cb2de2d38ed39b77b65ddc24 simagent: Rx data direction implemented for exchange diff -r 839bf41e7be0 -r 56506e9165bc target-utils/simagent/exchange.c --- a/target-utils/simagent/exchange.c Sat Mar 13 22:08:48 2021 +0000 +++ b/target-utils/simagent/exchange.c Sat Mar 13 22:17:39 2021 +0000 @@ -84,7 +84,59 @@ exchange_data_in(ins, datalen) unsigned ins, datalen; { - printf("ERROR: data in mode not implemented yet\n"); + int rc; + unsigned null_count, bytes_rcvd, ack, ack1; + u8 data[256]; + + if (!datalen) + datalen = 256; + ack = ins & 0xFE; + ack1 = ~ins & 0xFE; + bytes_rcvd = 0; + null_count = 0; + for (;;) { + rc = rx_sim_byte_hl(); + if (rc < 0) + return; + if (rc == 0x60) { + null_count++; + if (null_count >= 32) { + printf( + "ERROR: too many stalling NULL bytes received from SIM\n"); + return; + } + continue; + } + if ((rc & 0xF0) == 0x60 || (rc & 0xF0) == 0x90) { + finish_sw(rc, data, bytes_rcvd); + return; + } + if ((rc & 0xFE) == ack) { + if (bytes_rcvd >= datalen) { +bad_xfer_req: printf( + "ERROR: SIM requests more xfer after we received all expected data\n"); + return; + } + while (bytes_rcvd < datalen) { + rc = rx_sim_byte_hl(); + if (rc < 0) + return; + data[bytes_rcvd++] = rc; + } + continue; + } + if ((rc & 0xFE) == ack1) { + if (bytes_rcvd >= datalen) + goto bad_xfer_req; + rc = rx_sim_byte_hl(); + if (rc < 0) + return; + data[bytes_rcvd++] = rc; + continue; + } + printf("ERROR: non-understood procedure byte %02X\n", rc); + return; + } } void