FreeCalypso > hg > freecalypso-tools
annotate target-utils/simagent/tx.c @ 778:3ba64341137b
simagent: bare Tx works with extra delays
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 13 Mar 2021 19:31:53 +0000 |
parents | fac3176de18d |
children | 8a94593fb7ef |
rev | line source |
---|---|
776
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This module implements transmission of bytes toward the SIM. |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 */ |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 #include "types.h" |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include "simregs.h" |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 extern u16 conf1_reg; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 send_to_sim(bytes, count) |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 u8 *bytes; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 unsigned count; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 { |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 unsigned n, timeout; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 SIMREGS.conf1 = conf1_reg |= SIM_CONF1_TXRX; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 if (count == 1) |
778
3ba64341137b
simagent: bare Tx works with extra delays
Mychaela Falconia <falcon@freecalypso.org>
parents:
776
diff
changeset
|
18 wait_ARM_cycles(30000); |
3ba64341137b
simagent: bare Tx works with extra delays
Mychaela Falconia <falcon@freecalypso.org>
parents:
776
diff
changeset
|
19 (void) SIMREGS.it; |
776
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 for (n = 0; ; ) { |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 SIMREGS.dtx = bytes[n++]; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 if (n == count) { |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 SIMREGS.conf1 = conf1_reg &= ~SIM_CONF1_TXRX; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 return(0); |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 } |
778
3ba64341137b
simagent: bare Tx works with extra delays
Mychaela Falconia <falcon@freecalypso.org>
parents:
776
diff
changeset
|
26 wait_ARM_cycles(30000); |
776
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 for (timeout = 12000; timeout; timeout--) |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 if (SIMREGS.it & SIM_IT_ITTX) |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 break; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 if (!timeout) { |
778
3ba64341137b
simagent: bare Tx works with extra delays
Mychaela Falconia <falcon@freecalypso.org>
parents:
776
diff
changeset
|
31 printf("ERROR: SIM interface Tx timeout on byte %u\n", |
3ba64341137b
simagent: bare Tx works with extra delays
Mychaela Falconia <falcon@freecalypso.org>
parents:
776
diff
changeset
|
32 n); |
776
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 return(-1); |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 } |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 } |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 } |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 cmd_tx(argstr) |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 char *argstr; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 { |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 u8 bytes[5]; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 int rc; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 rc = decode_hex_string_arg(argstr, bytes, sizeof bytes); |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 if (rc < 0) |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 return; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 if (rc == 0) { |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 printf("ERROR: empty hex string argument\n"); |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 return; |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 } |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 send_to_sim(bytes, rc); |
fac3176de18d
simagent: bare Tx implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 } |