128 lines
4.4 KiB
Python
128 lines
4.4 KiB
Python
#!/usr/bin/env python
|
|
import sys
|
|
import getopt
|
|
import os
|
|
from string import Template
|
|
|
|
usage = 'Invalid Parameters! Example:\nparameter_tools --firmware-version 10.0 --machine-model RK3326 --manufacturer ROCKCHIP --machine XTF863 --partition-list uboot_a:4096K,trust_a:4M,misc:4M,dtbo_a:4M,vbmeta_a:4M,boot_a:33554432,backup:300M,security:4M,cache:300M,metadata:4096,frp:512K,super:2G --output te.txt'
|
|
|
|
# size: K/M/G
|
|
# return int
|
|
def calculate_blocks(size):
|
|
level = size[-1]
|
|
part_size = int(size[:-1])
|
|
if level == 'K':
|
|
part_size = part_size * 1024
|
|
elif level == 'M':
|
|
part_size = part_size * 1024 * 1024
|
|
elif level == 'G':
|
|
part_size = part_size * 1024 * 1024 * 1024
|
|
else:
|
|
part_size = int(size)
|
|
# convert to blocks
|
|
return part_size / 512
|
|
|
|
# return end blocks pos
|
|
def generate_pt(pt_name,pt_size,pt_start):
|
|
part_start = "{:#010x}".format(pt_start)
|
|
if pt_name == 'userdata':
|
|
part_size = '-'
|
|
return "-@" + part_start + "(userdata:grow)"
|
|
|
|
part_size = "{:#010x}".format(calculate_blocks(pt_size))
|
|
result = part_size + "@" + part_start + "(" + pt_name + ")"
|
|
return result, int(calculate_blocks(pt_size) + pt_start)
|
|
|
|
def main(argv):
|
|
ifile = 'parameter.in'
|
|
type = 'GPT'
|
|
start_offset = 16384
|
|
firmware_version = ''
|
|
machine_model = ''
|
|
machine_id = '007'
|
|
manufacturer = ''
|
|
magic = '0x5041524B'
|
|
atag = '0x00200800'
|
|
machine = ''
|
|
check_mask = '0x80'
|
|
pwr_hld = '0,0,A,0,1'
|
|
ofile = ''
|
|
partition_list = ''
|
|
try:
|
|
opts, args = getopt.getopt(argv, "h", ["input=","start-offset=","firmware-version=","machine-model=","machine-id=","manufacturer=","magic=","atag=","machine=","check-mask=","pwr-hld=","partition-list=","output="])
|
|
except getopt.GetoptError:
|
|
print (usage)
|
|
sys.exit(2)
|
|
for opt, arg in opts:
|
|
if opt == '-h':
|
|
print (usage)
|
|
sys.exit(2)
|
|
elif opt == "--input":
|
|
ifile = arg;
|
|
elif opt == "--start-offset":
|
|
start_offset = arg;
|
|
elif opt == "--firmware-version":
|
|
firmware_version = arg;
|
|
elif opt == "--machine":
|
|
machine = arg
|
|
elif opt == "--machine-model":
|
|
machine_model = arg;
|
|
elif opt == "--machine-id":
|
|
machine_id = arg;
|
|
elif opt == "--manufacturer":
|
|
manufacturer = arg;
|
|
elif opt == "--magic":
|
|
magic = arg;
|
|
elif opt == "--atag":
|
|
atag = arg;
|
|
elif opt == "--check-mask":
|
|
check_mask = arg;
|
|
elif opt == "--pwr-hld":
|
|
pwr_hld = arg;
|
|
elif opt == "--partition-list":
|
|
partition_list = arg;
|
|
elif opt == "--output":
|
|
ofile = arg;
|
|
else:
|
|
print (usage)
|
|
sys.exit(2)
|
|
|
|
if partition_list == '':
|
|
print (usage)
|
|
sys.exit(2)
|
|
# append '_b' parts if '_a' is exists.
|
|
list_partitions = partition_list.split(',')
|
|
cur_part_start = int(start_offset)
|
|
final_parts = ''
|
|
for cur_part in list_partitions:
|
|
pos_split = cur_part.find(':')
|
|
cur_part_name = cur_part[:pos_split]
|
|
pos_slotselect = cur_part.find('_a')
|
|
|
|
cur_part_size = cur_part[1 + pos_split:]
|
|
str_part, int_next_start_offset = generate_pt(cur_part_name, cur_part_size, cur_part_start)
|
|
cur_part_start = int_next_start_offset
|
|
final_parts += str_part + ","
|
|
if (pos_slotselect >= 0) & (pos_slotselect == (len(cur_part_name) - 2)):
|
|
slot_b_part_name = cur_part[:pos_slotselect] + '_b'
|
|
str_part, int_next_start_offset = generate_pt(slot_b_part_name, cur_part_size, cur_part_start)
|
|
cur_part_start = int_next_start_offset
|
|
final_parts += str_part + ","
|
|
|
|
partition_list = final_parts + generate_pt('userdata', '0', cur_part_start)
|
|
|
|
file_parameter_in = open(ifile)
|
|
template_parameter_in = file_parameter_in.read()
|
|
template_in_t = Template(template_parameter_in)
|
|
|
|
line = template_in_t.substitute(_firmware_version=firmware_version,_machine_model=machine_model,_machine_id=machine_id,_manufacturer=manufacturer,_magic=magic,_atag=atag,_machine=machine,_check_mask=check_mask,_pwr_hld=pwr_hld,_type=type,_partition_list=partition_list)
|
|
|
|
if ofile != '':
|
|
with open(ofile,"w") as f:
|
|
f.write(line)
|
|
else:
|
|
print (line)
|
|
|
|
if __name__=="__main__":
|
|
main(sys.argv[1:])
|