From c5d509d1fa37a25a4bff014d97f3fafe95a68d8e Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Sun, 3 Jan 2021 16:36:16 +0100 Subject: [PATCH] Add "stc89a" protocol This protocol variant is designed for newer STC89 series chips with BSL version 7.x.x. The new firmware uses framing with 16-bit checksum. This protocol variant is currently untested because I don't have any hardware at hand. Addresses #50, #40. --- stcgal/frontend.py | 5 ++++- stcgal/protocols.py | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/stcgal/frontend.py b/stcgal/frontend.py index bc7ad76..1cf0bf0 100644 --- a/stcgal/frontend.py +++ b/stcgal/frontend.py @@ -26,6 +26,7 @@ import stcgal import serial from stcgal.utils import BaudType from stcgal.protocols import Stc89Protocol +from stcgal.protocols import Stc89AProtocol from stcgal.protocols import Stc12AProtocol from stcgal.protocols import Stc12BProtocol from stcgal.protocols import Stc12Protocol @@ -49,6 +50,8 @@ class StcGal: """Initialize protocol backend""" if opts.protocol == "stc89": self.protocol = Stc89Protocol(opts.port, opts.handshake, opts.baud) + elif opts.protocol == "stc89a": + self.protocol = Stc89AProtocol(opts.port, opts.handshake, opts.baud) elif opts.protocol == "stc12a": self.protocol = Stc12AProtocol(opts.port, opts.handshake, opts.baud) elif opts.protocol == "stc12b": @@ -228,7 +231,7 @@ def cli(): parser.add_argument("-a", "--autoreset", help="cycle power automatically by asserting DTR", action="store_true") parser.add_argument("-r", "--resetcmd", help="shell command for board power-cycling (instead of DTR assertion)", action="store") parser.add_argument("-P", "--protocol", help="protocol version (default: auto)", - choices=["stc89", "stc12a", "stc12b", "stc12", "stc15a", "stc15", "stc8", "usb15", "auto"], default="auto") + choices=["stc89", "stc89a", "stc12a", "stc12b", "stc12", "stc15a", "stc15", "stc8", "usb15", "auto"], default="auto") parser.add_argument("-p", "--port", help="serial port device", default="/dev/ttyUSB0") parser.add_argument("-b", "--baud", help="transfer baud rate (default: 19200)", type=BaudType(), default=19200) parser.add_argument("-l", "--handshake", help="handshake baud rate (default: 2400)", type=BaudType(), default=2400) diff --git a/stcgal/protocols.py b/stcgal/protocols.py index f43a6b8..cf05d9f 100644 --- a/stcgal/protocols.py +++ b/stcgal/protocols.py @@ -225,6 +225,8 @@ class StcBaseProtocol(ABC): mcu_name += "E" if self.status_packet[17] < 0x70 else "W" self.model = self.model._replace(name = mcu_name) + self.bsl_version = self.status_packet[17] + def get_status_packet(self): """Read and decode status packet""" @@ -383,6 +385,10 @@ class StcAutoProtocol(StcBaseProtocol): else: self.protocol_name = None + # STC89 devices with BSL version 7.x.x have a slightly different protocol + if self.protocol_name == "stc89" and self.bsl_version >= 0x70: + self.protocol_name = "stc89a" + def initialize_options(self, status_packet): raise NotImplementedError @@ -607,6 +613,22 @@ class Stc89Protocol(StcBaseProtocol): print("done") +class Stc89AProtocol(Stc89Protocol): + """STC89 protocol variant with different framing""" + + def extract_payload(self, packet): + """Verify the checksum of packet and return its payload""" + + packet_csum, = struct.unpack(">H", packet[-3:-1]) + calc_csum = sum(packet[2:-3]) & 0xffff + if packet_csum != calc_csum: + self.dump_packet(packet) + raise StcFramingException("packet checksum mismatch") + + payload = StcBaseProtocol.extract_payload(self, packet) + return payload[:-3] + + class Stc12AOptionsMixIn: def program_options(self): print("Setting options: ", end="")