targets/LPC/__init__.py
changeset 734 5c42cafaee15
parent 733 915be999f3f0
child 735 d9f4ecee761d
equal deleted inserted replaced
733:915be999f3f0 734:5c42cafaee15
     1 import os
       
     2 from subprocess import Popen,PIPE
       
     3 from ..toolchain_makefile import toolchain_makefile
       
     4 import hashlib
       
     5 
       
     6 class LPC_target(toolchain_makefile):
       
     7     #extension = ".ld"
       
     8     #DebugEnabled = False
       
     9     def __init__(self, CTRInstance):
       
    10         self.binmd5key = None
       
    11         toolchain_makefile.__init__(self, CTRInstance)
       
    12 
       
    13     def _GetBinMD5FileName(self):
       
    14         return os.path.join(self.buildpath, "lastbuildPLCbin.md5")
       
    15 
       
    16     def _get_md5_header(self):
       
    17         """Returns signature header"""
       
    18         size = int(Popen(
       
    19              ['arm-elf-size','-B',os.path.join(self.buildpath,"ArmPLC_rom.elf")],
       
    20              stdout=PIPE).communicate()[0].splitlines()[1].split()[0])
       
    21         res = "&" + hashlib.md5(open(os.path.join(self.buildpath, "ArmPLC_rom.bin"), "rb").read(size)).hexdigest() + '\n' +\
       
    22               "$" + str(size) + '\n'
       
    23         return res
       
    24 
       
    25     def GetBinaryCode(self):
       
    26         """Returns ready to send signed + sized intel formated hex program"""
       
    27         try:
       
    28             res = self._get_md5_header() +\
       
    29                    open(os.path.join(self.buildpath, "ArmPLC_rom.hex"), "r").read()
       
    30             return res
       
    31         except Exception, e:
       
    32             return None
       
    33 
       
    34     def _get_cached_md5_header(self):
       
    35         if self.binmd5key is not None:
       
    36             return self.binmd5key
       
    37         else:
       
    38             try:
       
    39                 return open(self._GetBinMD5FileName(), "r").read()
       
    40             except IOError, e:
       
    41                 return None
       
    42 
       
    43     def ResetBinaryCodeMD5(self, mode):
       
    44         if mode == "BOOTLOADER":
       
    45             self.binmd5key = None
       
    46             try:
       
    47                 os.remove(self._GetBinMD5FileName())
       
    48             except Exception, e:
       
    49                 pass
       
    50         else:
       
    51             return toolchain_makefile.ResetBinaryCodeMD5(self)
       
    52 
       
    53     def GetBinaryCodeMD5(self, mode):
       
    54         if mode == "BOOTLOADER":
       
    55             return self._get_cached_md5_header()
       
    56         else:
       
    57             return toolchain_makefile.GetBinaryCodeMD5(self)
       
    58 
       
    59     def build(self):
       
    60         res = toolchain_makefile.build(self)
       
    61         if res:
       
    62             self.binmd5key = self._get_md5_header()
       
    63             f = open(self._GetBinMD5FileName(), "w")
       
    64             f.write(self.binmd5key)
       
    65             f.close()
       
    66             try:
       
    67                 self.CTRInstance.logger.write(
       
    68                     _("Binary is %s bytes long\n")%
       
    69                         str(os.path.getsize(
       
    70                             os.path.join(self.buildpath, "ArmPLC_rom.bin"))))
       
    71             except Exception, e:
       
    72                 pass
       
    73         return res
       
    74