[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/scatter/tools/nand-utils/gen_burner_image.py b/src/bsp/scatter/tools/nand-utils/gen_burner_image.py
new file mode 100644
index 0000000..a6acb1a
--- /dev/null
+++ b/src/bsp/scatter/tools/nand-utils/gen_burner_image.py
@@ -0,0 +1,133 @@
+#!/usr/bin/env python
+
+import argparse
+import sys
+import os
+import math
+import shutil
+import pp_tbl
+import gen_nand_header
+import gen_nand_header_v11
+import randomizer
+from pad_ecc_by_sector import pad_ecc
+from randomizer import randomizer
+
+def padding(data, size):
+ return data + '\0' * (size - len(data))
+
+def main(argv):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('nand_name', help = 'nand device name')
+ parser.add_argument('in_image', help = 'raw input image')
+ parser.add_argument('out_image', help = 'the output burn image ')
+ parser.add_argument('version', help= 'nand header version')
+ parser.add_argument('rand_en', help = 'if randomizer is enabled')
+ args = parser.parse_args()
+ version = float(args.version)
+ rand_en = int(args.rand_en)
+
+ if version == 2.0:
+ (vendor, fdm_size, fdmecc_size, ecc_strength, spare_size, page_size, ppen, ppb) = gen_nand_header.gen_header(args.nand_name)
+ bad_swap = 1
+ elif version == 1.1:
+ (vendor, fdm_size, fdmecc_size, ecc_strength, spare_size, page_size, ppen, ppb) = gen_nand_header_v11.gen_header(args.nand_name, 192, args.nand_name + '_header.bin')
+ bad_swap = 0
+
+ ecc_file = args.out_image
+ rand_file = args.out_image
+ if rand_en == 1:
+ ecc_file = args.nand_name + '_ecc.bin'
+ if ppen == 1:
+ paired = raw_input("insert empty paired page ? Y/y or N/n ")
+ if paired in ['Y', 'y']:
+ rand_file = args.nand_name + '_rand.bin'
+ ecc_file = args.nand_name + '_ecc.bin'
+ sector_size = 1024 if page_size > 512 else 512
+ sector_per_page = page_size / sector_size
+ sector_spare_size = spare_size / sector_per_page
+ # input image page size alignment #
+ file_len = os.path.getsize(args.in_image)
+ pages = int(math.ceil(float(file_len) / page_size))
+ in_file = "temp_in.bin"
+ with open(args.in_image, "rb") as f_in:
+ with open(in_file, "wb") as f_temp:
+ f_temp.write(padding(f_in.read(), pages * page_size))
+ pad_ecc(in_file, ecc_file, sector_size, fdm_size, fdmecc_size, ecc_strength, sector_spare_size, page_size, bad_swap)
+
+ if rand_en == 1:
+ randomizer(ecc_file, rand_file, "SS", 1, page_size, spare_size, sector_size, ppb, ppen, vendor)
+
+ # MT8516 force sector spare size from 56, 54, to be 52
+ if version == 1.1:
+ # spare settings must match 8516 BOOT ROM, The sector size default is 1024 bytes.
+ SPARES = [32, 52, 64, 80, 88, 96, 100, 104, 122, 124]
+ sector_spare_size_adjust = sector_spare_size
+
+ for i in range(len(SPARES)):
+ if (sector_spare_size <= SPARES[i]):
+ if sector_spare_size == SPARES[i]:
+ sector_spare_size_adjust = SPARES[i]
+ if (sector_spare_size < SPARES[i]) and (i != 0):
+ sector_spare_size_adjust = SPARES[i - 1]
+ break
+ k = 0
+ pad_data = (sector_spare_size - sector_spare_size_adjust) * sector_per_page
+ adjust_file = rand_file + '_adjust'
+ f_in = open(rand_file, "rb")
+ f_out = open(adjust_file, "wb")
+ for i in range(pages * sector_per_page):
+ f_in.seek(((sector_size + sector_spare_size) * i), 0)
+ sector_data = f_in.read(sector_size + sector_spare_size_adjust)
+ if (i % sector_per_page) == (sector_per_page - 1):
+ sector_data += '\xff' * pad_data
+ if (i) > 0 and (i % sector_per_page) == 0:
+ k = k + 1
+ f_out.seek(((sector_size + sector_spare_size) * i), 0)
+ else:
+ f_out.seek((sector_size + sector_spare_size_adjust) * i + (k * pad_data), 0)
+
+ f_out.write(sector_data)
+
+ f_in.close()
+ f_out.close()
+ shutil.copyfile(adjust_file, rand_file)
+ # remove temp files #
+ os.remove(adjust_file)
+ # insert empty paired page #
+ if ppen == 1 and paired in ['Y', 'y']:
+ if rand_en == 1:
+ pp_file = rand_file
+ else:
+ pp_file = ecc_file
+ if vendor == 'TSB':
+ PP = pp_tbl.TSB_PP
+ else:
+ raise Exception("unsupport %s pp table " % vendor)
+ f_pp = open(pp_file, "rb")
+ f_out = open(args.out_image, "wb")
+
+ if (os.path.getsize(in_file) % page_size) != 0:
+ raise Exception("input image size is not page size aligned")
+ page_number = os.path.getsize(in_file) / page_size
+ block_number = int(math.ceil(float(page_number) / (ppb / 2)))
+ print "page num %d block num %d" % (page_number, block_number)
+ for i in range(ppb * block_number):
+ if page_number > 0 and (i % ppb) in PP:
+ f_out.write(f_pp.read(page_size + spare_size))
+ page_number -= 1
+ else:
+ f_out.write('\xff' * (page_size + spare_size))
+ f_pp.close()
+ f_out.close()
+ # remove temp files #
+ os.remove(pp_file)
+
+ if rand_en == 1:
+ os.remove(ecc_file)
+
+ # remove temp files #
+ os.remove(args.nand_name + '_header.bin')
+ os.remove(in_file)
+
+if __name__ == "__main__":
+ sys.exit(main(sys.argv))