annotate target-utils/loadagent/binload.c @ 922:3152e23399a2

document SE K2x0 FFS quirks and our support for them
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 02 Jan 2023 00:50:19 +0000
parents 3229940734e5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
648
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Here we are going to implement our new binary protocol for RAM loading
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * for a faster version of fc-xram.
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 */
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include "types.h"
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 void
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 cmd_binary_memload()
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 {
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 int state, recptr, extlen, datalen;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 u8 record[256], cksum;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 u32 addr;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 u16 rec_count;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 int c, i;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 rec_count = 0;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 for (state = 0; ; ) {
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 switch (state) {
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 case 0:
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 c = serial_in_timeout(3000000); /* 1.8 s */
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 if (c < 0 || c == 0x04)
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 return;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 if (c == 0x05) {
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 serial_out(0x06); /* ACK */
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 serial_out(rec_count >> 8);
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 serial_out(rec_count);
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 continue;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 }
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 if (c >= 6) {
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 record[0] = c;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 extlen = c + 1;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 datalen = c - 5;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 recptr = 1;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 state = 1;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 continue;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 }
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 serial_out(0x15); /* NAK */
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 state = 2;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 continue;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 case 1:
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 c = serial_in_timeout(1000000); /* 0.6 s */
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 if (c < 0) {
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 serial_out(0x15); /* NAK */
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 state = 2;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 continue;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 }
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 record[recptr++] = c;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 if (recptr < extlen)
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 continue;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 /* verify checksum */
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 cksum = 0;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 for (i = 0; i < extlen; i++)
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 cksum += record[i];
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 if (cksum != 0xFF) {
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 serial_out(0x15); /* NAK */
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 state = 2;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 continue;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 }
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 addr = ((u32)record[1] << 24) |
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 ((u32)record[2] << 16) |
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 ((u32)record[3] << 8) |
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 (u32)record[4];
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 memcpy(addr, record + 5, datalen);
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 rec_count++;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 state = 0;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 continue;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 default:
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 c = serial_in_timeout(10000000); /* 6.15 s */
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 if (c < 0)
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 return;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 serial_out_if_empty(0x15); /* NAK */
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 continue;
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 }
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 }
3229940734e5 loadagent: binary memload command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 }