from __future__ import print_function
import argparse
import os
import re
in_dir = "fs"
out_dir = "fs_image"
out_name = "maixpy_spiffs.img"
parser = argparse.ArgumentParser(description='generate spiffs image', prog="gen_spiffs_image.py")
parser.add_argument("config_file", help = "project config file path, MUST the same with firmware's", default="")
args = parser.parse_args()
if args.config_file == "" or not os.path.exists(args.config_file):
print("file {} not found".format(args.config_file))
exit(1)
if not os.path.exists(in_dir):
print("file system dir not found:"+in_dir)
print("please put files in "+in_dir+" folder")
os.mkdir(in_dir)
exit(1)
if len(os.listdir(in_dir)) == 0:
print("[WARNING] No file in fs dir, so the image will be empty")
# check submodule
if len(os.listdir("mkspiffs")) == 0:
ret = os.system("git submodule update --init mkspiffs")
if ret != 0:
print("[ERROR] update submodule mkspiffs fail")
exit(1)
if len(os.listdir("mkspiffs/spiffs")) == 0:
os.chdir("mkspiffs")
ret = os.system("git submodule update --init spiffs")
if ret != 0:
print("[ERROR] update submodule mkspiffs/spiffs fail")
exit(1)
os.chdir("..")
f = open(args.config_file)
content = f.read()
f.close()
match = re.findall(r"{}(.*){}(.*)\n".format("CONFIG_SPIFFS_", "="), content)
config = {}
for item in match:
v = item[1]
if v == "y":
v = "1"
config["SPIFFS_"+item[0]] = v
flags = ""
for key in config.keys():
flags += ' -D'+key+'='+config[key]
flags += ' -DSPIFFS_READ_ONLY=0 -DSPIFFS_ALIGNED_OBJECT_INDEX_TABLES=1 -DSPIFFS_SINGLETON=0 -DSPIFFS_HAL_CALLBACK_EXTRA=0'
gen_exe_cmd = 'cd mkspiffs && make clean && make dist CPPFLAGS="'+flags+'" BUILD_CONFIG_NAME=-maixpy'
print("--------------------")
print(gen_exe_cmd)
print("--------------------")
ret = os.system(gen_exe_cmd)
if ret != 0:
exit(1)
if not os.path.exists(out_dir):
os.mkdir(out_dir)
dirs = os.listdir("mkspiffs")
exe_path = None
for dir in dirs:
if os.path.isfile(os.path.join("mkspiffs", dir)):
continue
match = re.findall(r"{}(.*){}(.*)".format("mkspiffs", "maixpy"), dir)
if len(match) > 0:
exe_path = os.path.abspath("mkspiffs/"+dir+"/mkspiffs")
break
print(exe_path)
logical_block_size = int(config["SPIFFS_LOGICAL_BLOCK_SIZE"], 16)
logical_page_size = int(config["SPIFFS_LOGICAL_PAGE_SIZE"], 16)
image_size = int(config["SPIFFS_SIZE"], 16)
flash_addr = int(config["SPIFFS_START_ADDR"], 16)
gen_image_cmd = "{} -c {} -b {} -p {} -s {} {}/{}".format(exe_path, in_dir, logical_block_size, logical_page_size, image_size, out_dir, out_name)
print("--------------------")
print(gen_image_cmd)
print("--------------------")
ret = os.system(gen_image_cmd)
if ret != 0:
exit(1)
print("[SUCCESS] image file in "+out_dir)
print("[USAGE] Please flash {}/{} to address 0x{:X} of flash with flash tool kflash_gui".format(out_dir, out_name, flash_addr))