FreeCalypso > hg > fc-sim-tools
annotate serial/collect_atr.c @ 99:97ba63d9361a
scripts/fcsim1-sst: turn off STK & OTA services
In the initial unprogrammed state of the cards from Grcard, SST has
services 25 through 29 set to allocated and activated. However,
these cards appear to not actually support OTA, ENVELOPE commands
do nothing (just return SW 9000), and they were never observed
issuing any proactive SIM commands, even after a feature-generous
TERMINAL PROFILE. Therefore, let's list these STK & OTA services
as allocated, but not activated in our FCSIM1 SST.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 05 May 2021 04:26:07 +0000 |
parents | 1d96f3b4f155 |
children |
rev | line source |
---|---|
38
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This module contains the code for collecting ATR bytes from the SIM, |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * as well as subsequent byte Rx. |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 */ |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <sys/types.h> |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <sys/time.h> |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <sys/errno.h> |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <stdio.h> |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <stdlib.h> |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <unistd.h> |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 extern int target_fd; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #define MAX_ATR_BYTES 33 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 extern unsigned char inverse_coding_table[256]; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 u_char atr_buf[MAX_ATR_BYTES]; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 unsigned atr_length; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 int inverse_coding; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 void |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 invert_bytes(buf, nbytes) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 u_char *buf; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 unsigned nbytes; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 unsigned n; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 for (n = 0; n < nbytes; n++) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 buf[n] = inverse_coding_table[buf[n]]; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 collect_bytes_from_sim(buf, expect_len) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 u_char *buf; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 unsigned expect_len; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 fd_set fds; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 struct timeval tv; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 unsigned rcvd; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 int cc; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 for (rcvd = 0; rcvd < expect_len; ) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 FD_ZERO(&fds); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 FD_SET(target_fd, &fds); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 tv.tv_sec = 2; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 tv.tv_usec = 0; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 cc = select(target_fd+1, &fds, NULL, NULL, &tv); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 if (cc < 0) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 if (errno == EINTR) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 continue; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 perror("select"); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 return(-1); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 if (cc < 1) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 fprintf(stderr, |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 "error: timeout waiting for byte(s) from SIM\n"); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 return(-1); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 cc = read(target_fd, buf + rcvd, expect_len - rcvd); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 if (cc <= 0) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 perror("read after successful select"); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 return(-1); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 rcvd += cc; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 if (inverse_coding) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 invert_bytes(buf, rcvd); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 return(0); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 check_atr_tck() |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 unsigned b, p; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 b = 0; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 for (p = 1; p < atr_length; p++) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 b ^= atr_buf[p]; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 if (b) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 fprintf(stderr, "error: ATR checksum is bad\n"); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 return(-1); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 return(0); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 collect_atr() |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 int rc; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 unsigned count, y, nhist, have_tck; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 rc = collect_bytes_from_sim(atr_buf, 2); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 if (rc < 0) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 return(rc); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 if (atr_buf[0] == 0x3B) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 /* direct convention */ |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 } else if (atr_buf[0] == 0x03) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 /* inverse convention */ |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 inverse_coding = 1; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 atr_buf[0] = 0x3F; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 atr_buf[1] = inverse_coding_table[atr_buf[1]]; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 } else { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 fprintf(stderr, |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 "error: received TS=0x%02X, matches neither convention\n", |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 atr_buf[0]); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 return(-1); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 atr_length = 2; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 nhist = atr_buf[1] & 0x0F; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 y = atr_buf[1] & 0xF0; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 have_tck = 0; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 while (y) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 count = 0; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 if (y & 0x10) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 count++; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 if (y & 0x20) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 count++; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 if (y & 0x40) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 count++; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 if (y & 0x80) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 count++; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 if (atr_length + count > MAX_ATR_BYTES) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 atr_too_long: fprintf(stderr, "error: ATR exceeds 33 byte limit\n"); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 return(-1); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 rc = collect_bytes_from_sim(atr_buf + atr_length, count); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 if (rc < 0) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 return(rc); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 atr_length += count; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 if (y & 0x80) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 y = atr_buf[atr_length-1] & 0xF0; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 if (atr_buf[atr_length-1] & 0x0F) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 have_tck = 1; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 } else |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 y = 0; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 count = nhist + have_tck; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 if (count) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 if (atr_length + count > MAX_ATR_BYTES) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 goto atr_too_long; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 rc = collect_bytes_from_sim(atr_buf + atr_length, count); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 if (rc < 0) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 return(rc); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 atr_length += count; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 if (have_tck) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 return check_atr_tck(); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 else |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 return 0; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 void |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 print_atr(head) |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 char *head; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 unsigned n; |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 fputs(head, stdout); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 for (n = 0; n < atr_length; n++) { |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 printf(" %02X", atr_buf[n]); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 } |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 putchar('\n'); |
1d96f3b4f155
serial: started with fcsim-serial-atr
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 } |