[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/scatter/tools/nand-utils/gen_nand_header.py b/src/bsp/scatter/tools/nand-utils/gen_nand_header.py
new file mode 100755
index 0000000..fa71e74
--- /dev/null
+++ b/src/bsp/scatter/tools/nand-utils/gen_nand_header.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+
+import ecc_bch
+import sys
+import os
+import struct
+import argparse
+import pp_tbl
+
+def gen_header(nand_name):
+ """ device info:
+ name vendor totalsize(MB) pagesize(B) sparesize(B) pageperblock cycle eccstrength
+ interface acccon acccon1 dqsdlymux dqsdlyctrl nfidlyctrl pptableenable lbasize
+ fastclock usedma fdmsize fdmeccsize strobesel
+ """
+ with open(os.getcwd() + "/tools/nand-utils/nand_device_list.txt", "r") as f:
+ found = 0
+ for l in f:
+ s = l.split()
+ if s[0] == nand_name:
+ found = 1
+ vendor = s[1]
+ total_size = int(s[2])
+ page_size = int(s[3])
+ #page_shift = len(bin(page_size).replace('0b','')) - 1
+ page_shift = 16 if page_size > 512 else 8
+ spare_size = int(s[4])
+ page_per_block = int(s[5])
+ address_cycle = int(s[6])
+ ecc_strength = int(s[7])
+ interface = int(s[8])
+ acccon = eval(s[9])
+ acccon1 = eval(s[10])
+ dqsdlymux = int(s[11])
+ dqsdlyctrl = eval(s[12])
+ nfidlyctrl = eval(s[13])
+ pptableen = int(s[14])
+ lba_size = int(s[15])
+ fast_clk = int(s[16])
+ use_dma = int(s[17])
+ fdm_size = int(s[18])
+ fdmecc_size = int(s[19])
+ strobesel = int(s[20])
+
+ # meaningless, just set pptableen value as BROM test code #
+ if not pptableen:
+ pptableen = 0xffff
+
+ break
+
+ if not found:
+ raise KeyError("not support " + nand_name)
+
+ #print s[0]
+ #print "vendor %s, total size %d(MB) page size %d, page shift %d, spare size %d, page per block %d" \
+ # % (vendor, total_size, page_size, page_shift, spare_size, page_per_block)
+ #print "address cycle %d, ecc strength %d, interface %d, acccon 0x%x, acccon1 0x%x" \
+ # % (address_cycle, ecc_strength, interface, acccon, acccon1)
+ #print "dqsdlymux %d, dqsdlyctrl 0x%x, nfidlyctrl 0x%x, pptable enable %d, lba size %d" \
+ # % (dqsdlymux, dqsdlyctrl, nfidlyctrl, pptableen, lba_size)
+ #print "fast clock enable %d, use dma %d, fdm size %d, fdmecc size %d" \
+ # % (fast_clk, use_dma, fdm_size, fdmecc_size)
+ #raise KeyError("not support " + nand_name)
+
+ # nand header is total 440B include ecc parity 140B #
+ header_size = 300
+ pptbl_size = 128
+
+ header = "NANDCONFIG!" + '\0'
+ header += struct.pack("I", total_size)
+ header += struct.pack("H", page_size)
+ header += struct.pack("H", address_cycle)
+ header += struct.pack("H", spare_size)
+ header += struct.pack("H", interface)
+ header += struct.pack("I", ecc_strength)
+ header += struct.pack("H", page_per_block)
+ header += struct.pack("H", page_shift)
+ header += struct.pack("H", pptableen)
+ header += struct.pack("H", dqsdlymux)
+ header += struct.pack("I", dqsdlyctrl)
+ header += struct.pack("I", acccon)
+ header += struct.pack("I", acccon1)
+ header += struct.pack("I", nfidlyctrl)
+ header += struct.pack("H", lba_size)
+ header += struct.pack("H", fast_clk)
+ header += struct.pack("H", use_dma)
+ header += struct.pack("H", strobesel)
+ header += struct.pack("H", fdm_size)
+ header += struct.pack("H", fdmecc_size)
+
+ # pad dummy byte #
+ header += '\x5a' * (header_size - len(header) - pptbl_size)
+ if pptableen == 1:
+ # add pptable #
+ if vendor == 'TSB':
+ header += str(bytearray(pp_tbl.TSB_PP))
+ else:
+ raise KeyError(" no %s pptable " % vendor)
+ else:
+ header += '\xff' * pptbl_size
+
+ # calculate header ecc parity #
+ header_size = 300
+ ecc_level = 80
+ ecc = ecc_bch.bch_enc_14(header, header_size, ecc_level)
+ header += ecc
+
+ header_file = nand_name + '_header.bin'
+ with open(header_file, "wb") as f:
+ f.write(header)
+
+ return (vendor, fdm_size, fdmecc_size, ecc_strength, spare_size, page_size, pptableen, page_per_block)
+
+def main(argv):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('nand_name', help = 'nand device name')
+ parser.add_argument('gpt_image', help = 'pmbr + gpt entry image ')
+ args = parser.parse_args()
+
+ # generate nand device header #
+ gen_header(args.nand_name)
+
+ # pad nand header #
+ with open(args.nand_name + '_header.bin', "rb") as f_h:
+ h_buf = f_h.read()
+ with open(args.gpt_image, "rb+") as f_g:
+ f_g.seek(440, 0)
+ h_buf = h_buf + f_g.read()
+ f_g.seek(0, 0)
+ f_g.write(h_buf)
+
+ os.remove(args.nand_name + '_header.bin')
+
+if __name__ == "__main__":
+ sys.exit(main(sys.argv))