116 lines
3.0 KiB
Python
116 lines
3.0 KiB
Python
#!/usr/bin/python3
|
|
# -*- coding: utf-8 -*-
|
|
import argparse
|
|
import logging
|
|
import os
|
|
import re
|
|
|
|
|
|
class partition:
|
|
name = ""
|
|
addr = ""
|
|
size = ""
|
|
filename = ""
|
|
|
|
def __init__(self, name, addr, size):
|
|
self.name = name
|
|
self.addr = addr
|
|
self.size = size
|
|
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(description="Create cvipart.h")
|
|
parser.add_argument("part_table", help="path to partition xml")
|
|
parser.add_argument("output", help="output folder")
|
|
|
|
args = parser.parse_args()
|
|
|
|
return args
|
|
|
|
|
|
def gen_cvipart_h(output, part_list):
|
|
logging.info("generating cvipart.h")
|
|
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
|
|
|
|
# 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:
|
|
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:"\n')
|
|
of.write('#define ROOTFS_DEV ""\n')
|
|
|
|
# Generintg PART_ENV
|
|
of.write("#define PARTS_OFFSET \\\n")
|
|
for i, p in enumerate(part_list):
|
|
of.write('"%s_PART_OFFSET=%s\\0" \\\n' % (p.name, p.addr))
|
|
if i == len(part_list) - 1:
|
|
of.write(
|
|
'"%s_PART_SIZE=%s\\0"\n'
|
|
% (p.name, p.size)
|
|
)
|
|
else:
|
|
of.write(
|
|
'"%s_PART_SIZE=%s\\0" \\\n'
|
|
% (p.name, p.size)
|
|
)
|
|
|
|
of.write("#endif")
|
|
logging.info("Done!")
|
|
|
|
|
|
def get_part(str_list):
|
|
name = addr = size = ""
|
|
str = ''.join(str_list).replace(" ", "")
|
|
kv_list = str.split(",")
|
|
for i in kv_list:
|
|
key = i.split(":")[0]
|
|
val = i.split(":")[1]
|
|
if(key == "name"):
|
|
name = val
|
|
elif(key == "address"):
|
|
addr = val
|
|
elif(key == "size"):
|
|
size = val
|
|
|
|
part = partition(name, addr, size)
|
|
|
|
return part
|
|
|
|
|
|
def parse_part_table(file):
|
|
part_list = []
|
|
fp = open(file, "r")
|
|
sample = fp.readlines()
|
|
p = re.compile(r'[{](.*?)[}]', re.S)
|
|
for i in sample:
|
|
if "-" in i:
|
|
str_list = re.findall(p, i)
|
|
partition = get_part(str_list)
|
|
part_list.append(partition)
|
|
fp.close()
|
|
|
|
return part_list
|
|
|
|
|
|
def main():
|
|
args = parse_args()
|
|
part_list = parse_part_table(args.part_table)
|
|
|
|
gen_cvipart_h(args.output, part_list)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|