diff options
author | Yongqin Liu <yongqin.liu@linaro.org> | 2019-06-14 00:55:04 +0800 |
---|---|---|
committer | Yongqin Liu <yongqin.liu@linaro.org> | 2019-06-14 00:55:04 +0800 |
commit | 093486e60975d29464ffbf6499ba4ce96cc3a6eb (patch) | |
tree | 4800000bf9756173c638e4b60966e188e7d3c717 | |
parent | 9fb7321f01aea858f9d13a4efc0f8cebe072a5df (diff) | |
download | linaro-prebuilts-093486e60975d29464ffbf6499ba4ce96cc3a6eb.tar.gz |
add mkdtimg for hikey960 dt.img
Change-Id: I7f61297bde6d9e41541d51f5c2e133033c331178
Signed-off-by: Yongqin Liu <yongqin.liu@linaro.org>
-rwxr-xr-x | host/bin/mkdtimg | 159 | ||||
-rw-r--r-- | host/source.txt | 2 |
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 |