95 lines
3.1 KiB
Python
Executable File
95 lines
3.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import sys
|
|
import os
|
|
import pyfdt
|
|
import json
|
|
import argparse
|
|
import ubi_max_leb
|
|
from pyfdt import FdtBlobParse
|
|
|
|
# find partition size by label name
|
|
def find_partition_size(fdt_root, label):
|
|
fdt_iter = fdt_root.walk()
|
|
for node in fdt_iter:
|
|
currpath = r"" + node[0]
|
|
if "nand@" in currpath or "nor@" in currpath:
|
|
currnode = node[1]
|
|
if not isinstance(currnode, pyfdt.FdtNode):
|
|
continue
|
|
subnode_iter = currnode.walk()
|
|
for subnode in subnode_iter:
|
|
currsubnode = subnode[1]
|
|
if not isinstance(currsubnode, pyfdt.FdtNode):
|
|
continue
|
|
try:
|
|
label_index = currsubnode.index("label")
|
|
except ValueError:
|
|
continue
|
|
lable_name = currsubnode[label_index]
|
|
if lable_name.strings[0] == label:
|
|
reg_index = currsubnode.index("reg")
|
|
reg = currsubnode[reg_index]
|
|
partition_size = int(reg.words[2])<<32 | int(reg.words[3])
|
|
return partition_size
|
|
return None
|
|
|
|
def parse_args(argv):
|
|
parser = argparse.ArgumentParser(description='fdt find partition size')
|
|
parser.add_argument('-f', '--file',metavar='.dtb/.bin', required=True,
|
|
dest='file', action='store',
|
|
help='fdt binary file')
|
|
parser.add_argument('-l', '--label',metavar='partition_label', required=True,
|
|
dest='label', action='store',
|
|
help='the label of partition')
|
|
parser.add_argument('-b', '--leb',metavar="mtd_cfg's leb", required=True,
|
|
dest='leb', action='store',
|
|
help='the label of partition')
|
|
args = parser.parse_args()
|
|
return args
|
|
|
|
def main(argv):
|
|
if 0:
|
|
argv.append(r"-f")
|
|
argv.append(r"d:\tmp\nvt-na51055-evb.bin")
|
|
argv.append(r"-l")
|
|
argv.append(r"rootfs2")
|
|
|
|
args = parse_args(argv)
|
|
|
|
if not os.path.isfile(args.file):
|
|
print("cannot find {}".format(args.file), file=sys.stderr)
|
|
return -1
|
|
|
|
with open(args.file, 'rb') as infile:
|
|
dtb = FdtBlobParse(infile)
|
|
|
|
fdt_root = dtb.to_fdt().get_rootnode()
|
|
partition_size = find_partition_size(fdt_root, args.label)
|
|
if partition_size is None:
|
|
print("cannot find label:'{}' in storage partition".format(args.label), file=sys.stderr)
|
|
return -1
|
|
|
|
expected_leb = int(ubi_max_leb.get_ubifs_max_leb(partition_size))
|
|
mtdcfg_leb = int(args.leb)
|
|
|
|
if expected_leb != mtdcfg_leb:
|
|
print("leb not matched. expected:{} vs mtdcfg:{} on {} partition size: 0x{:X}".format(expected_leb, mtdcfg_leb, args.label, partition_size), file=sys.stderr)
|
|
return -1
|
|
|
|
# output partition size for Makefile
|
|
print("leb verify ok, leb:{} on {} partition size: 0x{:X}".format(mtdcfg_leb, args.label, partition_size))
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
er = main(sys.argv)
|
|
except Exception as exp:
|
|
er = -1
|
|
print(exp, file=sys.stderr)
|
|
raise exp
|
|
sys.exit(er)
|
|
|