Files
SDK_SG200x_V2/build/tools/common/image_tool/mkcvipart.py
carbon ff2f5f9161 create part info for the sd card version of u-boot
The partition size in partition_sd.xml is not used
when generating the sd image, but some of this
information will be used later in u-boot.

Signed-off-by: carbon <carbon@milkv.io>
2024-06-25 22:08:36 +08:00

232 lines
8.6 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
import argparse
import logging
import os
import sys
from XmlParser import XmlParser
FORMAT = "%(levelname)s: %(message)s"
logging.basicConfig(level=logging.INFO, format=FORMAT)
def parse_args():
parser = argparse.ArgumentParser(description="Create cvipart.h and fw_env.config")
parser.add_argument("xml", help="path to partition xml")
parser.add_argument("output", help="output folder")
parser.add_argument(
"--fw_env",
help="create fw_env.config with the parameter the script will create cvipart.h for u-boot",
action="store_true",
)
parser.add_argument(
"--block_size",
help="set block size for spinand, default is 128KB",
default=128 * 1024,
)
parser.add_argument(
"-v", "--verbose", help="increase output verbosity", action="store_true"
)
args = parser.parse_args()
if args.verbose:
logging.debug("Enable more verbose output")
logging.getLogger().setLevel(level=logging.DEBUG)
return args
def gen_cvipart_h(output, parser):
logging.info("generating cvipart.h")
parts = parser.parse()
with open(os.path.join(output, "cvipart.h"), "w") as of:
of.write("/* this file should be generated by mkcvipart.py,")
of.write("please do not modify this file manually*/\n\n")
of.write("#ifndef CVIPART_H\n")
of.write("#define CVIPART_H\n")
env_exist = True
env_bak = False
# Generate ENV_OFFSET
if "ENV" in parser.parts:
label = "ENV"
elif "U-BOOT ENV" in parser.parts:
label = "U-BOOT ENV"
else:
# If no ENV or U-BOOT ENV has been set in partition.xml, we assume
# there is no env support
of.write("#ifndef CONFIG_ENV_IS_NOWHERE\n#define CONFIG_ENV_IS_NOWHERE\n#endif\n")
of.write("#define CONFIG_ENV_SIZE 0x20000\n")
env_exist = False
if env_exist and "ENV_BAK" in parser.parts:
env_bak = True
LBA_SIZE = 1
if parser.getStorage() == "emmc":
if env_exist:
of.write("#define CONFIG_ENV_IS_IN_MMC\n")
of.write("#define CONFIG_ENV_SECT_SIZE 0x40000\n")
of.write("#define CONFIG_SYS_MMC_ENV_DEV 0\n")
of.write("#define CONFIG_SYS_MMC_ENV_PART 0\n")
# Generintg BLKDEV
of.write("#define PART_LAYOUT ")
of.write("\"blkdevparts=mmcblk0:")
for i, p in enumerate(parts):
if p["part_size"] != sys.maxsize:
part_size = str(int(p["part_size"] / 1024)) + "K"
else:
part_size = "-"
if part_size == "-" or i == len(parts) - 1:
comma = ";"
else:
comma = ","
of.write("%s(%s)%s" % (part_size, p["label"], comma))
of.write("mmcblk0boot0:1M(fip),1M(fip_bak);\"")
of.write("\n")
for i, p in enumerate(parts):
if p["label"] == "ROOTFS":
of.write('#define ROOTFS_DEV "/dev/mmcblk0p%d"\n' % (i + 1))
elif parser.getStorage() == "spinand":
if env_exist:
of.write("#define CONFIG_ENV_IS_IN_NAND\n")
of.write("#define CONFIG_ENV_SECT_SIZE 0x40000\n")
# Generintg MTDPART
of.write("#define PART_LAYOUT ")
of.write('"mtdparts=cvsnfc:')
for i, p in enumerate(parts):
if p["part_size"] != sys.maxsize:
part_size = str(int(p["part_size"] / 1024)) + "K"
else:
part_size = "-"
if part_size == "-" or i == len(parts) - 1:
comma = "\"\n"
else:
comma = ","
of.write("%s(%s)%s" % (part_size, p["label"], comma))
elif parser.getStorage() == "spinor":
if env_exist:
of.write("#define CONFIG_ENV_IS_IN_SPI_FLASH\n")
of.write("#define CONFIG_ENV_SECT_SIZE 0x10000\n")
# Generintg MTDPART
of.write("#define PART_LAYOUT ")
of.write('"mtdparts=10000000.cvi-spif:')
for i, p in enumerate(parts):
if p["part_size"] != sys.maxsize:
part_size = str(int(p["part_size"] / 1024)) + "K"
else:
part_size = "-"
if part_size == "-" or i == len(parts) - 1:
comma = '"\n'
else:
comma = ","
of.write("%s(%s)%s" % (part_size, p["label"], comma))
for i, p in enumerate(parts):
if p["label"] == "ROOTFS":
of.write('#define ROOTFS_DEV "/dev/mtdblock%d"\n' % i)
break
elif parser.getStorage() == "sd":
of.write('#define PART_LAYOUT ""\n')
for i, p in enumerate(parts):
if p["label"] == "ROOTFS":
of.write('#define ROOTFS_DEV "/dev/mmcblk0p%d"\n' % (i+1))
break
elif parser.getStorage() == "none":
of.write('#define PART_LAYOUT ""\n')
of.write('#define ROOTFS_DEV ""\n')
of.write('#define PARTS_OFFSET ""\n')
if env_exist:
of.write(
"#define CONFIG_ENV_OFFSET 0x%X\n"
% (parser.parts[label]["offset"])
)
if env_bak:
of.write(
"#define CONFIG_ENV_OFFSET_REDUND 0x%X\n"
% (parser.parts["ENV_BAK"]["offset"] * LBA_SIZE)
)
of.write("#define CONFIG_SYS_REDUNDAND_ENVIRONMENT\n")
of.write(
"#define CONFIG_ENV_SIZE 0x%X\n" % parser.parts[label]["part_size"]
)
# Generintg PART_ENV
if parser.getStorage() == "emmc" or parser.getStorage() == "sd":
LBA_SIZE = 512
if parser.getStorage() != "none":
of.write("#define PARTS_OFFSET \\\n")
for i, p in enumerate(parts):
of.write('"%s_PART_OFFSET=0x%x\\0" \\\n' % (p["label"], int(p["offset"] / LBA_SIZE)))
if i == len(parts) - 1:
of.write(
'"%s_PART_SIZE=0x%x\\0"\n'
% (p["label"], int(p["part_size"] / LBA_SIZE))
)
else:
of.write(
'"%s_PART_SIZE=0x%x\\0" \\\n'
% (p["label"], int(p["part_size"] / LBA_SIZE))
)
for i, p in enumerate(parts):
if p["label"] == 'BOOT':
of.write('#define SPL_%s_PART_OFFSET 0x%x\n' % (p["label"], int(p["offset"] / LBA_SIZE)))
elif p["label"] == 'jump':
of.write('#define SPL_%s_PART_OFFSET 0x%x\n' % ("BOOT", 0))
of.write("#endif")
logging.info("Done!")
def gen_fw_config(output, parser, block_size=128 * 1024):
logging.info("generating fw_env.config")
parts = parser.parse()
part_index = -1
with open(os.path.join(output, "fw_env.config"), "w") as of:
for i in range(len(parts)):
if parts[i]["label"] == "ENV" or parts[i]["label"] == "U-BOOT ENV" or parts[i]["label"] == "ENV_BAK":
part_index = i
if parser.storage == "spinand":
of.write(
"/dev/mtd%d 0x%x 0x%x 0x%x\n"
% (part_index, 0, parts[part_index]["part_size"], block_size)
)
elif parser.storage == "emmc":
of.write(
"/dev/mmcblk0 0x%x 0x%x\n"
% ((parts[part_index]["offset"] * 512), parts[part_index]["part_size"])
)
elif parser.storage == "spinor":
of.write(
"/dev/mtd%d 0x%x 0x%x 0x%x\n"
% (part_index, 0, parts[part_index]["part_size"], 64 * 1024)
)
if part_index == -1:
logging.info(
"There is no ENV or U-BOOT ENV partition in partition.xml ignore generating fw_env.config"
)
if os.path.isfile("fw_env.config"):
os.remove("fw_env.config")
return
def main():
args = parse_args()
parser = XmlParser(args.xml)
if not args.fw_env:
gen_cvipart_h(args.output, parser)
else:
gen_fw_config(args.output, parser, args.block_size)
if __name__ == "__main__":
main()