|
1 import os |
|
2 from subprocess import Popen,PIPE |
|
3 from targets.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 |