comparison target-utils/loadagent/binload.c @ 648:3229940734e5

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