commit d8d8053101292a72f634e4aa888e4c796f48c640 from: Sven M. Hallberg date: Tue Jan 03 20:38:50 2023 UTC comprehensively document (supposed) firmware state machine commit - 05bfbe60e7089fe795c8cbe62949a35a605de6ea commit + d8d8053101292a72f634e4aa888e4c796f48c640 blob - f54683f98483759bf77294342b46070776b417fc blob + 68d770f61b16ef5842d5e462cdba5d61701aedb9 --- notes +++ notes @@ -85,19 +85,152 @@ checksum calculation: result is a 6-bit number. -firmware states: - no_prog - -> transmission_start, when START_CHAR received - empty_prog (initial state) - -> transmission_start, when START_CHAR received - transmission_start - -> transmission_start, when START_CHAR received - -> line_prog, if own serial number received - -> previous state otherwise - line_prog - -> transmission_start, when START_CHAR received - -> prog_ready, when END_CHAR received and checksum OK - -> empty_prog, when END_CHAR received and checksum fails - -> empty_prog, when END_CHAR received while program_buf_pos <= 2 - prog_ready - -> transmission_start, when START_CHAR received +FIRMWARE STATE MACHINE: + +internally defined state names: + + - no_prog + - empty_prog + - transmission_start + - line_prog + - prog_ready + +the actual state is a pair (state, prev_state), for a total of 25 combinations. +however, most combinations are unreachable. +transitions: + + (empty_prog, no_prog) REACHABLE INITIAL + - START_CHAR -> (transmission_start, empty_prog) + - own chip ID -> (empty_prog, no_prog) & report (not programmed) + - other input -> (empty_prog, no_prog) + + (transmission_start, empty_prog) REACHABLE + - START_CHAR -> (transmission_start, empty_prog) + - own chip ID -> (line_prog, no_prog) + - other chip ID -> (empty_prog, no_prog) + XXX following program bytes could be interpreted in (empty_prog, no_prog) + + (line_prog, no_prog) REACHABLE + - START_CHAR -> (transmission_start, line_prog) + - END_CHAR, nothing received -> (empty_prog, no_prog) & reset/success + - END_CHAR, 1 byte received -> (empty_prog, no_prog) & reset/success + - END_CHAR, 2 bytes received -> (empty_prog, no_prog) & reset/success + - END_CHAR, checksum OK -> (prog_ready, no_prog) & enable/success + - END_CHAR, checksum bad -> (empty_prog, no_prog) & reset/failure + - other input -> (line_prog, no_prog) & store input in buffer + + (prog_ready, no_prog) REACHABLE + - START_CHAR -> (transmission_start, prog_ready) + - own chip ID -> (prog_ready, no_prog) & report + - other input -> (prog_ready, no_prog) + - program error -> (empty_prog, no_prog) + + (transmission_start, prog_ready) REACHABLE + - START_CHAR -> (transmission_start, prog_ready) + - own chip ID -> (line_prog, no_prog) + - other chip ID -> (prog_ready, no_prog) + XXX following program bytes could be interpreted in (prog_ready, no_prog) + + (transmission_start, line_prog) REACHABLE NONSTD + - START_CHAR -> (transmission_start, line_prog) + - own chip ID -> (line_prog, no_prog) + - other chip ID -> (line_prog, no_prog) + XXX this transition lets us write the same program to many chips at once! + START_CHAR, ID1, START_CHAR, ID2, START_CHAR, XX, (program)... + + (empty_prog, empty_prog) + - START_CHAR -> (transmission_start, empty_prog) + - own chip ID -> (empty_prog, empty_prog) & report (not programmed) + - other input -> (empty_prog, empty_prog) + + (empty_prog, transmission_start) + - START_CHAR -> (transmission_start, transmission_start) + - own chip ID -> (empty_prog, transmission_start) & report (not programmed) + - other input -> (empty_prog, transmission_start) + + (empty_prog, line_prog) + - START_CHAR -> (transmission_start, line_prog) + - own chip ID -> (empty_prog, line_prog) & report (not programmed) + - other input -> (empty_prog, line_prog) + + (empty_prog, prog_ready) + - START_CHAR -> (transmission_start, prog_ready) + - own chip ID -> (empty_prog, prog_ready) & report (not programmed) + - other input -> (empty_prog, prog_ready) + + (transmission_start, no_prog) + - START_CHAR -> (transmission_start, transmission_start) + - own chip ID -> (line_prog, no_prog) + - other chip ID -> (no_prog, no_prog) + + (transmission_start, transmission_start) + - START_CHAR -> (transmission_start, transmission_start) + - own chip ID -> (line_prog, no_prog) + - other chip ID -> (transmission_start, no_prog) + + (line_prog, empty_prog) + - START_CHAR -> (transmission_start, empty_prog) + - END_CHAR, short input -> (empty_prog, empty_prog) & reset/success + - END_CHAR, checksum OK -> (prog_ready, empty_prog) & enable/success + - END_CHAR, checksum bad -> (empty_prog, empty_prog) & reset/failure + - other input -> (line_prog, empty_prog) & buffer input + + (line_prog, transmission_start) + - START_CHAR -> (transmission_start, transmission_start) + - END_CHAR, short input -> (empty_prog, transmission_start) & reset/success + - END_CHAR, checksum OK -> (prog_ready, transmission_start) & enable/success + - END_CHAR, checksum bad -> (empty_prog, transmission_start) & reset/failure + - other input -> (line_prog, transmission_start) & buffer input + + (line_prog, line_prog) + - START_CHAR -> (transmission_start, line_prog) + - END_CHAR, short input -> (empty_prog, line_prog) & reset/success + - END_CHAR, checksum OK -> (prog_ready, line_prog) & enable/success + - END_CHAR, checksum bad -> (empty_prog, line_prog) & reset/failure + - other input -> (line_prog, line_prog) & buffer input + + (line_prog, prog_ready) + - START_CHAR -> (transmission_start, prog_ready) + - END_CHAR, short input -> (empty_prog, prog_ready) & reset/success + - END_CHAR, checksum OK -> (prog_ready, prog_ready) & enable/success + - END_CHAR, checksum bad -> (empty_prog, prog_ready) & reset/failure + - other input -> (line_prog, prog_ready) & buffer input + + (prog_ready, empty_prog) + - START_CHAR -> (transmission_start, empty_prog) + - own chip ID -> (prog_ready, empty_prog) & report + - other input -> (prog_ready, empty_prog) + - program error -> (empty_prog, empty_prog) + + (prog_ready, transmission_start) + - START_CHAR -> (transmission_start, transmission_start) + - own chip ID -> (prog_ready, transmission_start) & report + - other input -> (prog_ready, transmission_start) + - program error -> (empty_prog, transmission_start) + + (prog_ready, line_prog) + - START_CHAR -> (transmission_start, line_prog) + - own chip ID -> (prog_ready, line_prog) & report + - other input -> (prog_ready, line_prog) + - program error -> (empty_prog, line_prog) + + (prog_ready, prog_ready) + - START_CHAR -> (transmission_start, prog_ready) + - own chip ID -> (prog_ready, prog_ready) & report (programmed) + - other input -> (prog_ready, prog_ready) + - program error -> (empty_prog, prog_ready) + + (no_prog, no_prog) + - START_CHAR -> (transmission_start, no_prog) + + (no_prog, empty_prog) + - START_CHAR -> (transmission_start, empty_prog) + + (no_prog, transmission_start) + - START_CHAR -> (transmission_start, transmission_start) + + (no_prog, line_prog) + - START_CHAR -> (transmission_start, line_prog) + + (no_prog, prog_ready) + - START_CHAR -> (transmission_start, prog_ready)