comparison target-utils/simagent/exchange.c @ 785:56506e9165bc

simagent: Rx data direction implemented for exchange
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 13 Mar 2021 22:17:39 +0000
parents 839bf41e7be0
children
comparison
equal deleted inserted replaced
784:839bf41e7be0 785:56506e9165bc
82 82
83 static void 83 static void
84 exchange_data_in(ins, datalen) 84 exchange_data_in(ins, datalen)
85 unsigned ins, datalen; 85 unsigned ins, datalen;
86 { 86 {
87 printf("ERROR: data in mode not implemented yet\n"); 87 int rc;
88 unsigned null_count, bytes_rcvd, ack, ack1;
89 u8 data[256];
90
91 if (!datalen)
92 datalen = 256;
93 ack = ins & 0xFE;
94 ack1 = ~ins & 0xFE;
95 bytes_rcvd = 0;
96 null_count = 0;
97 for (;;) {
98 rc = rx_sim_byte_hl();
99 if (rc < 0)
100 return;
101 if (rc == 0x60) {
102 null_count++;
103 if (null_count >= 32) {
104 printf(
105 "ERROR: too many stalling NULL bytes received from SIM\n");
106 return;
107 }
108 continue;
109 }
110 if ((rc & 0xF0) == 0x60 || (rc & 0xF0) == 0x90) {
111 finish_sw(rc, data, bytes_rcvd);
112 return;
113 }
114 if ((rc & 0xFE) == ack) {
115 if (bytes_rcvd >= datalen) {
116 bad_xfer_req: printf(
117 "ERROR: SIM requests more xfer after we received all expected data\n");
118 return;
119 }
120 while (bytes_rcvd < datalen) {
121 rc = rx_sim_byte_hl();
122 if (rc < 0)
123 return;
124 data[bytes_rcvd++] = rc;
125 }
126 continue;
127 }
128 if ((rc & 0xFE) == ack1) {
129 if (bytes_rcvd >= datalen)
130 goto bad_xfer_req;
131 rc = rx_sim_byte_hl();
132 if (rc < 0)
133 return;
134 data[bytes_rcvd++] = rc;
135 continue;
136 }
137 printf("ERROR: non-understood procedure byte %02X\n", rc);
138 return;
139 }
88 } 140 }
89 141
90 void 142 void
91 cmd_exchange(argstr) 143 cmd_exchange(argstr)
92 char *argstr; 144 char *argstr;