Abandon all hope
Well I've just wasted 3 days trying to find out one simple thing = how many
bytes are in the data blocks the IDE downloader sends over to the bootloader
in each packet when burning a sketch in Flash, but the answer appears to be
buried under level upon level of obfuscation. Doesn't anybody know this ????
1. I've looked at the STK500 communications protocol in appnote AVR068, but
clearly the bootloader doesn't actually use it.
2. anaysis of the source code of 2 bootloaders indicates, at best, they
use mainly the STK500 #defines, such as STK_SET_PARAMETER, but not the
actual packet protocol.
3. I've also looked at the source code for avrdude, but that's just about
indecipherable, AFAIAC. From the best I can tell, avrdude must load in
some config files that actually tell it what to do for different AVR
chips, and then this info is probably in some kind of coded format.
4. I also wrote a sketch to run on a 2nd Arduino chip that captures the
RS232 comms from the IDE to the bootloader [simple IDE "Blink" example
was captured below], but cannot really rationalize the data captured
with what the bootloader seems to expect to be receiving, so ????
The capture sketch simply dumps the incoming data into a char buffer, and
I should think the Arduino should be fast enough to receive at 57600
without dropping characters.
Plus, I can't even see in the bootloader code where it expects a 0x84 and
answers with a 'K', on startup.
I'm stumped.
In following, a '.' was inserted in the buffer every 10-msec, printable
chars are shown as 1-column ASCII, eg '@' or 'R', and nonprintable as
their Hex value, eg 84 = 0x84 and F4 = 0xF4.
Buffer Dump ... RX line
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . 84 . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . 84 . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . 84 . 00 F4 . . 90 FF . 20 00 00 00 FC 0F 08
00 00 80 . . 01 H 86 FF . 80 . . A1 . . 83 F4 F4 .
83 FC F4 . . 83 F4 F4 . 81 FC F4 . . 00 80 . 04 ( 02
02 X . @ EB @ E9 @ EB @ E8 @ EB @ E9 @ E8 @ EB @ <-- '@' = set_parameter
E9 @ E8 @ E8 @ E8 @ EB @ E9 @ h @ E9 @ E9 @ E8 @
EB @ EB @ E9 @ E9 @ E9 @ E9 00 00 80 A0 E0 00 00 80 C0
E0 00 . 00 80 . . 00 F4 . 05 ( 85 01 A0 01 01 01 ! ! <-- '!!!' = monitor cmds
! ! 8C 8C 8C 94 R . 1 10 12 10 00 02 04 00 01 00 00 94 <-- 'R' = chip_erase
02 00 00 00 @ BC o B1 F7 C1 q AC 8C , 08 H 88 84 R C0 <-- 'q' = read_data
8C 0C H CA 84 ` 03 0E 03 @ 08 80 . . 10 F4 . . 04 (
8A 84 03 0A E4 C7 0C l A8 @ 8C l I ` C7 0C l A9 @ A4 <-- '`' = prog_flash
C2 . X 80 4 9E 9E ' 01 f 9D AF AF BD BD ! 01 08 00 14
C0 15 @ $ 00 1 0 97 CE A6 84 FE 89 0 90 09 ( 01 ( 00 <-- '@' = set_parameter
FF . . 80 F4 . . 05 ( , 01 , 01 08 00 08 00 15 C0 14
00 1 3 A1 01 ( 00 , 00 , 8C F4 B5 B5 t t 4 8D D2 ! <-- 't' = read_page
A1 01 . E0 0E 08 00 0A 00 + C0 15 P a 01 E7 C1 90 & & <-- 'P' = enter_progmode,
<-- 'a' = prog_data
DE E2 E8 E0 E5 % & ' C6 FF . . 00 F4 . . 04 ( j 5
BD 1D A1 0F F0 CD 08 05 80 04 C0 14 C0 15 D0 n @ G 0E 8B
3 BD EE v 1D O CF 09 1 5 j 5 BF = A1 i 0D FB 01 F1
8 0 . 00 C0 C0 83 80 00 00 20 02 06 89 89 C8 88 F4 . .
00 80 . 04 ( D r . b C4 r b 04 AF 8C 08 D CC 8C " <-- 'r' = read_fuse
08 89 ( 08 D C4 8C 08 D 89 s 08 88 ( EC 8C 08 D C4 c
08 88 ( 08 89 ( 08 D 84 84 C3 20 04 ^ L l 90 0D @ 4
. E3 @ . . 08 F4 . 04 ( 09 AA C4 8 m 8 CC 1 95 B2
5 . H 88 J 94 BE E1 AF 0E 0A E8 * ? \ N l 90 B0 FB
05 08 ) 0D 80 4 18 F2 05 8D C0 A8 EC W : 85 86 B C6 A4
C0 A1 i F9 i 8C D 8C . . 00 @ . . 05 ( 01 08 08 FD
08 85 CB ( 08 00 89 } 08 7F r b C4 FD 08 C5 ~ A6 9E EC
FE = o C . t B9 95 A3 0A 08 AA 00 09 u D5 / AF AD 0D
1D 03 02 0C l 08 80 b 97 01 B7 89 . . 00 81 . . 05 20
C3 . . 00 F4 . 04 ( F4 . . . 00 F4 . 05 ( F4 . .
. 80 F4 . 04 ( F4 . . . 80 F4 . . 05 ( F4 . . 00
F4 . . 07 ( F4 . . . 00 F4 . 04 ( F4 . . . 08 F4
. . 04 ( F4 . . 20 F4 . . 05 ( F4 . . . 00 81 .
04 ! F4 . . @ . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
Buffer Dump ... TX line
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . K . . . . . . . . . . . <-- 'K' = 0x4B
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . K
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . K . 1B FA . 1B FA . . K
. . K . K . . k ' FF . 0B FA . . 0B FA . . 0B
FA . 0B FA . . K . . FB . FA . . K . . FB . FA
. K . . . FB FA . . K . . . FB FA . . K . .
. FB FA . . K . . FB . FA . K . . . FB . FA .
K . . . FB FA . . K . . FB FA . K . . + 9B (
EB ( EB ( EB ( EB ( EB ( EB ( EB ( EB ( EB ( EB (
EB ( EB ( EB ( EB ( EB ( K ( EB ( EB ( EB ( EB (
. EB ( EB ( EB ( EB ( EB 08 08 ( 8 08 08 08 8 08 18
08 08 H . K . . 1B ( 18 ( ) ) ) 09 08 08 18 08 08
00 00 00 00 84 B a ( H 08 08 B 84 00 B . 08 08 08 95
ED 8E 7F = 1 \ 8C EC 0C < : 0A Z F6 C5 \ 1C | 1A Z
E6 i 1E i 94 ! FA . . K . ; 9C , k C4 a L , 8B
8 8C , . k C4 a L , 8B 08 ' C6 A0 84 / ' A7 $ E5
D2 D2 Z z z B e Z F 95 A4 9D A4 85 8C E3 EB E3 CC 0A
98 02 1B EB a a X 19 Z F FF . . K . . 0B 0A Z F
85 A4 8D 84 85 A4 8D 8C E3 EB a a Z 8C 0A Z 00 9D BD 9D
BD 9D 9D A7 A0 ) o A3 FC n X 18 Z 8C 85 A4 8D D4 X E2
04 B4 BC BD . : 9C ' CA 20 E3 EB 1 FA . K . . 0B A8
E1 EB F1 FB 1B D0 n X 18 Z 8C 85 A4 8D D4 X E2 04 B4 BC
BD : 9C ' CA 20 E3 EB 1 8 . BD EB F1 FB Y # _ 8C 1E
N 8C CC 8C F7 10 EB 9E 9F F7 20 + 88 y y FA . . K .
1B , ^ < DE < AD 8E 18 C4 b 8E 0A 18 88 18 . 18 C4 b
8E 18 C4 b 8E 18 89 18 9C 8E 18 C4 z s 18 89 18 18 88 18
18 C4 B 88 18 J 86 20 1C 8C 94 B7 94 C5 < FA . . K .
+ . 85 A < 8E = q 0 m u 00 / + 85 a T / EF n
Y 18 Y / F1 00 1C F8 B7 94 C5 94 B7 B4 C5 < [ ) 0 0C
01 ! . 0A 1F 1A 0E Z 8B I E5 D2 . . DA O . K . .
+ 0C 85 5 0C 85 19 B 8A y 95 , 19 C4 A5 95 0C A5 19 b
; AC BC 5 0 m E7 n 1D F4 ! o 09 Y . 8C A5 9E w 7F
A5 k i ! CC , 0B 08 s i 08 DF K . . K . FB C1 .
. K . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .