mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-12-23 18:56:03 +00:00
99 lines
4 KiB
Python
99 lines
4 KiB
Python
#!/usr/bin/env python
|
|
import sys, lz4, os
|
|
from struct import unpack as up
|
|
|
|
def lz4_compress(data):
|
|
try:
|
|
import lz4.block as block
|
|
except ImportError:
|
|
block = lz4.LZ4_compress
|
|
return block.compress(data, 'high_compression', store_size=False)
|
|
|
|
def read_file(fn):
|
|
with open(fn, 'rb') as f:
|
|
return f.read()
|
|
|
|
def write_file(fn, data):
|
|
with open(fn, 'wb') as f:
|
|
f.write(data)
|
|
|
|
def get_param_size(soc):
|
|
return {
|
|
'erista' : 0x1340,
|
|
'mariko' : 0x10CC,
|
|
}[soc]
|
|
|
|
def main(argc, argv):
|
|
if argc != 1:
|
|
print('Usage: %s' % argv[0])
|
|
return 1
|
|
params = {
|
|
'erista' : {},
|
|
'mariko' : {},
|
|
}
|
|
compressed_params = {
|
|
'erista' : {},
|
|
'mariko' : {},
|
|
}
|
|
for board in os.listdir('mtc_tables/bin'):
|
|
if board.startswith('T210b01Sdev'):
|
|
soc = 'mariko'
|
|
count = 3
|
|
else:
|
|
assert board.startswith('T210Sdev')
|
|
soc = 'erista'
|
|
count = 10
|
|
assert os.listdir('mtc_tables/bin/%s' % board) == ['%d.bin' % i for i in xrange(count)]
|
|
params[soc][board] = []
|
|
compressed_params[soc][board] = []
|
|
for i in xrange(count):
|
|
uncompressed = read_file(os.path.join('mtc_tables/bin/%s' % board, '%d.bin' % i))
|
|
assert len(uncompressed) == get_param_size(soc)
|
|
compressed = lz4_compress(uncompressed)
|
|
params[soc][board].append(uncompressed)
|
|
compressed_params[soc][board].append(compressed)
|
|
try:
|
|
os.makedirs('mtc_tables/lz/%s' % board)
|
|
except:
|
|
pass
|
|
write_file(os.path.join('mtc_tables/lz/%s' % board, '%d.lz4' % i), compressed)
|
|
for soc in ('erista', 'mariko'):
|
|
with open('source/mtc/fusee_mtc_tables_%s.inc' % soc, 'w') as f:
|
|
f.write('%s\n' % "/*")
|
|
f.write('%s\n' % " * Copyright (c) 2018-2020 Atmosph\xc3re-NX")
|
|
f.write('%s\n' % " *")
|
|
f.write('%s\n' % " * This program is free software; you can redistribute it and/or modify it")
|
|
f.write('%s\n' % " * under the terms and conditions of the GNU General Public License,")
|
|
f.write('%s\n' % " * version 2, as published by the Free Software Foundation.")
|
|
f.write('%s\n' % " *")
|
|
f.write('%s\n' % " * This program is distributed in the hope it will be useful, but WITHOUT")
|
|
f.write('%s\n' % " * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or")
|
|
f.write('%s\n' % " * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for")
|
|
f.write('%s\n' % " * more details.")
|
|
f.write('%s\n' % " *")
|
|
f.write('%s\n' % " * You should have received a copy of the GNU General Public License")
|
|
f.write('%s\n' % " * along with this program. If not, see <http://www.gnu.org/licenses/>.")
|
|
f.write('%s\n' % " */")
|
|
f.write('\n')
|
|
for board in compressed_params[soc].keys():
|
|
data_1600 = params[soc][board][-1]
|
|
data_800 = params[soc][board][-4] if soc == 'erista' else ''
|
|
data_204 = params[soc][board][0] if soc == 'mariko' else params[soc][board][3]
|
|
assert up('<I', data_1600[0x40:0x44])[0] == 1600000
|
|
assert up('<I', data_204[0x40:0x44])[0] == 204000
|
|
if soc == 'erista':
|
|
assert up('<I', data_800[0x40:0x44])[0] == 800000
|
|
if soc == 'mariko':
|
|
data = lz4_compress(data_204 + data_1600)
|
|
else:
|
|
data = data_204 + data_800 + data_1600
|
|
f.write('%s\n' % ('constexpr const u8 %s[0x%03X] = {' % (board, len(data))))
|
|
while data:
|
|
block = data[:0x10]
|
|
data = data[0x10:]
|
|
f.write(' %s\n' % (', '.join('0x%02X' % ord(c) for c in block) + ','))
|
|
f.write('};\n\n')
|
|
return 0
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(len(sys.argv), sys.argv))
|