summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYongqin Liu <yongqin.liu@linaro.org>2019-06-14 00:55:04 +0800
committerYongqin Liu <yongqin.liu@linaro.org>2019-06-14 00:55:04 +0800
commit093486e60975d29464ffbf6499ba4ce96cc3a6eb (patch)
tree4800000bf9756173c638e4b60966e188e7d3c717
parent9fb7321f01aea858f9d13a4efc0f8cebe072a5df (diff)
downloadlinaro-prebuilts-093486e60975d29464ffbf6499ba4ce96cc3a6eb.tar.gz
add mkdtimg for hikey960 dt.img
Change-Id: I7f61297bde6d9e41541d51f5c2e133033c331178 Signed-off-by: Yongqin Liu <yongqin.liu@linaro.org>
-rwxr-xr-xhost/bin/mkdtimg159
-rw-r--r--host/source.txt2
2 files changed, 161 insertions, 0 deletions
diff --git a/host/bin/mkdtimg b/host/bin/mkdtimg
new file mode 100755
index 0000000..6572204
--- /dev/null
+++ b/host/bin/mkdtimg
@@ -0,0 +1,159 @@
+#!/usr/bin/env python
+# Copyright 2017, The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from __future__ import print_function
+try:
+ from os import fstat, stat, remove
+ from sys import exit
+ from argparse import ArgumentParser, FileType
+ from ctypes import sizeof, Structure, c_char, c_int
+ from struct import pack, calcsize
+ import zlib
+except Exception as e:
+ print("some module is needed:" + str(e))
+ exit(-1)
+
+dt_head_info_fmt = '4sII'
+dt_entry_fmt = 'Q4I2Q'
+dtimg_version = 1
+dtb_count = 1
+
+def write32(output, value):
+ output.write(chr(value & 255)) ; value=value // 256
+ output.write(chr(value & 255)) ; value=value // 256
+ output.write(chr(value & 255)) ; value=value // 256
+ output.write(chr(value & 255))
+
+def compress(filename, input, output):
+ output.write('\037\213\010')
+ output.write(chr(0))
+
+ statval = stat(filename)
+ write32(output, 0)
+ output.write('\002')
+ output.write('\003')
+
+ crcval = zlib.crc32("")
+ compobj = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS,
+ zlib.DEF_MEM_LEVEL, 0)
+ while True:
+ data = input.read(1024)
+ if data == "":
+ break
+ crcval = zlib.crc32(data, crcval)
+ output.write(compobj.compress(data))
+ output.write(compobj.flush())
+ write32(output, crcval)
+ write32(output, statval.st_size)
+
+def dtb_compress(dtb_file):
+ try:
+ outputname = dtb_file + '.gz'
+ input = open(dtb_file, 'rb')
+ output = open(outputname, 'wb')
+ compress(dtb_file, input, output)
+ input.close()
+ output.close()
+ except Exception as e:
+ print('dtb_compress error:' + str(e))
+ exit(-1)
+ return outputname
+
+class dt_head_info(Structure):
+ _fields_ = [('magic', c_char * 4),
+ ('version', c_int),
+ ('dt_count', c_int)]
+
+class dt_entry_t(Structure):
+ _fields_ = [('dtb_size', c_int),
+ ('dtb_offset', c_int)]
+
+def align_page_size(offset, pagesize):
+ return (pagesize - (offset % pagesize))
+
+def write_head_info(head_info, args):
+ args.output.write(pack(dt_head_info_fmt,
+ head_info.magic,
+ head_info.version,
+ head_info.dt_count))
+
+def write_dtb_entry_t(dt_entry, args):
+ args.output.write(pack(dt_entry_fmt,
+ 0, # reserved
+ dt_entry.dtb_size,
+ 0, # reserved
+ dt_entry.dtb_offset,
+ 0, # reserved
+ 0, # reserved
+ 0)) # reserved
+
+def write_padding(args, padding):
+ for i in range(0, padding):
+ args.output.write('\x00')
+
+def write_dtb(args):
+ dtb_file = args.dtb
+ out_dtb = dtb_file
+ if args.compress == True:
+ out_dtb = dtb_compress(dtb_file)
+ try:
+ dtb_offset = calcsize(dt_head_info_fmt) + \
+ calcsize(dt_entry_fmt) + \
+ 4
+ padding = align_page_size(dtb_offset, args.pagesize)
+ dtb_size = stat(out_dtb).st_size
+ dtb_size_padding = align_page_size(dtb_size, args.pagesize)
+ dt_entry = dt_entry_t(dtb_size + dtb_size_padding,
+ dtb_offset + padding)
+ write_dtb_entry_t(dt_entry, args)
+ args.output.write(pack('I', 0)) # SUCCESS code number
+ write_padding(args, padding)
+ with open(out_dtb, 'rb') as dtb_fd:
+ args.output.write(dtb_fd.read(dtb_size))
+ write_padding(args, dtb_size_padding)
+ except Exception as e:
+ print('write dtb error:' + str(e))
+ exit(-1)
+
+def clean_gz_file(args):
+ try:
+ if args.compress != True:
+ return
+ remove(args.dtb + '.gz')
+ except Exception as e:
+ print('clean gz file error:' + str(e))
+ exit(-1)
+
+def parse_cmdline():
+ parser = ArgumentParser()
+ parser.add_argument('-c', '--compress', help='compress dtb or not',
+ action='store_true')
+ parser.add_argument('-d', '--dtb', help='path to the dtb', type=str,
+ required=True)
+ parser.add_argument('-s', '--pagesize', help='align page size',
+ type=int, choices=[2**i for i in range(11,15)],
+ default=2048)
+ parser.add_argument('-o', '--output', help='output file name',
+ type=FileType('wb'), required=True)
+ return parser.parse_args()
+
+def main():
+ args = parse_cmdline()
+ dtimg_head_info = dt_head_info('HSDT', dtimg_version, dtb_count)
+ write_head_info(dtimg_head_info, args)
+ write_dtb(args)
+ clean_gz_file(args)
+
+if __name__ == '__main__':
+ main()
diff --git a/host/source.txt b/host/source.txt
index 89a88cc..e6c0eff 100644
--- a/host/source.txt
+++ b/host/source.txt
@@ -14,3 +14,5 @@ fat16copy.py:
mkfs.fat:
git clone https://github.com/dosfstools/dosfstools -b v3.0.28
cd dosfstools && make
+mkdtimg
+ https://android-git.linaro.org/device/linaro/hikey.git/plain/installer/hikey960/mkdtimg?id=5d080802a739760417b7a9e0b4a0fe013d308f84