FreeCalypso > hg > freecalypso-tools
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 } |