-
Notifications
You must be signed in to change notification settings - Fork 50
/
acs_tool.py
executable file
·134 lines (120 loc) · 5.08 KB
/
acs_tool.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# uncompyle6 version 3.2.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.6.7 (default, Nov 3 2018, 21:32:46)
# [GCC 8.2.0]
# Embedded file name: acs_tool.py
# Compiled at: 2015-09-17 07:30:19
import sys, os, os.path, json
from struct import *
import codecs, shutil, copy, collections
ENTRY_POINT_OFFSET = 4
BL2_HEADER_OFFSET = 4096
ACS_TOOL_VERSION = 1
acs_v1 = collections.OrderedDict()
acs_v1['acs_magic'] = 'acs__'
acs_v1['chip_type'] = 1
acs_v1['version'] = 2
acs_v1['acs_set_length'] = 8
acs_v1['ddr_magic'] = 'ddrs_'
acs_v1['ddr_set_version'] = 1
acs_v1['ddr_set_length'] = 2
acs_v1['ddr_set_addr'] = 8
acs_v1['ddrt_magic'] = 'ddrt_'
acs_v1['ddrt_set_version'] = 1
acs_v1['ddrt_set_length'] = 2
acs_v1['ddrt_set_addr'] = 8
acs_v1['pll_magic'] = 'pll__'
acs_v1['pll_set_version'] = 1
acs_v1['pll_set_length'] = 2
acs_v1['pll_set_addr'] = 8
check_excepts = [
'ddr_set_addr', 'ddrt_set_addr', 'pll_set_addr']
check_excepts_length = ['ddr_set_length', 'ddrt_set_length', 'pll_set_length']
key_versions = ['version', 'ddr_set_version', 'ddrt_set_version', 'pll_set_version']
class acs_tool(object):
def __init__(self, file_des, file_des_tmp, file_src, debug):
self.debug = int(debug)
self.file_des = file_des
self.file_src = file_src
self.file_des_tmp = file_des_tmp
self.acs_des = copy.deepcopy(acs_v1)
self.acs_src = copy.deepcopy(acs_v1)
self.acs_base = copy.deepcopy(acs_v1)
def init_acs(self, acs_struct, file_name, bl2):
seek_position = 0
file_handler = open(file_name, 'rb')
file_handler.seek(ENTRY_POINT_OFFSET)
acs_entry_point, = unpack('H', file_handler.read(2))
acs_entry_point -= bl2 * BL2_HEADER_OFFSET
seek_position = acs_entry_point
self.log_print(file_name)
for key in list(acs_struct.keys()):
file_handler.seek(seek_position)
if isinstance(acs_struct[key], str):
seek_position += len(acs_struct[key])
acs_struct[key] = file_handler.read(len(acs_struct[key])).decode('utf-8')
else:
if isinstance(acs_struct[key], int):
seek_position += acs_struct[key]
if 1 == acs_struct[key]:
acs_struct[key], = unpack('B', file_handler.read(1))
else:
acs_struct[key], = unpack('H', file_handler.read(2))
if key in check_excepts:
acs_struct[key] -= bl2 * BL2_HEADER_OFFSET
self.log_print(key + ' ' + str(acs_struct[key]))
file_handler.close()
def check_acs(self):
err_counter = 0
for key in list(self.acs_des.keys()):
if self.acs_des[key] != self.acs_src[key] and key not in check_excepts:
print("Warning! ACS %s doesn't match!! %s/%s" % (key, self.acs_des[key], self.acs_src[key]))
for key in key_versions:
if self.acs_des[key] > self.acs_src[key]:
self.acs_des[key] = self.acs_src[key]
print('Warning! ACS src %s too old!' % key)
for key in list(self.acs_base.keys()):
if isinstance(self.acs_base[key], str):
if self.acs_des[key] != self.acs_base[key]:
err_counter += 1
print('Error! ACS DES %s error!! Value: %s, Expect: %s' % (key, self.acs_des[key], self.acs_base[key]))
if self.acs_src[key] != self.acs_base[key]:
err_counter += 1
print('Error! ACS DES %s error!! Value: %s, Expect: %s' % (key, self.acs_src[key], self.acs_base[key]))
if self.acs_des['version'] > ACS_TOOL_VERSION:
print('Error! Please update acs tool! v%s>v%s' % (self.acs_des['version'], ACS_TOOL_VERSION))
err_counter += 1
return err_counter
def copy_data(self):
file_des = open(self.file_des_tmp, 'r+b')
file_src = open(self.file_src, 'rb')
for key_addr, key_length in zip(check_excepts, check_excepts_length):
file_des.seek(self.acs_des[key_addr])
file_src.seek(self.acs_src[key_addr])
file_des.write(file_src.read(self.acs_des[key_length]))
file_des.close()
file_src.close()
return 0
def run(self):
shutil.copyfile(self.file_des, self.file_des_tmp)
self.init_acs(self.acs_des, self.file_des_tmp, 1)
self.init_acs(self.acs_src, self.file_src, 0)
if self.check_acs():
print('ACS check failed! Compile Abort!')
return -1
self.copy_data()
print('ACS tool process done.')
def log_print(self, log):
if self.debug:
print(log)
if __name__ == '__main__':
if sys.argv[1] == '--help' or sys.argv[1] == '-help':
print('acs_tool.py [bl2.bin] [bl2_tmp.bin] [acs.bin] [debug(1/0)]')
exit(1)
if len(sys.argv) != 5:
print('acs_tool.py [bl2.bin] [bl2_tmp.bin] [acs.bin] [debug(1/0)]')
exit(1)
tool = acs_tool(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
if tool.run():
exit(1)
# okay decompiling acs_tool.pyc