2023-11-09 20:19:51 +08:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -*- coding:utf-8 -*-
|
2024-09-03 11:16:08 +08:00
|
|
|
# SPDX-License-Identifier: Apache-2.0
|
2023-11-09 20:19:51 +08:00
|
|
|
#
|
|
|
|
|
# Dehuang.Wu
|
2025-04-23 17:54:31 +08:00
|
|
|
# Copyright (C) 2021-2025 ArtInChip Technology Co., Ltd
|
2023-11-09 20:19:51 +08:00
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import re
|
|
|
|
|
import sys
|
|
|
|
|
import platform
|
|
|
|
|
import argparse
|
|
|
|
|
import subprocess
|
|
|
|
|
|
2024-04-03 16:40:57 +08:00
|
|
|
|
2023-11-09 20:19:51 +08:00
|
|
|
def run_cmd(cmdstr):
|
2025-01-08 19:12:06 +08:00
|
|
|
print(cmdstr)
|
2023-11-09 20:19:51 +08:00
|
|
|
cmd = cmdstr.split(' ')
|
|
|
|
|
ret = subprocess.run(cmd, stdout=subprocess.PIPE)
|
|
|
|
|
if ret.returncode != 0:
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
2024-04-03 16:40:57 +08:00
|
|
|
|
|
|
|
|
def mkimage_get_resource_size(srcdir, block_siz):
|
|
|
|
|
total_size = 0
|
|
|
|
|
root_path = srcdir
|
|
|
|
|
for root, dirs, files in os.walk(srcdir):
|
|
|
|
|
for fn in files:
|
|
|
|
|
fpath = os.path.join(root, fn)
|
|
|
|
|
size = os.path.getsize(fpath)
|
|
|
|
|
size = block_siz * int(round((size + block_siz - 1) / block_siz))
|
|
|
|
|
total_size += size
|
|
|
|
|
return total_size
|
|
|
|
|
|
|
|
|
|
|
2023-11-09 20:19:51 +08:00
|
|
|
def mkimage_get_mtdpart_size(outfile):
|
|
|
|
|
imgname = os.path.basename(outfile)
|
|
|
|
|
partlist = os.path.join(os.path.dirname(outfile), 'partition_file_list.h')
|
|
|
|
|
size = 0
|
|
|
|
|
if not os.path.exists(partlist):
|
|
|
|
|
return 0
|
|
|
|
|
with open(partlist) as f:
|
|
|
|
|
lines = f.readlines()
|
|
|
|
|
for ln in lines:
|
|
|
|
|
name = ln.split(',')[1].replace('"', '').replace('*', '')
|
|
|
|
|
if imgname == name or imgname in name:
|
|
|
|
|
size = int(ln.split(',')[2])
|
|
|
|
|
return size
|
|
|
|
|
print('Image {} is not used in any partition'.format(imgname))
|
2024-04-03 16:40:57 +08:00
|
|
|
print('please check your project\'s image_cfg.json')
|
2023-11-09 20:19:51 +08:00
|
|
|
return size
|
|
|
|
|
|
2024-04-03 16:40:57 +08:00
|
|
|
|
2025-01-08 19:12:06 +08:00
|
|
|
def main(args):
|
|
|
|
|
inputdir = args.inputdir
|
|
|
|
|
# First priority is pack folder in the same directory with output file
|
|
|
|
|
inputdir_1st = os.path.join(os.path.dirname(args.outfile), inputdir)
|
|
|
|
|
if os.path.exists(inputdir_1st):
|
|
|
|
|
inputdir = inputdir_1st
|
|
|
|
|
if os.path.exists(inputdir) is False:
|
2025-04-23 17:54:31 +08:00
|
|
|
print('Warning: inputdir {} is not exist, use a empty one.'.format(inputdir))
|
2025-01-08 19:12:06 +08:00
|
|
|
inputdir = os.path.dirname(args.outfile) + '/empty'
|
|
|
|
|
os.makedirs(inputdir, exist_ok=True)
|
|
|
|
|
print(inputdir)
|
2024-09-30 17:06:01 +08:00
|
|
|
if args.imgsize is not None:
|
|
|
|
|
imgsize = int(args.imgsize)
|
|
|
|
|
else:
|
|
|
|
|
imgsize = mkimage_get_mtdpart_size(args.outfile)
|
|
|
|
|
|
2024-04-03 16:40:57 +08:00
|
|
|
if imgsize == 0:
|
2025-01-08 19:12:06 +08:00
|
|
|
imgsize = mkimage_get_resource_size(inputdir, int(args.blocksize))
|
2024-04-03 16:40:57 +08:00
|
|
|
# Add some free space
|
|
|
|
|
imgsize += (4 * int(args.blocksize))
|
2023-11-09 20:19:51 +08:00
|
|
|
cmdstr = args.tooldir
|
|
|
|
|
if platform.system() == 'Linux':
|
|
|
|
|
cmdstr += 'mklittlefs '
|
|
|
|
|
elif platform.system() == 'Windows':
|
|
|
|
|
cmdstr += 'mklittlefs.exe '
|
2025-01-08 19:12:06 +08:00
|
|
|
cmdstr += '-c {} '.format(inputdir)
|
2023-11-09 20:19:51 +08:00
|
|
|
cmdstr += '-b {} '.format(args.blocksize)
|
|
|
|
|
cmdstr += '-p {} '.format(args.pagesize)
|
|
|
|
|
cmdstr += '-s {} '.format(imgsize)
|
|
|
|
|
cmdstr += '{}'.format(args.outfile)
|
|
|
|
|
run_cmd(cmdstr)
|
2025-01-08 19:12:06 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
|
parser.add_argument("-i", "--inputdir", type=str,
|
|
|
|
|
help="input directory")
|
|
|
|
|
parser.add_argument("-o", "--outfile", type=str,
|
|
|
|
|
help="output file")
|
|
|
|
|
parser.add_argument("-p", "--pagesize", type=str,
|
|
|
|
|
help="page size")
|
|
|
|
|
parser.add_argument("-b", "--blocksize", type=str,
|
|
|
|
|
help="block size")
|
|
|
|
|
parser.add_argument("-t", "--tooldir", type=str,
|
|
|
|
|
help="tool directory")
|
|
|
|
|
parser.add_argument("-g", "--imgsize", type=str,
|
|
|
|
|
help="image size")
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
main(args)
|