1304 lines
78 KiB
Python
Executable File
1304 lines
78 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#
|
|
# Copyright (c) 2013 Grigori Goronzy
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
# in the Software without restriction, including without limitation the rights
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
# furnished to do so, subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included in all
|
|
# copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
# SOFTWARE.
|
|
#
|
|
|
|
# stcgal - STC MCU serial bootloader flash programmer
|
|
|
|
"""
|
|
TODO:
|
|
- some more documentation / comments
|
|
- private member naming, other style issues
|
|
|
|
- Prepare for STC89/STC15 protocols
|
|
"""
|
|
|
|
import serial
|
|
import sys, os, time, struct
|
|
import argparse
|
|
import collections
|
|
|
|
DEBUG = False
|
|
|
|
class Utils:
|
|
@classmethod
|
|
def to_bool(self, val):
|
|
"""make sensible boolean from string or other type value"""
|
|
|
|
if isinstance(val, bool): return val
|
|
if isinstance(val, int): return bool(val)
|
|
if len(val) == 0: return False
|
|
return True if val[0].lower() == "t" or val[0] == "1" else False
|
|
|
|
@classmethod
|
|
def to_int(self, val):
|
|
"""make int from any value, nice error message if not possible"""
|
|
|
|
try: return int(val, 0)
|
|
except: raise ValueError("invalid integer")
|
|
|
|
class BaudType:
|
|
"""Check baud rate for validity"""
|
|
|
|
def __call__(self, string):
|
|
baud = int(string)
|
|
if baud not in serial.Serial.BAUDRATES:
|
|
raise argparse.ArgumentTypeError("illegal baudrate")
|
|
return baud
|
|
|
|
def __repr__(self): return "baudrate"
|
|
|
|
class MCUModelDatabase:
|
|
MCUModel = collections.namedtuple("MCUModel", ["name", "magic", "total", "code", "eeprom"])
|
|
|
|
models = (
|
|
MCUModel(name='STC15F2K08S2', magic=0xf401, total=65536, code=8192, eeprom=54272),
|
|
MCUModel(name='STC15F2K16S2', magic=0xf402, total=65536, code=16384, eeprom=46080),
|
|
MCUModel(name='STC15F2K24S2', magic=0xf403, total=65536, code=24576, eeprom=37888),
|
|
MCUModel(name='STC15F2K32S2', magic=0xf404, total=65536, code=32768, eeprom=29696),
|
|
MCUModel(name='STC15F2K40S2', magic=0xf405, total=65536, code=40960, eeprom=21504),
|
|
MCUModel(name='STC15F2K48S2', magic=0xf406, total=65536, code=49152, eeprom=13312),
|
|
MCUModel(name='STC15F2K56S2', magic=0xf407, total=65536, code=57344, eeprom=5120),
|
|
MCUModel(name='STC15F2K60S2', magic=0xf408, total=65536, code=61440, eeprom=1024),
|
|
MCUModel(name='IAP15F2K61S2', magic=0xf449, total=65536, code=62464, eeprom=0),
|
|
MCUModel(name='STC15L2K08S2', magic=0xf481, total=65536, code=8192, eeprom=54272),
|
|
MCUModel(name='STC15L2K16S2', magic=0xf482, total=65536, code=16384, eeprom=46080),
|
|
MCUModel(name='STC15L2K24S2', magic=0xf483, total=65536, code=24576, eeprom=37888),
|
|
MCUModel(name='STC15L2K32S2', magic=0xf484, total=65536, code=32768, eeprom=29696),
|
|
MCUModel(name='STC15L2K40S2', magic=0xf485, total=65536, code=40960, eeprom=21504),
|
|
MCUModel(name='STC15L2K48S2', magic=0xf486, total=65536, code=49152, eeprom=13312),
|
|
MCUModel(name='STC15L2K56S2', magic=0xf487, total=65536, code=57344, eeprom=5120),
|
|
MCUModel(name='STC15L2K60S2', magic=0xf488, total=65536, code=61440, eeprom=1024),
|
|
MCUModel(name='IAP15L2K61S2', magic=0xf4c9, total=65536, code=62464, eeprom=0),
|
|
MCUModel(name='STC15F404AD', magic=0xf40a, total=65536, code=4096, eeprom=9216),
|
|
MCUModel(name='STC15F408AD', magic=0xf40b, total=65536, code=8192, eeprom=5120),
|
|
MCUModel(name='STC15F412AD', magic=0xf40c, total=65536, code=12288, eeprom=1024),
|
|
MCUModel(name='IAP15F413AD', magic=0xf44d, total=65536, code=13312, eeprom=0),
|
|
MCUModel(name='STC15L404AD', magic=0xf48a, total=65536, code=4096, eeprom=9216),
|
|
MCUModel(name='STC15L408AD', magic=0xf48b, total=65536, code=8192, eeprom=5120),
|
|
MCUModel(name='STC15L412AD', magic=0xf48c, total=65536, code=12288, eeprom=1024),
|
|
MCUModel(name='IAP15L413AD', magic=0xf4cd, total=65536, code=13312, eeprom=0),
|
|
MCUModel(name='STC15W101SW', magic=0xf501, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC15W102SW', magic=0xf502, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC15W103SW', magic=0xf503, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC15W104SW', magic=0xf504, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='IAP15W105SW', magic=0xf545, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC15W101S', magic=0xf508, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC15W102S', magic=0xf50a, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC15W103S', magic=0xf50b, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC15W104S', magic=0xf50c, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='IAP15W105S', magic=0xf54d, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC15W201S', magic=0xf511, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC15W202S', magic=0xf512, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC15W203S', magic=0xf513, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC15W204S', magic=0xf514, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='IAP15W205S', magic=0xf555, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC15F100W', magic=0xf290, total=8192, code=512, eeprom=0),
|
|
MCUModel(name='STC15F101W', magic=0xf291, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC15F102W', magic=0xf292, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC15F103W', magic=0xf293, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC15F104W', magic=0xf294, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='IAP15F105W', magic=0xf2b5, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC15F100', magic=0xf298, total=8192, code=512, eeprom=0),
|
|
MCUModel(name='STC15F101', magic=0xf299, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC15F102', magic=0xf29a, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC15F103', magic=0xf29b, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC15F104', magic=0xf29c, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='IAP15F105', magic=0xf2bd, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC15L100W', magic=0xf2d0, total=8192, code=512, eeprom=0),
|
|
MCUModel(name='STC15L101W', magic=0xf2d1, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC15L102W', magic=0xf2d2, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC15L103W', magic=0xf2d3, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC15L104W', magic=0xf2d4, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='IAP15L105W', magic=0xf2f5, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC15L100', magic=0xf2d8, total=8192, code=512, eeprom=0),
|
|
MCUModel(name='STC15L101', magic=0xf2d9, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC15L102', magic=0xf2da, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC15L103', magic=0xf2db, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC15L104', magic=0xf2dc, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='IAP15L105', magic=0xf2fd, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC15F104E', magic=0xf294, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='STC15L104E', magic=0xf2d4, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='STC15F204EA', magic=0xf394, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='IAP15F205EA', magic=0xf3b5, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC15L204EA', magic=0xf3d4, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='IAP15L205EA', magic=0xf3f5, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC12C5A08S2', magic=0xd164, total=65536, code=8192, eeprom=55296),
|
|
MCUModel(name='STC12C5A16S2', magic=0xd168, total=65536, code=16384, eeprom=47104),
|
|
MCUModel(name='STC12C5A32S2', magic=0xd170, total=65536, code=32768, eeprom=30720),
|
|
MCUModel(name='STC12C5A40S2', magic=0xd174, total=65536, code=40960, eeprom=22528),
|
|
MCUModel(name='STC12C5A48S2', magic=0xd178, total=65536, code=49152, eeprom=14336),
|
|
MCUModel(name='STC12C5A52S2', magic=0xd17a, total=65536, code=53248, eeprom=10240),
|
|
MCUModel(name='STC12C5A56S2', magic=0xd17c, total=65536, code=57344, eeprom=6144),
|
|
MCUModel(name='STC12C5A60S2', magic=0xd17e, total=65536, code=61440, eeprom=2048),
|
|
MCUModel(name='STC12C5A08AD', magic=0xd144, total=65536, code=8192, eeprom=55296),
|
|
MCUModel(name='STC12C5A16AD', magic=0xd148, total=65536, code=16384, eeprom=47104),
|
|
MCUModel(name='STC12C5A32AD', magic=0xd150, total=65536, code=32768, eeprom=30720),
|
|
MCUModel(name='STC12C5A40AD', magic=0xd154, total=65536, code=40960, eeprom=22528),
|
|
MCUModel(name='STC12C5A48AD', magic=0xd158, total=65536, code=49152, eeprom=14336),
|
|
MCUModel(name='STC12C5A52AD', magic=0xd15a, total=65536, code=53248, eeprom=10240),
|
|
MCUModel(name='STC12C5A56AD', magic=0xd15c, total=65536, code=57344, eeprom=6144),
|
|
MCUModel(name='STC12C5A60AD', magic=0xd15e, total=65536, code=61440, eeprom=2048),
|
|
MCUModel(name='STC12C5A08CCP', magic=0xd124, total=65536, code=8192, eeprom=55296),
|
|
MCUModel(name='STC12C5A16CCP', magic=0xd128, total=65536, code=16384, eeprom=47104),
|
|
MCUModel(name='STC12C5A32CCP', magic=0xd130, total=65536, code=32768, eeprom=30720),
|
|
MCUModel(name='STC12C5A40CCP', magic=0xd134, total=65536, code=40960, eeprom=22528),
|
|
MCUModel(name='STC12C5A48CCP', magic=0xd138, total=65536, code=49152, eeprom=14336),
|
|
MCUModel(name='STC12C5A52CCP', magic=0xd13a, total=65536, code=53248, eeprom=10240),
|
|
MCUModel(name='STC12C5A56CCP', magic=0xd13c, total=65536, code=57344, eeprom=6144),
|
|
MCUModel(name='STC12C5A60CCP', magic=0xd13e, total=65536, code=61440, eeprom=2048),
|
|
MCUModel(name='STC12C5A08X', magic=0xd104, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='STC12C5A16X', magic=0xd108, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='STC12C5A32X', magic=0xd110, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='STC12C5A40X', magic=0xd114, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='STC12C5A48X', magic=0xd118, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='STC12C5A52X', magic=0xd11a, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='STC12C5A56X', magic=0xd11c, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='STC12C5A60X', magic=0xd11e, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP12C5A08S2', magic=0xd163, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP12C5A16S2', magic=0xd167, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP12C5A32S2', magic=0xd16f, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP12C5A40S2', magic=0xd173, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP12C5A48S2', magic=0xd177, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP12C5A52S2', magic=0xd179, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP12C5A56S2', magic=0xd17b, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP12C5A60S2', magic=0xd17d, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP12C5A62S2', magic=0xd17f, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='IAP12C5A08AD', magic=0xd143, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP12C5A16AD', magic=0xd147, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP12C5A32AD', magic=0xd14f, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP12C5A40AD', magic=0xd153, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP12C5A48AD', magic=0xd157, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP12C5A52AD', magic=0xd159, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP12C5A56AD', magic=0xd15b, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP12C5A60AD', magic=0xd15d, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP12C5A62AD', magic=0xd15f, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='IAP12C5A08CCP', magic=0xd123, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP12C5A16CCP', magic=0xd127, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP12C5A32CCP', magic=0xd12f, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP12C5A40CCP', magic=0xd133, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP12C5A48CCP', magic=0xd137, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP12C5A52CCP', magic=0xd139, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP12C5A56CCP', magic=0xd13b, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP12C5A60CCP', magic=0xd13d, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP12C5A62CCP', magic=0xd13f, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='IAP12C5A08', magic=0xd103, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP12C5A16', magic=0xd107, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP12C5A32', magic=0xd10f, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP12C5A40', magic=0xd113, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP12C5A48', magic=0xd117, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP12C5A52', magic=0xd119, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP12C5A56', magic=0xd11b, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP12C5A60', magic=0xd11d, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP12C5A62', magic=0xd11f, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='STC12LE5A08S2', magic=0xd1e4, total=65536, code=8192, eeprom=55296),
|
|
MCUModel(name='STC12LE5A16S2', magic=0xd1e8, total=65536, code=16384, eeprom=47104),
|
|
MCUModel(name='STC12LE5A32S2', magic=0xd1f0, total=65536, code=32768, eeprom=30720),
|
|
MCUModel(name='STC12LE5A40S2', magic=0xd1f4, total=65536, code=40960, eeprom=22528),
|
|
MCUModel(name='STC12LE5A48S2', magic=0xd1f8, total=65536, code=49152, eeprom=14336),
|
|
MCUModel(name='STC12LE5A52S2', magic=0xd1fa, total=65536, code=53248, eeprom=10240),
|
|
MCUModel(name='STC12LE5A56S2', magic=0xd1fc, total=65536, code=57344, eeprom=6144),
|
|
MCUModel(name='STC12LE5A60S2', magic=0xd1fe, total=65536, code=61440, eeprom=2048),
|
|
MCUModel(name='STC12LE5A08AD', magic=0xd1c4, total=65536, code=8192, eeprom=55296),
|
|
MCUModel(name='STC12LE5A16AD', magic=0xd1c8, total=65536, code=16384, eeprom=47104),
|
|
MCUModel(name='STC12LE5A32AD', magic=0xd1d0, total=65536, code=32768, eeprom=30720),
|
|
MCUModel(name='STC12LE5A40AD', magic=0xd1d4, total=65536, code=40960, eeprom=22528),
|
|
MCUModel(name='STC12LE5A48AD', magic=0xd1d8, total=65536, code=49152, eeprom=14336),
|
|
MCUModel(name='STC12LE5A52AD', magic=0xd1da, total=65536, code=53248, eeprom=10240),
|
|
MCUModel(name='STC12LE5A56AD', magic=0xd1dc, total=65536, code=57344, eeprom=6144),
|
|
MCUModel(name='STC12LE5A60AD', magic=0xd1de, total=65536, code=61440, eeprom=2048),
|
|
MCUModel(name='STC12LE5A08CCP', magic=0xd1a4, total=65536, code=8192, eeprom=55296),
|
|
MCUModel(name='STC12LE5A16CCP', magic=0xd1a8, total=65536, code=16384, eeprom=47104),
|
|
MCUModel(name='STC12LE5A32CCP', magic=0xd1b0, total=65536, code=32768, eeprom=30720),
|
|
MCUModel(name='STC12LE5A40CCP', magic=0xd1b4, total=65536, code=40960, eeprom=22528),
|
|
MCUModel(name='STC12LE5A48CCP', magic=0xd1b8, total=65536, code=49152, eeprom=14336),
|
|
MCUModel(name='STC12LE5A52CCP', magic=0xd1ba, total=65536, code=53248, eeprom=10240),
|
|
MCUModel(name='STC12LE5A56CCP', magic=0xd1bc, total=65536, code=57344, eeprom=6144),
|
|
MCUModel(name='STC12LE5A60CCP', magic=0xd1be, total=65536, code=61440, eeprom=2048),
|
|
MCUModel(name='STC12LE5A08X', magic=0xd184, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='STC12LE5A16X', magic=0xd188, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='STC12LE5A32X', magic=0xd190, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='STC12LE5A40X', magic=0xd194, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='STC12LE5A48X', magic=0xd198, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='STC12LE5A52X', magic=0xd19a, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='STC12LE5A56X', magic=0xd19c, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='STC12LE5A60X', magic=0xd19e, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP12LE5A08S2', magic=0xd1e3, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP12LE5A16S2', magic=0xd1e7, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP12LE5A32S2', magic=0xd1ef, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP12LE5A40S2', magic=0xd1f3, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP12LE5A48S2', magic=0xd1f7, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP12LE5A52S2', magic=0xd1f9, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP12LE5A56S2', magic=0xd1fb, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP12LE5A60S2', magic=0xd1fd, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP12LE5A62S2', magic=0xd1ff, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='IAP12LE5A08AD', magic=0xd1c3, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP12LE5A16AD', magic=0xd1c7, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP12LE5A32AD', magic=0xd1cf, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP12LE5A40AD', magic=0xd1d3, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP12LE5A48AD', magic=0xd1d7, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP12LE5A52AD', magic=0xd1d9, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP12LE5A56AD', magic=0xd1db, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP12LE5A60AD', magic=0xd1dd, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP12LE5A62AD', magic=0xd1df, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='IAP12LE5A08CCP', magic=0xd1a3, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP12LE5A16CCP', magic=0xd1a7, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP12LE5A32CCP', magic=0xd1af, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP12LE5A40CCP', magic=0xd1b3, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP12LE5A48CCP', magic=0xd1b7, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP12LE5A52CCP', magic=0xd1b9, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP12LE5A56CCP', magic=0xd1bb, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP12LE5A60CCP', magic=0xd1bd, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP12LE5A62CCP', magic=0xd1bf, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='IAP12LE5A08', magic=0xd183, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP12LE5A16', magic=0xd187, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP12LE5A32', magic=0xd18f, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP12LE5A40', magic=0xd193, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP12LE5A48', magic=0xd197, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP12LE5A52', magic=0xd199, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP12LE5A56', magic=0xd19b, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP12LE5A60', magic=0xd19d, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP12LE5A62', magic=0xd19f, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='STC10F02XE', magic=0xd262, total=16384, code=2048, eeprom=12288),
|
|
MCUModel(name='STC10F04XE', magic=0xd264, total=16384, code=4096, eeprom=10240),
|
|
MCUModel(name='STC10F06XE', magic=0xd266, total=16384, code=6144, eeprom=8192),
|
|
MCUModel(name='STC10F08XE', magic=0xd268, total=16384, code=8192, eeprom=6144),
|
|
MCUModel(name='STC10F10XE', magic=0xd26a, total=16384, code=10240, eeprom=4096),
|
|
MCUModel(name='STC10F12XE', magic=0xd26c, total=16384, code=12288, eeprom=2048),
|
|
MCUModel(name='STC10F02X', magic=0xd242, total=16384, code=2048, eeprom=0),
|
|
MCUModel(name='STC10F04X', magic=0xd244, total=16384, code=4096, eeprom=0),
|
|
MCUModel(name='STC10F06X', magic=0xd246, total=16384, code=6144, eeprom=0),
|
|
MCUModel(name='STC10F08X', magic=0xd248, total=16384, code=8192, eeprom=0),
|
|
MCUModel(name='STC10F10X', magic=0xd24a, total=16384, code=10240, eeprom=0),
|
|
MCUModel(name='STC10F12X', magic=0xd24c, total=16384, code=12288, eeprom=0),
|
|
MCUModel(name='STC10F02', magic=0xd202, total=16384, code=2048, eeprom=0),
|
|
MCUModel(name='STC10F04', magic=0xd204, total=16384, code=4096, eeprom=0),
|
|
MCUModel(name='STC10F06', magic=0xd206, total=16384, code=6144, eeprom=0),
|
|
MCUModel(name='STC10F08', magic=0xd208, total=16384, code=8192, eeprom=0),
|
|
MCUModel(name='STC10F10', magic=0xd20a, total=16384, code=10240, eeprom=0),
|
|
MCUModel(name='STC10F12', magic=0xd20c, total=16384, code=12288, eeprom=0),
|
|
MCUModel(name='IAP10F02XE', magic=0xd272, total=16384, code=2048, eeprom=0),
|
|
MCUModel(name='IAP10F04XE', magic=0xd274, total=16384, code=4096, eeprom=0),
|
|
MCUModel(name='IAP10F06XE', magic=0xd276, total=16384, code=6144, eeprom=0),
|
|
MCUModel(name='IAP10F08XE', magic=0xd278, total=16384, code=8192, eeprom=0),
|
|
MCUModel(name='IAP10F10XE', magic=0xd27a, total=16384, code=10240, eeprom=0),
|
|
MCUModel(name='IAP10F12XE', magic=0xd27c, total=16384, code=12288, eeprom=0),
|
|
MCUModel(name='IAP10F14X', magic=0xd27e, total=16384, code=14336, eeprom=0),
|
|
MCUModel(name='IAP10F02', magic=0xd232, total=16384, code=2048, eeprom=0),
|
|
MCUModel(name='IAP10F04', magic=0xd234, total=16384, code=4096, eeprom=0),
|
|
MCUModel(name='IAP10F06', magic=0xd236, total=16384, code=6144, eeprom=0),
|
|
MCUModel(name='IAP10F08', magic=0xd238, total=16384, code=8192, eeprom=0),
|
|
MCUModel(name='IAP10F10', magic=0xd23a, total=16384, code=10240, eeprom=0),
|
|
MCUModel(name='IAP10F12', magic=0xd23c, total=16384, code=12288, eeprom=0),
|
|
MCUModel(name='IAP10F14', magic=0xd23e, total=16384, code=14336, eeprom=0),
|
|
MCUModel(name='STC10L02XE', magic=0xd2e2, total=16384, code=2048, eeprom=12288),
|
|
MCUModel(name='STC10L04XE', magic=0xd2e4, total=16384, code=4096, eeprom=10240),
|
|
MCUModel(name='STC10L06XE', magic=0xd2e6, total=16384, code=6144, eeprom=8192),
|
|
MCUModel(name='STC10L08XE', magic=0xd2e8, total=16384, code=8192, eeprom=6144),
|
|
MCUModel(name='STC10L10XE', magic=0xd2ea, total=16384, code=10240, eeprom=4096),
|
|
MCUModel(name='STC10L12XE', magic=0xd2ec, total=16384, code=12288, eeprom=2048),
|
|
MCUModel(name='STC10L02X', magic=0xd2c2, total=16384, code=2048, eeprom=0),
|
|
MCUModel(name='STC10L04X', magic=0xd2c4, total=16384, code=4096, eeprom=0),
|
|
MCUModel(name='STC10L06X', magic=0xd2c6, total=16384, code=6144, eeprom=0),
|
|
MCUModel(name='STC10L08X', magic=0xd2c8, total=16384, code=8192, eeprom=0),
|
|
MCUModel(name='STC10L10X', magic=0xd2ca, total=16384, code=10240, eeprom=0),
|
|
MCUModel(name='STC10L12X', magic=0xd2cc, total=16384, code=12288, eeprom=0),
|
|
MCUModel(name='STC10L02', magic=0xd282, total=16384, code=2048, eeprom=0),
|
|
MCUModel(name='STC10L04', magic=0xd284, total=16384, code=4096, eeprom=0),
|
|
MCUModel(name='STC10L06', magic=0xd286, total=16384, code=6144, eeprom=0),
|
|
MCUModel(name='STC10L08', magic=0xd288, total=16384, code=8192, eeprom=0),
|
|
MCUModel(name='STC10L10', magic=0xd28a, total=16384, code=10240, eeprom=0),
|
|
MCUModel(name='STC10L12', magic=0xd28c, total=16384, code=12288, eeprom=0),
|
|
MCUModel(name='IAP10L02XE', magic=0xd2f2, total=16384, code=2048, eeprom=0),
|
|
MCUModel(name='IAP10L04XE', magic=0xd2f4, total=16384, code=4096, eeprom=0),
|
|
MCUModel(name='IAP10L06XE', magic=0xd2f6, total=16384, code=6144, eeprom=0),
|
|
MCUModel(name='IAP10L08XE', magic=0xd2f8, total=16384, code=8192, eeprom=0),
|
|
MCUModel(name='IAP10L10XE', magic=0xd2fa, total=16384, code=10240, eeprom=0),
|
|
MCUModel(name='IAP10L12XE', magic=0xd2fc, total=16384, code=12288, eeprom=0),
|
|
MCUModel(name='IAP10L14X', magic=0xd2fe, total=16384, code=14336, eeprom=0),
|
|
MCUModel(name='IAP10L02', magic=0xd2b2, total=16384, code=2048, eeprom=0),
|
|
MCUModel(name='IAP10L04', magic=0xd2b4, total=16384, code=4096, eeprom=0),
|
|
MCUModel(name='IAP10L06', magic=0xd2b6, total=16384, code=6144, eeprom=0),
|
|
MCUModel(name='IAP10L08', magic=0xd2b8, total=16384, code=8192, eeprom=0),
|
|
MCUModel(name='IAP10L10', magic=0xd2ba, total=16384, code=10240, eeprom=0),
|
|
MCUModel(name='IAP10L12', magic=0xd2bc, total=16384, code=12288, eeprom=0),
|
|
MCUModel(name='IAP10L14', magic=0xd2be, total=16384, code=14336, eeprom=0),
|
|
MCUModel(name='STC11F01E', magic=0xe221, total=8192, code=1024, eeprom=5120),
|
|
MCUModel(name='STC11F02E', magic=0xe222, total=8192, code=2048, eeprom=4096),
|
|
MCUModel(name='STC11F03E', magic=0xe223, total=8192, code=3072, eeprom=3072),
|
|
MCUModel(name='STC11F04E', magic=0xe224, total=8192, code=4096, eeprom=2048),
|
|
MCUModel(name='STC11F05E', magic=0xe265, total=8192, code=5120, eeprom=1024),
|
|
MCUModel(name='STC11F01', magic=0xe201, total=8192, code=1024, eeprom=0),
|
|
MCUModel(name='STC11F02', magic=0xe202, total=8192, code=2048, eeprom=0),
|
|
MCUModel(name='STC11F03', magic=0xe203, total=8192, code=3072, eeprom=0),
|
|
MCUModel(name='STC11F04', magic=0xe204, total=8192, code=4096, eeprom=0),
|
|
MCUModel(name='STC11F05', magic=0xe245, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='IAP11F01E', magic=0xe231, total=8192, code=1024, eeprom=0),
|
|
MCUModel(name='IAP11F02E', magic=0xe232, total=8192, code=2048, eeprom=0),
|
|
MCUModel(name='IAP11F03E', magic=0xe233, total=8192, code=3072, eeprom=0),
|
|
MCUModel(name='IAP11F04E', magic=0xe234, total=8192, code=4096, eeprom=0),
|
|
MCUModel(name='IAP11F05E', magic=0xe275, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='IAP11F01', magic=0xe211, total=8192, code=1024, eeprom=0),
|
|
MCUModel(name='IAP11F02', magic=0xe212, total=8192, code=2048, eeprom=0),
|
|
MCUModel(name='IAP11F03', magic=0xe213, total=8192, code=3072, eeprom=0),
|
|
MCUModel(name='IAP11F04', magic=0xe214, total=8192, code=4096, eeprom=0),
|
|
MCUModel(name='IAP11F05', magic=0xe255, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='IAP11F06', magic=0xe276, total=8192, code=6144, eeprom=0),
|
|
MCUModel(name='STC11L01E', magic=0xe2a1, total=8192, code=1024, eeprom=5120),
|
|
MCUModel(name='STC11L02E', magic=0xe2a2, total=8192, code=2048, eeprom=4096),
|
|
MCUModel(name='STC11L03E', magic=0xe2a3, total=8192, code=3072, eeprom=3072),
|
|
MCUModel(name='STC11L04E', magic=0xe2a4, total=8192, code=4096, eeprom=2048),
|
|
MCUModel(name='STC11L05E', magic=0xe2e5, total=8192, code=5120, eeprom=1024),
|
|
MCUModel(name='STC11L01', magic=0xe281, total=8192, code=1024, eeprom=0),
|
|
MCUModel(name='STC11L02', magic=0xe282, total=8192, code=2048, eeprom=0),
|
|
MCUModel(name='STC11L03', magic=0xe283, total=8192, code=3072, eeprom=0),
|
|
MCUModel(name='STC11L04', magic=0xe284, total=8192, code=4096, eeprom=0),
|
|
MCUModel(name='STC11L05', magic=0xe2c5, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='IAP11L01E', magic=0xe2b1, total=8192, code=1024, eeprom=0),
|
|
MCUModel(name='IAP11L02E', magic=0xe2b2, total=8192, code=2048, eeprom=0),
|
|
MCUModel(name='IAP11L03E', magic=0xe2b3, total=8192, code=3072, eeprom=0),
|
|
MCUModel(name='IAP11L04E', magic=0xe2b4, total=8192, code=4096, eeprom=0),
|
|
MCUModel(name='IAP11L05E', magic=0xe2f5, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='IAP11L01', magic=0xe291, total=8192, code=1024, eeprom=0),
|
|
MCUModel(name='IAP11L02', magic=0xe292, total=8192, code=2048, eeprom=0),
|
|
MCUModel(name='IAP11L03', magic=0xe293, total=8192, code=3072, eeprom=0),
|
|
MCUModel(name='IAP11L04', magic=0xe294, total=8192, code=4096, eeprom=0),
|
|
MCUModel(name='IAP11L05', magic=0xe2d5, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='IAP11L06', magic=0xe2f6, total=8192, code=6144, eeprom=0),
|
|
MCUModel(name='STC11F08XE', magic=0xd364, total=65536, code=8192, eeprom=55296),
|
|
MCUModel(name='STC11F16XE', magic=0xd368, total=65536, code=16384, eeprom=47104),
|
|
MCUModel(name='STC11F20XE', magic=0xd36a, total=65536, code=20480, eeprom=30720),
|
|
MCUModel(name='STC11F32XE', magic=0xd370, total=65536, code=32768, eeprom=30720),
|
|
MCUModel(name='STC11F40XE', magic=0xd374, total=65536, code=40960, eeprom=22528),
|
|
MCUModel(name='STC11F48XE', magic=0xd378, total=65536, code=49152, eeprom=14336),
|
|
MCUModel(name='STC11F52XE', magic=0xd37a, total=65536, code=53248, eeprom=10240),
|
|
MCUModel(name='STC11F56XE', magic=0xd37c, total=65536, code=57344, eeprom=6144),
|
|
MCUModel(name='STC11F60XE', magic=0xd37e, total=65536, code=61440, eeprom=2048),
|
|
MCUModel(name='STC11F08X', magic=0xd344, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='STC11F16X', magic=0xd348, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='STC11F20X', magic=0xd34a, total=65536, code=20480, eeprom=0),
|
|
MCUModel(name='STC11F32X', magic=0xd350, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='STC11F40X', magic=0xd354, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='STC11F48X', magic=0xd358, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='STC11F52X', magic=0xd35a, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='STC11F56X', magic=0xd35c, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='STC11F60X', magic=0xd35e, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='STC11F08', magic=0xd304, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='STC11F16', magic=0xd308, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='STC11F20', magic=0xd30a, total=65536, code=20480, eeprom=0),
|
|
MCUModel(name='STC11F32', magic=0xd310, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='STC11F40', magic=0xd314, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='STC11F48', magic=0xd318, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='STC11F52', magic=0xd31a, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='STC11F56', magic=0xd31c, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='STC11F60', magic=0xd31e, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP11F08XE', magic=0xd363, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP11F16XE', magic=0xd367, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP11F20XE', magic=0xd369, total=65536, code=20480, eeprom=0),
|
|
MCUModel(name='IAP11F32XE', magic=0xd36f, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP11F40XE', magic=0xd373, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP11F48XE', magic=0xd377, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP11F52XE', magic=0xd379, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP11F56XE', magic=0xd37b, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP11F60XE', magic=0xd37d, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP11F08X', magic=0xd343, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP11F16X', magic=0xd347, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP11F20X', magic=0xd349, total=65536, code=20480, eeprom=0),
|
|
MCUModel(name='IAP11F32X', magic=0xd34f, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP11F40X', magic=0xd353, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP11F48X', magic=0xd357, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP11F52X', magic=0xd359, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP11F56X', magic=0xd35b, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP11F60X', magic=0xd35d, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP11F62X', magic=0xd35f, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='IAP11F08', magic=0xd303, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP11F16', magic=0xd307, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP11F20', magic=0xd309, total=65536, code=20480, eeprom=0),
|
|
MCUModel(name='IAP11F32', magic=0xd30f, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP11F40', magic=0xd313, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP11F48', magic=0xd317, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP11F52', magic=0xd319, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP11F56', magic=0xd31b, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP11F60', magic=0xd31d, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP11F62', magic=0xd31f, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='STC11L08XE', magic=0xd3e4, total=65536, code=8192, eeprom=55296),
|
|
MCUModel(name='STC11L16XE', magic=0xd3e8, total=65536, code=16384, eeprom=47104),
|
|
MCUModel(name='STC11L20XE', magic=0xd3ea, total=65536, code=20480, eeprom=30720),
|
|
MCUModel(name='STC11L32XE', magic=0xd3f0, total=65536, code=32768, eeprom=30720),
|
|
MCUModel(name='STC11L40XE', magic=0xd3f4, total=65536, code=40960, eeprom=22528),
|
|
MCUModel(name='STC11L48XE', magic=0xd3f8, total=65536, code=49152, eeprom=14336),
|
|
MCUModel(name='STC11L52XE', magic=0xd3fa, total=65536, code=53248, eeprom=10240),
|
|
MCUModel(name='STC11L56XE', magic=0xd3fc, total=65536, code=57344, eeprom=6144),
|
|
MCUModel(name='STC11L60XE', magic=0xd3fe, total=65536, code=61440, eeprom=2048),
|
|
MCUModel(name='STC11L08X', magic=0xd3c4, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='STC11L16X', magic=0xd3c8, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='STC11L20X', magic=0xd3ca, total=65536, code=20480, eeprom=0),
|
|
MCUModel(name='STC11L32X', magic=0xd3d0, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='STC11L40X', magic=0xd3d4, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='STC11L48X', magic=0xd3d8, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='STC11L52X', magic=0xd3da, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='STC11L56X', magic=0xd3dc, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='STC11L60X', magic=0xd3de, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='STC11L08', magic=0xd384, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='STC11L16', magic=0xd388, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='STC11L20', magic=0xd38a, total=65536, code=20480, eeprom=0),
|
|
MCUModel(name='STC11L32', magic=0xd390, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='STC11L40', magic=0xd394, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='STC11L48', magic=0xd398, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='STC11L52', magic=0xd39a, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='STC11L56', magic=0xd39c, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='STC11L60', magic=0xd39e, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP11L08XE', magic=0xd3e3, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP11L16XE', magic=0xd3e7, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP11L20XE', magic=0xd3e9, total=65536, code=20480, eeprom=0),
|
|
MCUModel(name='IAP11L32XE', magic=0xd3ef, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP11L40XE', magic=0xd3f3, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP11L48XE', magic=0xd3f7, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP11L52XE', magic=0xd3f9, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP11L56XE', magic=0xd3fb, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP11L60XE', magic=0xd3fd, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP11L08X', magic=0xd3c3, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP11L16X', magic=0xd3c7, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP11L20X', magic=0xd3c9, total=65536, code=20480, eeprom=0),
|
|
MCUModel(name='IAP11L32X', magic=0xd3cf, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP11L40X', magic=0xd3d3, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP11L48X', magic=0xd3d7, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP11L52X', magic=0xd3d9, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP11L56X', magic=0xd3db, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP11L60X', magic=0xd3dd, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP11L62X', magic=0xd3df, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='IAP11L08', magic=0xd383, total=65536, code=8192, eeprom=0),
|
|
MCUModel(name='IAP11L16', magic=0xd387, total=65536, code=16384, eeprom=0),
|
|
MCUModel(name='IAP11L20', magic=0xd389, total=65536, code=20480, eeprom=0),
|
|
MCUModel(name='IAP11L32', magic=0xd38f, total=65536, code=32768, eeprom=0),
|
|
MCUModel(name='IAP11L40', magic=0xd393, total=65536, code=40960, eeprom=0),
|
|
MCUModel(name='IAP11L48', magic=0xd397, total=65536, code=49152, eeprom=0),
|
|
MCUModel(name='IAP11L52', magic=0xd399, total=65536, code=53248, eeprom=0),
|
|
MCUModel(name='IAP11L56', magic=0xd39b, total=65536, code=57344, eeprom=0),
|
|
MCUModel(name='IAP11L60', magic=0xd39d, total=65536, code=61440, eeprom=0),
|
|
MCUModel(name='IAP11L62', magic=0xd39f, total=65536, code=63488, eeprom=0),
|
|
MCUModel(name='STC12C5201AD', magic=0xe161, total=8192, code=1024, eeprom=5120),
|
|
MCUModel(name='STC12C5202AD', magic=0xe162, total=8192, code=2048, eeprom=4096),
|
|
MCUModel(name='STC12C5203AD', magic=0xe163, total=8192, code=3072, eeprom=3072),
|
|
MCUModel(name='STC12C5204AD', magic=0xe164, total=8192, code=4096, eeprom=2048),
|
|
MCUModel(name='STC12C5205AD', magic=0xe165, total=8192, code=5120, eeprom=1024),
|
|
MCUModel(name='STC12C5206AD', magic=0xe166, total=8192, code=6144, eeprom=0),
|
|
MCUModel(name='STC12C5201PWM', magic=0xe121, total=8192, code=1024, eeprom=5120),
|
|
MCUModel(name='STC12C5202PWM', magic=0xe122, total=8192, code=2048, eeprom=4096),
|
|
MCUModel(name='STC12C5203PWM', magic=0xe123, total=8192, code=3072, eeprom=3072),
|
|
MCUModel(name='STC12C5204PWM', magic=0xe124, total=8192, code=4096, eeprom=2048),
|
|
MCUModel(name='STC12C5205PWM', magic=0xe125, total=8192, code=5120, eeprom=1024),
|
|
MCUModel(name='STC12C5206PWM', magic=0xe126, total=8192, code=6144, eeprom=0),
|
|
MCUModel(name='STC12C5201', magic=0xe101, total=8192, code=1024, eeprom=5120),
|
|
MCUModel(name='STC12C5202', magic=0xe102, total=8192, code=2048, eeprom=4096),
|
|
MCUModel(name='STC12C5203', magic=0xe103, total=8192, code=3072, eeprom=3072),
|
|
MCUModel(name='STC12C5204', magic=0xe104, total=8192, code=4096, eeprom=2048),
|
|
MCUModel(name='STC12C5205', magic=0xe105, total=8192, code=5120, eeprom=1024),
|
|
MCUModel(name='STC12C5206', magic=0xe106, total=8192, code=6144, eeprom=0),
|
|
MCUModel(name='STC12LE5201AD', magic=0xe1e1, total=8192, code=1024, eeprom=5120),
|
|
MCUModel(name='STC12LE5202AD', magic=0xe1e2, total=8192, code=2048, eeprom=4096),
|
|
MCUModel(name='STC12LE5203AD', magic=0xe1e3, total=8192, code=3072, eeprom=3072),
|
|
MCUModel(name='STC12LE5204AD', magic=0xe1e4, total=8192, code=4096, eeprom=2048),
|
|
MCUModel(name='STC12LE5205AD', magic=0xe1e5, total=8192, code=5120, eeprom=1024),
|
|
MCUModel(name='STC12LE5206AD', magic=0xe1e6, total=8192, code=6144, eeprom=0),
|
|
MCUModel(name='STC12LE5201PWM', magic=0xe1a1, total=8192, code=1024, eeprom=5120),
|
|
MCUModel(name='STC12LE5202PWM', magic=0xe1a2, total=8192, code=2048, eeprom=4096),
|
|
MCUModel(name='STC12LE5203PWM', magic=0xe1a3, total=8192, code=3072, eeprom=3072),
|
|
MCUModel(name='STC12LE5204PWM', magic=0xe1a4, total=8192, code=4096, eeprom=2048),
|
|
MCUModel(name='STC12LE5205PWM', magic=0xe1a5, total=8192, code=5120, eeprom=1024),
|
|
MCUModel(name='STC12LE5206PWM', magic=0xe1a6, total=8192, code=6144, eeprom=0),
|
|
MCUModel(name='STC12LE5201', magic=0xe181, total=8192, code=1024, eeprom=5120),
|
|
MCUModel(name='STC12LE5202', magic=0xe182, total=8192, code=2048, eeprom=4096),
|
|
MCUModel(name='STC12LE5203', magic=0xe183, total=8192, code=3072, eeprom=3072),
|
|
MCUModel(name='STC12LE5204', magic=0xe184, total=8192, code=4096, eeprom=2048),
|
|
MCUModel(name='STC12LE5205', magic=0xe185, total=8192, code=5120, eeprom=1024),
|
|
MCUModel(name='STC12LE5206', magic=0xe186, total=8192, code=6144, eeprom=0),
|
|
MCUModel(name='STC12C5601AD', magic=0xe661, total=32768, code=1024, eeprom=29696),
|
|
MCUModel(name='STC12C5602AD', magic=0xe662, total=32768, code=2048, eeprom=28672),
|
|
MCUModel(name='STC12C5603AD', magic=0xe663, total=32768, code=3072, eeprom=27648),
|
|
MCUModel(name='STC12C5604AD', magic=0xe664, total=32768, code=4096, eeprom=26624),
|
|
MCUModel(name='STC12C5605AD', magic=0xe665, total=32768, code=5120, eeprom=25600),
|
|
MCUModel(name='STC12C5606AD', magic=0xe666, total=32768, code=6144, eeprom=24576),
|
|
MCUModel(name='STC12C5608AD', magic=0xe668, total=32768, code=8192, eeprom=22528),
|
|
MCUModel(name='STC12C5612AD', magic=0xe66c, total=32768, code=12288, eeprom=18432),
|
|
MCUModel(name='STC12C5616AD', magic=0xe670, total=32768, code=16384, eeprom=14336),
|
|
MCUModel(name='STC12C5620AD', magic=0xe674, total=32768, code=20480, eeprom=10240),
|
|
MCUModel(name='STC12C5624AD', magic=0xe678, total=32768, code=24576, eeprom=6144),
|
|
MCUModel(name='STC12C5628AD', magic=0xe67c, total=32768, code=28672, eeprom=2048),
|
|
MCUModel(name='STC12C5630AD', magic=0xe67e, total=32768, code=30720, eeprom=0),
|
|
MCUModel(name='STC12C5601', magic=0xe601, total=32768, code=1024, eeprom=29696),
|
|
MCUModel(name='STC12C5602', magic=0xe602, total=32768, code=2048, eeprom=28672),
|
|
MCUModel(name='STC12C5603', magic=0xe603, total=32768, code=3072, eeprom=27648),
|
|
MCUModel(name='STC12C5604', magic=0xe604, total=32768, code=4096, eeprom=26624),
|
|
MCUModel(name='STC12C5605', magic=0xe605, total=32768, code=5120, eeprom=25600),
|
|
MCUModel(name='STC12C5606', magic=0xe606, total=32768, code=6144, eeprom=24576),
|
|
MCUModel(name='STC12C5608', magic=0xe608, total=32768, code=8192, eeprom=22528),
|
|
MCUModel(name='STC12C5612', magic=0xe60c, total=32768, code=12288, eeprom=18432),
|
|
MCUModel(name='STC12C5616', magic=0xe610, total=32768, code=16384, eeprom=14336),
|
|
MCUModel(name='STC12C5620', magic=0xe614, total=32768, code=20480, eeprom=10240),
|
|
MCUModel(name='STC12C5624', magic=0xe618, total=32768, code=24576, eeprom=6144),
|
|
MCUModel(name='STC12C5628', magic=0xe61c, total=32768, code=28672, eeprom=2048),
|
|
MCUModel(name='STC12C5630', magic=0xe61e, total=32768, code=30720, eeprom=0),
|
|
MCUModel(name='STC12LE5601AD', magic=0xe6e1, total=32768, code=1024, eeprom=29696),
|
|
MCUModel(name='STC12LE5602AD', magic=0xe6e2, total=32768, code=2048, eeprom=28672),
|
|
MCUModel(name='STC12LE5603AD', magic=0xe6e3, total=32768, code=3072, eeprom=27648),
|
|
MCUModel(name='STC12LE5604AD', magic=0xe6e4, total=32768, code=4096, eeprom=26624),
|
|
MCUModel(name='STC12LE5605AD', magic=0xe6e5, total=32768, code=5120, eeprom=25600),
|
|
MCUModel(name='STC12LE5606AD', magic=0xe6e6, total=32768, code=6144, eeprom=24576),
|
|
MCUModel(name='STC12LE5608AD', magic=0xe6e8, total=32768, code=8192, eeprom=22528),
|
|
MCUModel(name='STC12LE5612AD', magic=0xe6ec, total=32768, code=12288, eeprom=18432),
|
|
MCUModel(name='STC12LE5616AD', magic=0xe6f0, total=32768, code=16384, eeprom=14336),
|
|
MCUModel(name='STC12LE5620AD', magic=0xe6f4, total=32768, code=20480, eeprom=10240),
|
|
MCUModel(name='STC12LE5624AD', magic=0xe6f8, total=32768, code=24576, eeprom=6144),
|
|
MCUModel(name='STC12LE5628AD', magic=0xe6fc, total=32768, code=28672, eeprom=2048),
|
|
MCUModel(name='STC12LE5630AD', magic=0xe6fe, total=32768, code=30720, eeprom=0),
|
|
MCUModel(name='STC12LE5601', magic=0xe681, total=32768, code=1024, eeprom=29696),
|
|
MCUModel(name='STC12LE5602', magic=0xe682, total=32768, code=2048, eeprom=28672),
|
|
MCUModel(name='STC12LE5603', magic=0xe683, total=32768, code=3072, eeprom=27648),
|
|
MCUModel(name='STC12LE5604', magic=0xe684, total=32768, code=4096, eeprom=26624),
|
|
MCUModel(name='STC12LE5605', magic=0xe685, total=32768, code=5120, eeprom=25600),
|
|
MCUModel(name='STC12LE5606', magic=0xe686, total=32768, code=6144, eeprom=24576),
|
|
MCUModel(name='STC12LE5608', magic=0xe688, total=32768, code=8192, eeprom=22528),
|
|
MCUModel(name='STC12LE5612', magic=0xe68c, total=32768, code=12288, eeprom=18432),
|
|
MCUModel(name='STC12LE5616', magic=0xe690, total=32768, code=16384, eeprom=14336),
|
|
MCUModel(name='STC12LE5620', magic=0xe694, total=32768, code=20480, eeprom=10240),
|
|
MCUModel(name='STC12LE5624', magic=0xe698, total=32768, code=24576, eeprom=6144),
|
|
MCUModel(name='STC12LE5628', magic=0xe69c, total=32768, code=28672, eeprom=2048),
|
|
MCUModel(name='STC12LE5630', magic=0xe69e, total=32768, code=30720, eeprom=0),
|
|
MCUModel(name='STC12C5401AD', magic=0xe061, total=32768, code=1024, eeprom=12288),
|
|
MCUModel(name='STC12C5402AD', magic=0xe062, total=32768, code=2048, eeprom=12288),
|
|
MCUModel(name='STC12C5404AD', magic=0xe064, total=32768, code=4096, eeprom=12288),
|
|
MCUModel(name='STC12C5406AD', magic=0xe066, total=32768, code=6144, eeprom=12288),
|
|
MCUModel(name='STC12C5408AD', magic=0xe068, total=32768, code=8192, eeprom=12288),
|
|
MCUModel(name='STC12C5410AD', magic=0xe06a, total=32768, code=10240, eeprom=12288),
|
|
MCUModel(name='STC12C5412AD', magic=0xe06c, total=32768, code=12288, eeprom=12288),
|
|
MCUModel(name='STC12C5416AD', magic=0xe070, total=32768, code=16384, eeprom=12288),
|
|
MCUModel(name='STC12C5420AD', magic=0xe074, total=32768, code=20480, eeprom=12288),
|
|
MCUModel(name='STC12C5424AD', magic=0xe078, total=32768, code=24576, eeprom=12288),
|
|
MCUModel(name='STC12C5428AD', magic=0xe07c, total=32768, code=28672, eeprom=12288),
|
|
MCUModel(name='STC12C5401', magic=0xe001, total=32768, code=1024, eeprom=12288),
|
|
MCUModel(name='STC12C5402', magic=0xe002, total=32768, code=2048, eeprom=12288),
|
|
MCUModel(name='STC12C5404', magic=0xe004, total=32768, code=4096, eeprom=12288),
|
|
MCUModel(name='STC12C5406', magic=0xe006, total=32768, code=6144, eeprom=12288),
|
|
MCUModel(name='STC12C5408', magic=0xe008, total=32768, code=8192, eeprom=12288),
|
|
MCUModel(name='STC12C5410', magic=0xe00a, total=32768, code=10240, eeprom=12288),
|
|
MCUModel(name='STC12C5412', magic=0xe00c, total=32768, code=12288, eeprom=12288),
|
|
MCUModel(name='STC12C5416', magic=0xe010, total=32768, code=16384, eeprom=12288),
|
|
MCUModel(name='STC12C5420', magic=0xe014, total=32768, code=20480, eeprom=12288),
|
|
MCUModel(name='STC12C5424', magic=0xe018, total=32768, code=24576, eeprom=12288),
|
|
MCUModel(name='STC12C5428', magic=0xe01c, total=32768, code=28672, eeprom=12288),
|
|
MCUModel(name='STC12LE5401AD', magic=0xe0e1, total=32768, code=1024, eeprom=22016),
|
|
MCUModel(name='STC12LE5402AD', magic=0xe0e2, total=32768, code=2048, eeprom=20992),
|
|
MCUModel(name='STC12LE5404AD', magic=0xe0e4, total=32768, code=4096, eeprom=18944),
|
|
MCUModel(name='STC12LE5406AD', magic=0xe0e6, total=32768, code=6144, eeprom=16896),
|
|
MCUModel(name='STC12LE5408AD', magic=0xe0e8, total=32768, code=8192, eeprom=10752),
|
|
MCUModel(name='STC12LE5410AD', magic=0xe0ea, total=32768, code=10240, eeprom=4608),
|
|
MCUModel(name='STC12LE5412AD', magic=0xe0ec, total=32768, code=12288, eeprom=11776),
|
|
MCUModel(name='STC12LE5416AD', magic=0xe0f0, total=32768, code=16384, eeprom=12288),
|
|
MCUModel(name='STC12LE5420AD', magic=0xe0f4, total=32768, code=20480, eeprom=8192),
|
|
MCUModel(name='STC12LE5424AD', magic=0xe0f8, total=32768, code=24576, eeprom=4096),
|
|
MCUModel(name='STC12LE5428AD', magic=0xe0fc, total=32768, code=28672, eeprom=0),
|
|
MCUModel(name='STC12LE5401', magic=0xe081, total=32768, code=1024, eeprom=22016),
|
|
MCUModel(name='STC12LE5402', magic=0xe082, total=32768, code=2048, eeprom=20992),
|
|
MCUModel(name='STC12LE5404', magic=0xe084, total=32768, code=4096, eeprom=18944),
|
|
MCUModel(name='STC12LE5406', magic=0xe086, total=32768, code=6144, eeprom=16896),
|
|
MCUModel(name='STC12LE5408', magic=0xe088, total=32768, code=8192, eeprom=10752),
|
|
MCUModel(name='STC12LE5410', magic=0xe08a, total=32768, code=10240, eeprom=4608),
|
|
MCUModel(name='STC12LE5412', magic=0xe08c, total=32768, code=12288, eeprom=11776),
|
|
MCUModel(name='STC12LE5416', magic=0xe090, total=32768, code=16384, eeprom=12288),
|
|
MCUModel(name='STC12LE5420', magic=0xe094, total=32768, code=20480, eeprom=8192),
|
|
MCUModel(name='STC12LE5424', magic=0xe098, total=32768, code=24576, eeprom=4096),
|
|
MCUModel(name='STC12LE5428', magic=0xe09c, total=32768, code=28672, eeprom=0),
|
|
MCUModel(name='STC12C1052AD', magic=0xf211, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC12C2052AD', magic=0xf212, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC12C3052AD', magic=0xf213, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC12C4052AD', magic=0xf214, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='STC12C5052AD', magic=0xf215, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC12C1052', magic=0xf201, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC12C2052', magic=0xf202, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC12C3052', magic=0xf203, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC12C4052', magic=0xf204, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='STC12C5052', magic=0xf205, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC12LE1052AD', magic=0xf231, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC12LE2052AD', magic=0xf232, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC12LE3052AD', magic=0xf233, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC12LE4052AD', magic=0xf234, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='STC12LE5052AD', magic=0xf235, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC12LE1052', magic=0xf221, total=8192, code=1024, eeprom=4096),
|
|
MCUModel(name='STC12LE2052', magic=0xf222, total=8192, code=2048, eeprom=3072),
|
|
MCUModel(name='STC12LE3052', magic=0xf223, total=8192, code=3072, eeprom=2048),
|
|
MCUModel(name='STC12LE4052', magic=0xf224, total=8192, code=4096, eeprom=1024),
|
|
MCUModel(name='STC12LE5052', magic=0xf225, total=8192, code=5120, eeprom=0),
|
|
MCUModel(name='STC90C51RC', magic=0xf021, total=16384, code=4096, eeprom=9216),
|
|
MCUModel(name='STC90C52RC', magic=0xf022, total=16384, code=8192, eeprom=5120),
|
|
MCUModel(name='STC90C53RC', magic=0xf024, total=16384, code=14336, eeprom=0),
|
|
MCUModel(name='STC90C06RC', magic=0xf026, total=16384, code=6144, eeprom=7168),
|
|
MCUModel(name='STC90C07RC', magic=0xf027, total=16384, code=7168, eeprom=6144),
|
|
MCUModel(name='STC90C10RC', magic=0xf02a, total=16384, code=10240, eeprom=3072),
|
|
MCUModel(name='STC90C12RC', magic=0xf02c, total=16384, code=12288, eeprom=1024),
|
|
MCUModel(name='STC90LE51RC', magic=0xf041, total=16384, code=4096, eeprom=9216),
|
|
MCUModel(name='STC90LE52RC', magic=0xf042, total=16384, code=8192, eeprom=5120),
|
|
MCUModel(name='STC90LE53RC', magic=0xf044, total=16384, code=14336, eeprom=0),
|
|
MCUModel(name='STC90LE06RC', magic=0xf046, total=16384, code=6144, eeprom=7168),
|
|
MCUModel(name='STC90LE07RC', magic=0xf047, total=16384, code=7168, eeprom=6144),
|
|
MCUModel(name='STC90LE10RC', magic=0xf04a, total=16384, code=10240, eeprom=3072),
|
|
MCUModel(name='STC90LE12RC', magic=0xf04c, total=16384, code=12288, eeprom=1024),
|
|
MCUModel(name='STC90C51RD+', magic=0xf121, total=65536, code=4096, eeprom=58368),
|
|
MCUModel(name='STC90C52RD+', magic=0xf122, total=65536, code=8192, eeprom=54272),
|
|
MCUModel(name='STC90C54RD+', magic=0xf124, total=65536, code=16384, eeprom=46080),
|
|
MCUModel(name='STC90C55RD+', magic=0xf125, total=65536, code=20480, eeprom=41984),
|
|
MCUModel(name='STC90C58RD+', magic=0xf128, total=65536, code=32768, eeprom=29696),
|
|
MCUModel(name='STC90C510RD+', magic=0xf12a, total=65536, code=40960, eeprom=21504),
|
|
MCUModel(name='STC90C512RD+', magic=0xf12c, total=65536, code=49152, eeprom=13312),
|
|
MCUModel(name='STC90C513RD+', magic=0xf12d, total=65536, code=53248, eeprom=9216),
|
|
MCUModel(name='STC90C514RD+', magic=0xf12e, total=65536, code=57344, eeprom=5120),
|
|
MCUModel(name='STC90C516RD+', magic=0xf130, total=65536, code=62464, eeprom=0),
|
|
MCUModel(name='STC90LE51RD+', magic=0xf141, total=65536, code=4096, eeprom=58368),
|
|
MCUModel(name='STC90LE52RD+', magic=0xf142, total=65536, code=8192, eeprom=54272),
|
|
MCUModel(name='STC90LE54RD+', magic=0xf144, total=65536, code=16384, eeprom=46080),
|
|
MCUModel(name='STC90LE55RD+', magic=0xf145, total=65536, code=20480, eeprom=41984),
|
|
MCUModel(name='STC90LE58RD+', magic=0xf148, total=65536, code=32768, eeprom=29696),
|
|
MCUModel(name='STC90LE510RD+', magic=0xf14a, total=65536, code=40960, eeprom=21504),
|
|
MCUModel(name='STC90LE512RD+', magic=0xf14c, total=65536, code=49152, eeprom=13312),
|
|
MCUModel(name='STC90LE513RD+', magic=0xf14d, total=65536, code=53248, eeprom=9216),
|
|
MCUModel(name='STC90LE514RD+', magic=0xf14e, total=65536, code=57344, eeprom=5120),
|
|
MCUModel(name='STC90LE516RD+', magic=0xf150, total=65536, code=62464, eeprom=0),
|
|
MCUModel(name='STC90C51AD', magic=0xf161, total=65536, code=4096, eeprom=58368),
|
|
MCUModel(name='STC90C52AD', magic=0xf162, total=65536, code=8192, eeprom=54272),
|
|
MCUModel(name='STC90C54AD', magic=0xf164, total=65536, code=16384, eeprom=46080),
|
|
MCUModel(name='STC90C55AD', magic=0xf165, total=65536, code=20480, eeprom=41984),
|
|
MCUModel(name='STC90C58AD', magic=0xf168, total=65536, code=32768, eeprom=29696),
|
|
MCUModel(name='STC90C510AD', magic=0xf16a, total=65536, code=40960, eeprom=21504),
|
|
MCUModel(name='STC90C512AD', magic=0xf16c, total=65536, code=49152, eeprom=13312),
|
|
MCUModel(name='STC90C513AD', magic=0xf16d, total=65536, code=53248, eeprom=9216),
|
|
MCUModel(name='STC90C514AD', magic=0xf16e, total=65536, code=57344, eeprom=5120),
|
|
MCUModel(name='STC90C516AD', magic=0xf170, total=65536, code=62464, eeprom=0),
|
|
MCUModel(name='STC90LE51AD', magic=0xf181, total=65536, code=4096, eeprom=58368),
|
|
MCUModel(name='STC90LE52AD', magic=0xf182, total=65536, code=8192, eeprom=54272),
|
|
MCUModel(name='STC90LE54AD', magic=0xf184, total=65536, code=16384, eeprom=46080),
|
|
MCUModel(name='STC90LE55AD', magic=0xf185, total=65536, code=20480, eeprom=41984),
|
|
MCUModel(name='STC90LE58AD', magic=0xf188, total=65536, code=32768, eeprom=29696),
|
|
MCUModel(name='STC90LE510AD', magic=0xf18a, total=65536, code=40960, eeprom=21504),
|
|
MCUModel(name='STC90LE512AD', magic=0xf18c, total=65536, code=49152, eeprom=13312),
|
|
MCUModel(name='STC90LE513AD', magic=0xf18d, total=65536, code=53248, eeprom=9216),
|
|
MCUModel(name='STC90LE514AD', magic=0xf18e, total=65536, code=57344, eeprom=5120),
|
|
MCUModel(name='STC90LE516AD', magic=0xf190, total=65536, code=62464, eeprom=0),
|
|
MCUModel(name='STC89C/LE51RC', magic=0xf001, total=16384, code=4096, eeprom=10240),
|
|
MCUModel(name='STC89C/LE52RC', magic=0xf002, total=16384, code=8192, eeprom=6144),
|
|
MCUModel(name='STC89C/LE53RC', magic=0xf004, total=16384, code=14336, eeprom=0),
|
|
MCUModel(name='STC89C/LE06RC', magic=0xf006, total=16384, code=6144, eeprom=8192),
|
|
MCUModel(name='STC89C/LE07RC', magic=0xf007, total=16384, code=7168, eeprom=7168),
|
|
MCUModel(name='STC89C/LE10RC', magic=0xf00a, total=16384, code=10240, eeprom=4096),
|
|
MCUModel(name='STC89C/LE12RC', magic=0xf00c, total=16384, code=12288, eeprom=2048),
|
|
MCUModel(name='STC89C/LE51RD+', magic=0xf101, total=65536, code=4096, eeprom=59392),
|
|
MCUModel(name='STC89C/LE52RD+', magic=0xf102, total=65536, code=8192, eeprom=55296),
|
|
MCUModel(name='STC89C/LE54RD+', magic=0xf104, total=65536, code=16384, eeprom=47104),
|
|
MCUModel(name='STC89C/LE55RD+', magic=0xf105, total=65536, code=20480, eeprom=43008),
|
|
MCUModel(name='STC89C/LE58RD+', magic=0xf108, total=65536, code=32768, eeprom=30720),
|
|
MCUModel(name='STC89C/LE510RD+', magic=0xf10a, total=65536, code=40960, eeprom=22528),
|
|
MCUModel(name='STC89C/LE512RD+', magic=0xf10c, total=65536, code=49152, eeprom=14336),
|
|
MCUModel(name='STC89C/LE513RD+', magic=0xf10d, total=65536, code=53248, eeprom=10240),
|
|
MCUModel(name='STC89C/LE514RD+', magic=0xf10e, total=65536, code=57344, eeprom=6144),
|
|
MCUModel(name='STC89C/LE516RD+', magic=0xf110, total=65536, code=63488, eeprom=0),
|
|
)
|
|
|
|
@classmethod
|
|
def find_model(self, magic):
|
|
for model in self.models:
|
|
if model.magic == magic: return model
|
|
raise NameError
|
|
|
|
@classmethod
|
|
def print_model_info(self, model):
|
|
print("Target model:")
|
|
print(" Name: %s" % model.name)
|
|
print(" Magic: %02X%02X" % (model.magic >> 8, model.magic & 0xff))
|
|
print(" Code flash: %.1f KB" % (model.code / 1024.0))
|
|
print(" EEPROM flash: %.1f KB" % (model.eeprom / 1024.0))
|
|
|
|
|
|
class Stc12Option:
|
|
"""Manipulate STC10/11/12 series option bytes"""
|
|
|
|
def __init__(self, msr):
|
|
self.msr = bytearray(msr)
|
|
|
|
"""list of options and their handlers"""
|
|
self.options = (
|
|
("reset_pin_enabled", self.get_reset_pin_enabled, self.set_reset_pin_enabled),
|
|
("low_voltage_detect", self.get_low_voltage_detect, self.set_low_voltage_detect),
|
|
("oscillator_stable_delay", self.get_osc_stable_delay, self.set_osc_stable_delay),
|
|
("power_on_reset_delay", self.get_por_delay, self.set_por_delay),
|
|
("clock_gain", self.get_clock_gain, self.set_clock_gain),
|
|
("clock_source", self.get_clock_source, self.set_clock_source),
|
|
("watchdog_por_enabled", self.get_watchdog, self.set_watchdog),
|
|
("watchdog_stop_idle", self.get_watchdog_idle, self.set_watchdog_idle),
|
|
("watchdog_prescale", self.get_watchdog_prescale, self.set_watchdog_prescale),
|
|
("eeprom_erase_enabled", self.get_ee_erase, self.set_ee_erase),
|
|
("bsl_pindetect_enabled", self.get_pindetect, self.set_pindetect),
|
|
)
|
|
|
|
def print(self):
|
|
print("Target options:")
|
|
for name, get_func, _ in self.options:
|
|
print(" %s=%s" % (name, get_func()))
|
|
|
|
def set_option(self, name, value):
|
|
for opt, _, set_func in self.options:
|
|
if opt == name:
|
|
print("Option %s=%s" % (name, value))
|
|
set_func(value)
|
|
return
|
|
raise ValueError
|
|
|
|
def get_option(self, name):
|
|
for opt, get_func, _ in self.options:
|
|
if opt == name:
|
|
return get_func(name)
|
|
raise ValueError
|
|
|
|
def get_msr(self):
|
|
return bytes(self.msr)
|
|
|
|
def get_reset_pin_enabled(self):
|
|
return bool(self.msr[0] & 1)
|
|
|
|
def set_reset_pin_enabled(self, val):
|
|
val = Utils.to_bool(val);
|
|
self.msr[0] &= 0xfe
|
|
self.msr[0] |= 0x01 if bool(val) else 0x00
|
|
|
|
def get_low_voltage_detect(self):
|
|
return not bool(self.msr[0] & 64)
|
|
|
|
def set_low_voltage_detect(self, val):
|
|
val = Utils.to_bool(val);
|
|
self.msr[0] &= 0xbf
|
|
self.msr[0] |= 0x40 if not val else 0x00
|
|
|
|
def get_osc_stable_delay(self):
|
|
return 2 ** (((self.msr[0] >> 4) & 0x03) + 12)
|
|
|
|
def set_osc_stable_delay(self, val):
|
|
val = Utils.to_int(val)
|
|
osc_vals = {4096: 0, 8192: 1, 16384: 2, 32768: 3}
|
|
if val not in osc_vals.keys():
|
|
raise ValueError("must be one of %s" % list(osc_vals.keys()))
|
|
self.msr[0] &= 0xcf
|
|
self.msr[0] |= osc_vals[val] << 4
|
|
|
|
def get_por_delay(self):
|
|
delay = not bool(self.msr[1] & 128)
|
|
return "long" if delay else "short"
|
|
|
|
def set_por_delay(self, val):
|
|
delays = {"short": 1, "long": 0}
|
|
if val not in delays.keys():
|
|
raise ValueError("must be one of %s" % list(delays.keys()))
|
|
self.msr[1] &= 0x7f
|
|
self.msr[1] |= delays[val] << 7
|
|
|
|
def get_clock_gain(self):
|
|
gain = bool(self.msr[1] & 64)
|
|
return "high" if gain else "low"
|
|
|
|
def set_clock_gain(self, val):
|
|
gains = {"low": 0, "high": 1}
|
|
if val not in gains.keys():
|
|
raise ValueError("must be one of %s" % list(gains.keys()))
|
|
self.msr[1] &= 0xbf
|
|
self.msr[1] |= gains[val] << 6
|
|
|
|
def get_clock_source(self):
|
|
source = bool(self.msr[1] & 2)
|
|
return "external" if source else "internal"
|
|
|
|
def set_clock_source(self, val):
|
|
sources = {"internal": 0, "external": 1}
|
|
if val not in sources.keys():
|
|
raise ValueError("must be one of %s" % list(sources.keys()))
|
|
self.msr[1] &= 0xfd
|
|
self.msr[1] |= sources[val] << 1
|
|
|
|
def get_watchdog(self):
|
|
return not bool(self.msr[2] & 32)
|
|
|
|
def set_watchdog(self, val):
|
|
val = Utils.to_bool(val);
|
|
self.msr[2] &= 0xdf
|
|
self.msr[2] |= 0x20 if not val else 0x00
|
|
|
|
def get_watchdog_idle(self):
|
|
return not bool(self.msr[2] & 8)
|
|
|
|
def set_watchdog_idle(self, val):
|
|
val = Utils.to_bool(val);
|
|
self.msr[2] &= 0xf7
|
|
self.msr[2] |= 0x08 if not val else 0x00
|
|
|
|
def get_watchdog_prescale(self):
|
|
return 2 ** (((self.msr[2]) & 0x07) + 1)
|
|
|
|
def set_watchdog_prescale(self, val):
|
|
val = Utils.to_int(val)
|
|
wd_vals = {2: 0, 4: 1, 8: 2, 16: 3, 32: 4, 64: 5, 128: 6, 256: 7}
|
|
if val not in wd_vals.keys():
|
|
raise ValueError("must be one of %s" % list(wd_vals.keys()))
|
|
self.msr[2] &= 0xf8
|
|
self.msr[2] |= wd_vals[val]
|
|
|
|
def get_ee_erase(self):
|
|
return not bool(self.msr[3] & 2)
|
|
|
|
def set_ee_erase(self, val):
|
|
val = Utils.to_bool(val);
|
|
self.msr[3] &= 0xfd
|
|
self.msr[3] |= 0x02 if not val else 0x00
|
|
|
|
def get_pindetect(self):
|
|
return not bool(self.msr[3] & 1)
|
|
|
|
def set_pindetect(self, val):
|
|
val = Utils.to_bool(val);
|
|
self.msr[3] &= 0xfe
|
|
self.msr[3] |= 0x01 if not val else 0x00
|
|
|
|
|
|
class Stc12Protocol:
|
|
"""Protocol handler for STC 10/11/12 series"""
|
|
|
|
"""magic word that starts a packet"""
|
|
PACKET_START = bytes([0x46, 0xb9])
|
|
|
|
"""magic byte that ends a packet"""
|
|
PACKET_END = bytes([0x16])
|
|
|
|
"""magic byte for packets received from MCU"""
|
|
PACKET_MCU = bytes([0x68])
|
|
|
|
"""magic byte for packets sent by host"""
|
|
PACKET_HOST = bytes([0x6a])
|
|
|
|
"""block size for programming flash"""
|
|
PROGRAM_BLOCKSIZE = 128
|
|
|
|
def __init__(self, port, baud_handshake, baud_transfer):
|
|
self.port = port
|
|
self.baud_handshake = baud_handshake
|
|
self.baud_transfer = baud_transfer
|
|
|
|
self.mcu_magic = 0
|
|
self.mcu_clock_hz = 0.0
|
|
self.mcu_bsl_version = ""
|
|
self.options = None
|
|
self.model = None
|
|
|
|
def dump_packet(self, data, receive=True):
|
|
if DEBUG:
|
|
print("%s Packet data: " % ("<-" if receive else "->") +
|
|
" ".join(hex(x) for x in data), file=sys.stderr)
|
|
|
|
def modular_sum(self, data):
|
|
"""modular 16-bit sum"""
|
|
|
|
s = 0
|
|
for b in data: s += b
|
|
return s & 0xffff
|
|
|
|
def read_packet(self):
|
|
"""Read and check packet from MCU.
|
|
|
|
Reads a packet of data from the MCU and and do
|
|
validity and checksum checks on it.
|
|
|
|
Returns packet payload or None in case of an error.
|
|
"""
|
|
|
|
# read and check frame start magic
|
|
packet = bytes()
|
|
packet += self.ser.read(2)
|
|
if packet[0:2] != self.PACKET_START:
|
|
self.dump_packet(packet)
|
|
raise RuntimeError("wrong packet frame start")
|
|
|
|
# read direction and length
|
|
packet += self.ser.read(3)
|
|
if packet[2] != self.PACKET_MCU[0]:
|
|
self.dump_packet(packet)
|
|
raise RuntimeError("wrong packet direction magic")
|
|
|
|
# read packet data
|
|
packet_len, = struct.unpack(">H", packet[3:5])
|
|
packet += self.ser.read(packet_len - 3)
|
|
|
|
# verify end code
|
|
if packet[packet_len+1] != self.PACKET_END[0]:
|
|
self.dump_packet(packet)
|
|
raise RuntimeError("wrong packet frame end")
|
|
|
|
# verify checksum
|
|
packet_csum, = struct.unpack(">H", packet[packet_len-1:packet_len+1])
|
|
calc_csum = sum(packet[2:packet_len-1]) & 0xffff
|
|
if packet_csum != calc_csum:
|
|
self.dump_packet(packet)
|
|
raise RuntimeError("packet checksum mismatch")
|
|
|
|
self.dump_packet(packet, receive=True)
|
|
|
|
# payload only is returned
|
|
return packet[5:packet_len-1]
|
|
|
|
def write_packet(self, data):
|
|
"""Send packet to MCU.
|
|
|
|
Constructs a packet with supplied payload and sends it to the MCU.
|
|
"""
|
|
|
|
# frame start and direction magic
|
|
packet = bytes()
|
|
packet += self.PACKET_START
|
|
packet += self.PACKET_HOST
|
|
|
|
# packet length and payload
|
|
packet += struct.pack(">H", len(data) + 6)
|
|
packet += data
|
|
|
|
# checksum and end code
|
|
packet += struct.pack(">H", sum(packet[2:]) & 0xffff)
|
|
packet += self.PACKET_END
|
|
|
|
self.dump_packet(packet, receive=False)
|
|
self.ser.write(packet)
|
|
self.ser.flush()
|
|
|
|
def decode_status_packet(self, packet):
|
|
"""Decode status packet"""
|
|
|
|
self.mcu_magic, = struct.unpack(">H", packet[20:22])
|
|
|
|
freq_counter = 0
|
|
for i in range(8):
|
|
freq_counter += struct.unpack(">H", packet[1+2*i:3+2*i])[0]
|
|
freq_counter /= 8.0
|
|
self.mcu_clock_hz = (self.baud_handshake * freq_counter * 12.0) / 7.0
|
|
|
|
bl_version, bl_stepping = struct.unpack("BB", packet[17:19])
|
|
self.mcu_bsl_version = "%d.%d%s" % (bl_version >> 4, bl_version & 0x0f,
|
|
chr(bl_stepping))
|
|
|
|
def calculate_baud(self):
|
|
"""Calculate MCU baudrate setting.
|
|
|
|
Calculate appropriate baudrate settings for the MCU's UART,
|
|
according to clock frequency and requested baud rate.
|
|
"""
|
|
|
|
# baudrate is directly controlled by programming the MCU's BRT register
|
|
brt = 256 - round((self.mcu_clock_hz) / (self.baud_transfer * 16))
|
|
brt_csum = (2 * (256 - brt)) & 0xff
|
|
try: baud_actual = (self.mcu_clock_hz) / (16 * (256 - brt))
|
|
except ZeroDivisionError: raise RuntimeError("baudrate too high")
|
|
baud_error = (abs(self.baud_transfer - baud_actual) * 100.0) / self.baud_transfer
|
|
if baud_error > 5.0:
|
|
print("WARNING: baud rate error is %.2f%%. You may need to set a slower rate." %
|
|
baud_error, file=sys.stderr)
|
|
|
|
# IAP wait states (according to datasheet(s))
|
|
iap_wait = 0x80
|
|
if self.mcu_clock_hz < 1E6: iap_wait = 0x87
|
|
elif self.mcu_clock_hz < 2E6: iap_wait = 0x86
|
|
elif self.mcu_clock_hz < 3E6: iap_wait = 0x85
|
|
elif self.mcu_clock_hz < 6E6: iap_wait = 0x84
|
|
elif self.mcu_clock_hz < 12E6: iap_wait = 0x83
|
|
elif self.mcu_clock_hz < 20E6: iap_wait = 0x82
|
|
elif self.mcu_clock_hz < 24E6: iap_wait = 0x81
|
|
|
|
# MCU delay after switching baud rates
|
|
delay = 0x80
|
|
|
|
return brt, brt_csum, iap_wait, delay
|
|
|
|
def print_mcu_info(self):
|
|
"""Print MCU status information"""
|
|
|
|
MCUModelDatabase.print_model_info(self.model)
|
|
print("Target frequency: %.3f MHz" % (self.mcu_clock_hz / 1E6))
|
|
print("Target bootloader version: %s" % self.mcu_bsl_version)
|
|
|
|
def connect(self):
|
|
"""Connect to MCU and initialize communication.
|
|
|
|
Set up serial port, send sync sequence and get part info.
|
|
"""
|
|
|
|
self.ser = serial.Serial(port=self.port, baudrate=self.baud_handshake,
|
|
parity=serial.PARITY_EVEN)
|
|
|
|
# send sync, and wait for MCU response
|
|
print("Waiting for MCU, please cycle power...", end="")
|
|
sys.stdout.flush()
|
|
while True:
|
|
self.ser.write(b"\x7f")
|
|
self.ser.flush()
|
|
time.sleep(0.015)
|
|
if self.ser.inWaiting() > 0: break
|
|
print("done")
|
|
|
|
# read status packet
|
|
status_packet = self.read_packet()
|
|
if status_packet[0] != 0x50:
|
|
raise RuntimeError("wrong magic in status packet")
|
|
self.decode_status_packet(status_packet)
|
|
|
|
# get model info
|
|
try:
|
|
self.model = MCUModelDatabase.find_model(self.mcu_magic)
|
|
except NameError:
|
|
msg = ("WARNING: Unknown model %02X%02X!" %
|
|
(self.mcu_magic >> 8, self.mcu_magic & 0xff))
|
|
print(msg, file=sys.stderr)
|
|
self.model = MCUModelDatabase.MCUModel(name="UNKNOWN",
|
|
magic=self.mcu_magic, total=63488, code=63488, eeprom=0)
|
|
self.print_mcu_info()
|
|
|
|
# create option state
|
|
self.options = Stc12Option(status_packet[23:27])
|
|
self.options.print()
|
|
|
|
def handshake(self):
|
|
"""Do baudrate handshake
|
|
|
|
Initate and do the (rather complicated) baudrate handshake.
|
|
"""
|
|
|
|
# start baudrate handshake
|
|
brt, brt_csum, iap, delay = self.calculate_baud()
|
|
print("Switching to %d baud..." % self.baud_transfer, end="")
|
|
sys.stdout.flush()
|
|
packet = bytes([0x50, 0x00, 0x00, 0x36, 0x01])
|
|
packet += struct.pack(">H", self.mcu_magic)
|
|
self.write_packet(packet)
|
|
response = self.read_packet()
|
|
if response[0] != 0x8f:
|
|
raise RuntimeError("wrong magic in handshake packet")
|
|
|
|
# test new settings
|
|
print("testing...", end="")
|
|
sys.stdout.flush()
|
|
packet = bytes([0x8f, 0xc0, brt, 0x3f, brt_csum, delay, iap])
|
|
self.write_packet(packet)
|
|
time.sleep(0.2)
|
|
self.ser.baudrate = self.baud_transfer
|
|
response = self.read_packet()
|
|
self.ser.baudrate = self.baud_handshake
|
|
if response[0] != 0x8f:
|
|
raise RuntimeError("wrong magic in handshake packet")
|
|
|
|
# switch to the settings
|
|
print("setting...", end="")
|
|
sys.stdout.flush()
|
|
packet = bytes([0x8e, 0xc0, brt, 0x3f, brt_csum, delay])
|
|
self.write_packet(packet)
|
|
time.sleep(0.2)
|
|
self.ser.baudrate = self.baud_transfer
|
|
response = self.read_packet()
|
|
if response[0] != 0x84:
|
|
raise RuntimeError("wrong magic in handshake packet")
|
|
|
|
print("done")
|
|
|
|
def erase_flash(self, erase_size, flash_size):
|
|
"""Erase the MCU's flash memory.
|
|
|
|
Erase the flash memory with a block-erase command.
|
|
"""
|
|
|
|
blks = (erase_size + 255) // 256
|
|
size = (flash_size + 255) // 256
|
|
print("Erasing %d blocks..." % blks)
|
|
packet = bytes([0x84, 0x00, 0x00, blks, 0x00, 0x00, size,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00])
|
|
for i in range(0x80, 0x0d, -1): packet += bytes([i])
|
|
self.write_packet(packet)
|
|
response = self.read_packet()
|
|
if response[0] != 0x00:
|
|
raise RuntimeError("wrong magic in erase packet")
|
|
|
|
def program_flash(self, addr, data):
|
|
"""Program the MCU's flash memory.
|
|
|
|
Write data into flash memory, starting at the given address. The address
|
|
should be 128 byte aligned.
|
|
"""
|
|
|
|
print("Writing %d bytes..." % len(data), end="")
|
|
sys.stdout.flush()
|
|
for i in range(addr, addr+len(data), 128):
|
|
packet = bytes(3)
|
|
packet += struct.pack(">H", i)
|
|
packet += struct.pack(">H", self.PROGRAM_BLOCKSIZE)
|
|
packet += data[i-addr:i-addr+128]
|
|
while len(packet) < self.PROGRAM_BLOCKSIZE + 7: packet += b"\x00"
|
|
csum = sum(packet[7:]) & 0xff
|
|
self.write_packet(packet)
|
|
response = self.read_packet()
|
|
if response[0] != 0x00:
|
|
raise RuntimeError("wrong magic in write packet")
|
|
elif response[1] != csum:
|
|
raise RuntimeError("verification checksum mismatch")
|
|
print(".", end="")
|
|
sys.stdout.flush()
|
|
print()
|
|
|
|
packet = bytes([0x69, 0x00, 0x00, 0x36, 0x01])
|
|
packet += struct.pack(">H", self.mcu_magic)
|
|
self.write_packet(packet)
|
|
response = self.read_packet()
|
|
if response[0] != 0x8d:
|
|
raise RuntimeError("wrong magic in finish packet")
|
|
print("Finished writing flash!")
|
|
|
|
def set_option(self, name, value):
|
|
self.options.set_option(name, value)
|
|
|
|
def program_options(self):
|
|
#self.options.print()
|
|
print("Setting options...")
|
|
msr = self.options.get_msr()
|
|
packet = bytes([0x8d, msr[0], msr[1], msr[2], msr[3],
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff])
|
|
|
|
packet += struct.pack(">I", int(self.mcu_clock_hz))
|
|
self.write_packet(packet)
|
|
response = self.read_packet()
|
|
if response[0] != 0x50:
|
|
raise RuntimeError("wrong magic in option packet")
|
|
|
|
print("Target UID: %02X%02X%02X%02X%02X%02X%02X" %
|
|
(response[18], response[19], response[20], response[21],
|
|
response[22], response[23], response[24]))
|
|
|
|
def disconnect(self):
|
|
"""Disconnect from MCU"""
|
|
|
|
# reset mcu
|
|
packet = bytes([0x82])
|
|
self.write_packet(packet)
|
|
self.ser.close()
|
|
print("Disconnected!")
|
|
|
|
class StcGal:
|
|
"""STC ISP flash tool frontend"""
|
|
|
|
def __init__(self, opts):
|
|
self.opts = opts
|
|
self.protocol = Stc12Protocol(opts.port, opts.handshake, opts.baud)
|
|
|
|
def emit_options(self, options):
|
|
for o in options:
|
|
try:
|
|
k, v = o.split("=", 1)
|
|
self.protocol.set_option(k, v)
|
|
except ValueError as e:
|
|
raise NameError("invalid option '%s' (%s)" % (k, e))
|
|
|
|
def run(self):
|
|
try: self.protocol.connect()
|
|
except KeyboardInterrupt:
|
|
print("interrupted")
|
|
return 2
|
|
except RuntimeError as e:
|
|
print("Communication error: %s" % e, file=sys.stderr)
|
|
return 1
|
|
except serial.serialutil.SerialException as e:
|
|
print("Serial communication error: %s" % e, file=sys.stderr)
|
|
return 1
|
|
|
|
if opts.code_binary:
|
|
try:
|
|
code_size = self.protocol.model.code
|
|
ee_size = self.protocol.model.eeprom
|
|
|
|
bindata = opts.code_binary.read()
|
|
|
|
# warn if it overflows
|
|
if len(bindata) > (code_size + ee_size):
|
|
print("WARNING: code_binary truncated!", file=sys.stderr)
|
|
bindata = bindata[0:code_size + ee_size]
|
|
elif len(bindata) > code_size:
|
|
print("WARNING: code_binary overflows into eeprom segment!", file=sys.stderr)
|
|
|
|
# add eeprom data if supplied
|
|
if opts.eeprom_binary:
|
|
eedata = opts.eeprom_binary.read()
|
|
if len(eedata) > ee_size:
|
|
print("WARNING: eeprom_binary truncated!", file=sys.stderr)
|
|
eedata = eedata[0:ee_size]
|
|
if len(bindata) < code_size:
|
|
bindata += bytes(code_size - len(bindata))
|
|
bindata += eedata
|
|
|
|
# pad to 256 byte boundary
|
|
if len(bindata) % 256:
|
|
bindata += bytes(256 - len(bindata) % 256)
|
|
|
|
if opts.option: self.emit_options(opts.option)
|
|
|
|
self.protocol.handshake()
|
|
self.protocol.erase_flash(len(bindata), code_size)
|
|
self.protocol.program_flash(0, bindata)
|
|
self.protocol.program_options()
|
|
self.protocol.disconnect()
|
|
return 0
|
|
except NameError as e:
|
|
print("Option error: %s" % e, file=sys.stderr)
|
|
self.protocol.disconnect()
|
|
return 1
|
|
except RuntimeError as e:
|
|
print("Communication error: %s" % e, file=sys.stderr)
|
|
self.protocol.disconnect()
|
|
return 1
|
|
except KeyboardInterrupt:
|
|
print("interrupted")
|
|
self.protocol.disconnect()
|
|
return 2
|
|
except serial.serialutil.SerialException as e:
|
|
print("Serial communication error: %s" % e, file=sys.stderr)
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# check arguments
|
|
parser = argparse.ArgumentParser(description="STC10/11/12 series MCU ISP flash tool")
|
|
parser.add_argument("code_binary", help="code segment binary file to flash", type=argparse.FileType("rb"), nargs='?')
|
|
parser.add_argument("eeprom_binary", help="eeprom segment binary file to flash", type=argparse.FileType("rb"), nargs='?')
|
|
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)
|
|
parser.add_argument("-o", "--option", help="set option (can be used multiple times)", action="append")
|
|
opts = parser.parse_args()
|
|
|
|
# run programmer
|
|
gal = StcGal(opts)
|
|
sys.exit(gal.run())
|