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.
This commit is contained in:
		@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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="")
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user