nt9856x/BSP/root-fs/verify_leb.py
2023-03-28 15:07:53 +08:00

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)