FreeCalypso > hg > freecalypso-tools
annotate loadtools/simatr.c @ 1012:11391cb6bdc0
patch from fixeria: doc change from SE K2x0 to K2xx
Since their discovery in late 2022, Sony Ericsson K200 and K220 phones
were collectively referred to as SE K2x0 in FreeCalypso documentation.
However, now that SE K205 has been discovered as yet another member
of the same family (same PCBA in different case), it makes more sense
to refer to the whole family as SE K2xx.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 23 Sep 2024 12:23:20 +0000 |
parents | a31ae776de6e |
children |
rev | line source |
---|---|
790
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This module implements the stage in fc-simint where ATR bytes |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * received from simagent are validated. |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 */ |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <sys/types.h> |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <stdio.h> |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdlib.h> |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 extern int sim_allow_spenh; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 extern u_char sim_atr[]; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 extern unsigned sim_atr_len; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 void |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 sim_atr_validate() |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 unsigned b, p, y, nhist, have_tck; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 if (sim_atr_len < 2) { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 too_short: fprintf(stderr, "error: ATR from simagent is too short\n"); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 exit(1); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 } |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 b = sim_atr[1]; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 p = 2; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 nhist = b & 0xF; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 y = b & 0xF0; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 have_tck = 0; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 while (y) { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 if (y & 0x10) { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 if (p >= sim_atr_len) |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 goto too_short; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 p++; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 } |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 if (y & 0x20) { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 if (p >= sim_atr_len) |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 goto too_short; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 p++; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 } |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 if (y & 0x40) { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 if (p >= sim_atr_len) |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 goto too_short; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 p++; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 } |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 if (y & 0x80) { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 if (p >= sim_atr_len) |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 goto too_short; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 b = sim_atr[p++]; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 y = b & 0xF0; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 if (b & 0x0F) |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 have_tck = 1; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 } else |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 y = 0; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 } |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 p += nhist + have_tck; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 if (p > sim_atr_len) |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 goto too_short; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 if (p < sim_atr_len) { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 fprintf(stderr, "error: ATR from simagent is too long\n"); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 exit(1); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 } |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 if (!have_tck) |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 return; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 /* validate TCK */ |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 b = 0; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 for (p = 1; p < sim_atr_len; p++) |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 b ^= sim_atr[p]; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 if (b) { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 fprintf(stderr, "error: ATR checksum is bad\n"); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 exit(1); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 } |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 } |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 void |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 sim_spenh_logic() |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 static char *targv[2] = {"spenh", 0}; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 if (sim_atr_len < 3 || !(sim_atr[1] & 0x10) || (sim_atr[2] < 0x94)) { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 printf("ATR indicates no support for speed enhancement\n"); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 return; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 } |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 if (!sim_allow_spenh) { |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 printf("Speed enhancement disabled with -n option\n"); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 return; |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 } |
791
a31ae776de6e
fc-simint: tell the user when we are requesting spenh
Mychaela Falconia <falcon@freecalypso.org>
parents:
790
diff
changeset
|
87 printf("Requesting SIM speed enhancement\n"); |
790
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 tpinterf_make_cmd(targv); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 if (tpinterf_send_cmd() < 0) |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 exit(1); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 if (tpinterf_pass_output(10)) |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 exit(1); |
0bbe0213812d
fc-simint put together, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 } |