FreeCalypso > hg > freecalypso-tools
comparison target-utils/loadagent/binflash.c @ 660:b34384991094
loadagent: implemented binary flash programming
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 04 Mar 2020 06:51:52 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
659:761e8b0c65b0 | 660:b34384991094 |
---|---|
1 /* | |
2 * Here we are going to implement our new binary protocol | |
3 * for flash programming. | |
4 */ | |
5 | |
6 #include "types.h" | |
7 | |
8 void | |
9 binary_flash_prog_main(program_func) | |
10 int (*program_func)(); | |
11 { | |
12 u8 buf[2048] __attribute__ ((aligned (2))); | |
13 u32 flash_offset; | |
14 unsigned nbytes, p; | |
15 int c; | |
16 | |
17 for (;;) { | |
18 do | |
19 c = serial_in_poll(); | |
20 while (c < 0); | |
21 if (c == 0x04) | |
22 return; | |
23 if (c != 0x01) { | |
24 serial_out(0x15); /* NAK */ | |
25 printf("ERROR: invalid command opcode\n"); | |
26 return; | |
27 } | |
28 /* receive header */ | |
29 for (p = 0; p < 6; p++) { | |
30 c = serial_in_timeout(1000000); /* 0.6 s */ | |
31 if (c < 0) { | |
32 intermediate_timeout: serial_out(0x15); /* NAK */ | |
33 printf("ERROR: timeout receiving command\n"); | |
34 return; | |
35 } | |
36 buf[p] = c; | |
37 } | |
38 flash_offset = ((u32) buf[0] << 24) | | |
39 ((u32) buf[1] << 16) | | |
40 ((u32) buf[2] << 8) | | |
41 (u32) buf[3]; | |
42 if (flash_offset & 1) { | |
43 serial_out(0x15); /* NAK */ | |
44 printf("ERROR: odd flash offset\n"); | |
45 return; | |
46 } | |
47 nbytes = ((u32) buf[4] << 8) | (u32) buf[5]; | |
48 if (nbytes & 1) { | |
49 serial_out(0x15); /* NAK */ | |
50 printf("ERROR: odd byte count\n"); | |
51 return; | |
52 } | |
53 if (nbytes > sizeof buf) { | |
54 serial_out(0x15); /* NAK */ | |
55 printf("ERROR: byte count exceeds buffer\n"); | |
56 return; | |
57 } | |
58 /* receive data */ | |
59 for (p = 0; p < nbytes; p++) { | |
60 c = serial_in_timeout(1000000); /* 0.6 s */ | |
61 if (c < 0) | |
62 goto intermediate_timeout; | |
63 buf[p] = c; | |
64 } | |
65 c = program_func(flash_offset, nbytes >> 1, buf); | |
66 if (c < 0) | |
67 return; | |
68 serial_out(0x06); /* ACK */ | |
69 } | |
70 } |