FreeCalypso > hg > freecalypso-tools
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; |