rockchip: remove boot image

Signed-off-by: sbwml <admin@cooluc.com>
This commit is contained in:
sbwml 2023-12-17 23:48:45 +08:00
parent 13a8d9338f
commit 69350f534b
9 changed files with 0 additions and 2820 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 690 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 690 KiB

View File

@ -1,313 +0,0 @@
#!/usr/bin/env python
# SPDX-License-Identifier: GPL-2.0 */
# -*- coding: utf-8 -*-
from struct import unpack, pack
import sys
import getopt
class BMPFile:
def __init__(self, file_path, force_revers=0, force_swap=0):
self.file = open(file_path, "rb+")
# bmp head 14bit
self.bfType = unpack("<h", self.file.read(2))[0]
self.bfSize = unpack("<i", self.file.read(4))[0]
self.bfReserved1 = unpack("<h", self.file.read(2))[0]
self.bfReserved2 = unpack("<h", self.file.read(2))[0]
self.bfOffBits = unpack("<i", self.file.read(4))[0]
self.biSize = unpack("<i", self.file.read(4))[0]
self.biWidth = unpack("<i", self.file.read(4))[0]
self.biHeight = unpack("<i", self.file.read(4))[0]
self.biPlanes = unpack("<h", self.file.read(2))[0]
self.biBitCount = unpack("<h", self.file.read(2))[0]
# bmp parameter 40 bit normaally
self.biCompression = unpack("<i", self.file.read(4))[0]
self.biSizeImage = unpack("<i", self.file.read(4))[0]
self.biXPixelsPerMeter = unpack("<i", self.file.read(4))[0]
self.biYPixelsPerMeter = unpack("<i", self.file.read(4))[0]
self.biClrUsed = unpack("<i", self.file.read(4))[0]
self.biClrImportant = unpack("<i", self.file.read(4))[0]
self.head = []
self.color_map = []
self.bmp_data = []
self.bf_map = []
self.force_revers = force_revers
self.force_swap = force_swap
# some software change parameter size more than 40 bit
if self.biSize > 40:
self.read_other(self.biSize-40)
if self.biBitCount == 16 and self.biCompression == 3:
for i in range(4):
self.bf_map.append(
[unpack("<i", self.file.read(4))[0]]
)
if self.biBitCount == 24:
self.get_24bit_data()
elif self.biBitCount == 16:
if self.biCompression == 3:
self.bmp16bit_to_24bit_bf()
else:
self.bmp16bit_to_24bit()
elif self.biBitCount == 8:
# Not convert 8bit bmp logo to 24 bit
self.file.close()
return
else:
self.bmp32bit_to_24bit()
self.rb_swap = 0
if self.bfReserved1 != 8399 and self.biHeight > 0:
self.reverse_bmp_data()
print("reverse data at first time")
if self.force_revers:
self.reverse_bmp_data()
print("reverse data by force")
if self.force_swap:
self.rb_swap = 1
print("swap rb by force'")
if self.bfReserved1 == 8399:
self.file.close()
return
self.write_24bit(self.rb_swap)
self.file.close()
def read_other(self, n):
for i in range(n):
self.file.read(1)
def reverse_bmp_data(self):
self.bmp_data.reverse()
@staticmethod
def get_16bit_bgr_bf(pixel):
red = (pixel[1] & 0xf8) << 0
green = ((pixel[1] & 0x07) << 5) | ((pixel[0] & 0xe0) >> 3)
blue = ((pixel[0] & 0x1f) << 3)
new_pixel = [blue, green, red]
return new_pixel
def bmp32bit_to_24bit(self):
for height in range(abs(self.biHeight)):
bmp_data_row = []
# bmp file 4 align
count = 0
for width in range(self.biWidth):
bmp_data_row.append(
[unpack("<B", self.file.read(1))[0], unpack("<B", self.file.read(1))[0], unpack("<B", self.file.read(1))[0]])
self.file.read(1)
count = count + 4
while count % 4 != 0:
self.file.read(1)
count = count + 1
self.bmp_data.append(bmp_data_row)
def bmp16bit_to_24bit_bf(self):
self.get_16bit_data()
temp_data = self.bmp_data
self.bmp_data = []
for height in range(abs(self.biHeight)):
bmp_data_row = []
for width in range(self.biWidth):
bmp_data_row.append(
self.get_16bit_bgr_bf(temp_data[height][width])
)
self.bmp_data.append(bmp_data_row)
def bmp8bit_to_24bit_rle(self):
bmp_data_row = []
data_x = []
t_count = 0
loop = 1
while loop:
data1 = unpack("<B", self.file.read(1))[0]
if data1 > 0:
data2 = unpack("<B", self.file.read(1))[0]
for n in range(data1):
bmp_data_row.append(self.color_map[data2])
if data1 == 0:
data2 = unpack("<B", self.file.read(1))[0]
if data2 > 2:
data_count = data2
data_temp = unpack("<B", self.file.read(1))[0]
data_x.append(data_temp)
while data_temp != 0:
data_temp = unpack("<B", self.file.read(1))[0]
data_x.append(data_temp)
for m in range(data_count):
bmp_data_row.append(self.color_map[data_x[m]])
if data2 == 2:
print("data2 == 2")
if data2 == 0:
t_count += 1
self.bmp_data.append(bmp_data_row)
bmp_data_row = []
if data2 == 1:
print("encode over!")
loop = 0
def bmp8bit_to_24bit(self):
for height in range(abs(self.biHeight)):
bmp_data_row = []
count = 0
for width in range(self.biWidth):
bmp_data_row.append(
self.color_map[unpack("<B", self.file.read(1))[0]])
count = count + 1
while count % 4 != 0:
self.file.read(1)
count = count + 1
self.bmp_data.append(bmp_data_row)
@staticmethod
def get_16bit_bgr(pixel):
red = (pixel[1] & 0x7c) << 1
green = ((pixel[1] & 0x03) << 6) | ((pixel[0] & 0xe0) >> 2)
blue = ((pixel[0] & 0x1f) << 3)
new_pixel = [blue, green, red]
return new_pixel
def bmp16bit_to_24bit(self):
self.get_16bit_data()
temp_data = self.bmp_data
self.bmp_data = []
for height in range(abs(self.biHeight)):
bmp_data_row = []
for width in range(self.biWidth):
bmp_data_row.append(
self.get_16bit_bgr(temp_data[height][width])
)
self.bmp_data.append(bmp_data_row)
def get_head(self):
self.file.seek(0, 0)
for i in range(54):
self.head.append(unpack("<B", self.file.read(1))[0])
return self.head
def get_16bit_data(self):
for height in range(abs(self.biHeight)):
bmp_data_row = []
count = 0
for width in range(self.biWidth):
bmp_data_row.append(
[unpack("<B", self.file.read(1))[0], unpack("<B", self.file.read(1))[0]])
count = count + 2
while count % 4 != 0:
self.file.read(1)
count = count + 1
self.bmp_data.append(bmp_data_row)
def get_24bit_data(self):
for height in range(abs(self.biHeight)):
bmp_data_row = []
count = 0
for width in range(self.biWidth):
bmp_data_row.append(
[unpack("<B", self.file.read(1))[0], unpack("<B", self.file.read(1))[0], unpack("<B", self.file.read(1))[0]])
count = count + 3
while count % 4 != 0:
self.file.read(1)
count = count + 1
self.bmp_data.append(bmp_data_row)
def write_24bit(self,rb_swap):
self.file.seek(0, 0)
self.write_head_24bit()
self.write_data_24bit(rb_swap)
def write_head(self):
self.file.write(pack("<h", self.bfType))
self.file.write(pack("<i", self.bfSize))
self.file.write(pack("<h", self.bfReserved1))
self.file.write(pack("<h", self.bfReserved2))
self.file.write(pack("<i", self.bfOffBits)) # bfOffBits
self.file.write(pack("<i", self.biSize)) # biSize
self.file.write(pack("<i", self.biWidth))
self.file.write(pack("<i", self.biHeight))
self.file.write(pack("<h", self.biPlanes))
self.file.write(pack("<h", self.biBitCount)) # biBitCount
self.file.write(pack("<i", self.biCompression)) # biCompression
self.file.write(pack("<i", self.biSizeImage)) # biSizeImage
self.file.write(pack("<i", self.biXPixelsPerMeter)) # biXPixelsPerMeter
self.file.write(pack("<i", self.biYPixelsPerMeter)) # biYPixelsPerMeter
self.file.write(pack("<i", self.biClrUsed)) # biClrUsed
self.file.write(pack("<i", self.biClrImportant)) # biClrImportant try to mark whether is reversed
def write_head_24bit(self):
temp_bi_width = self.biWidth * 3
while temp_bi_width % 4 != 0:
temp_bi_width = temp_bi_width + 1
new_bf_size = temp_bi_width * abs(self.biHeight) + 54
self.file.write(pack("<h", self.bfType))
self.file.write(pack("<i", new_bf_size))
self.file.write(pack("<h", 8399)) # a mark for uboot dealing
self.file.write(pack("<h", self.bfReserved2))
self.file.write(pack("<i", 54)) # bfOffBits
self.file.write(pack("<i", 40)) # biSize
self.file.write(pack("<i", self.biWidth))
# force height to negative let logo show normal in windows
# the uboot code can deal with negative height
if self.biHeight < 0:
self.file.write(pack("<i", self.biHeight))
else:
self.file.write(pack("<i", self.biHeight * -1))
self.file.write(pack("<h", self.biPlanes))
self.file.write(pack("<h", 24)) # biBitCount
self.file.write(pack("<i", 0)) # biCompression
self.file.write(pack("<i", 0)) # biSizeImage
self.file.write(pack("<i", 0)) # biXPixelsPerMeter
self.file.write(pack("<i", 0)) # biYPixelsPerMeter
self.file.write(pack("<i", 0)) # biClrUsed
self.file.write(pack("<i", 0)) # biClrImportant try to mark whether is reversed
def write_data_24bit(self, rb_swap):
for hg in range(abs(self.biHeight)):
count = 0
for wd in range(self.biWidth):
if rb_swap:
self.file.write(pack("<B", self.bmp_data[hg][wd][2]))
self.file.write(pack("<B", self.bmp_data[hg][wd][1]))
self.file.write(pack("<B", self.bmp_data[hg][wd][0]))
else:
self.file.write(pack("<B", self.bmp_data[hg][wd][0]))
self.file.write(pack("<B", self.bmp_data[hg][wd][1]))
self.file.write(pack("<B", self.bmp_data[hg][wd][2]))
count = count + 3
while count % 4 != 0:
self.file.write(pack("<B", 0))
count = count + 1
if __name__ == "__main__":
swap = 0
revers = 0
par = len(sys.argv[1:])
if par == 1:
bmp = BMPFile(sys.argv[1])
elif par == 0:
print("This program is trying to convert different format of bmpfile to a same format"
"to make vop can handle bmpfile easily")
print("try such cmd to make it work python bmpconvert xxx/xxx.bmp")
else:
try:
opts, args = getopt.getopt(sys.argv[2:], "hrs", ["help", "reverse", "swap"])
for opt, arg in opts:
if opt in ('-h','--help'):
print("add -r option will force program to reverse data")
print("add -s option will force program to swap data of rb")
if opt in ("-r", "--reverse"):
revers = 1
if opt in ("-s", "--swap"):
swap = 1
bmp = BMPFile(sys.argv[1], revers, swap)
except getopt.GetoptError:
sys.exit(1)

View File

@ -1,316 +0,0 @@
#!/usr/bin/env python
# Copyright 2015, 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
from argparse import ArgumentParser, FileType, Action
from hashlib import sha1
from os import fstat
import re
from struct import pack
BOOT_IMAGE_HEADER_V3_PAGESIZE = 4096
def filesize(f):
if f is None:
return 0
try:
return fstat(f.fileno()).st_size
except OSError:
return 0
def update_sha(sha, f):
if f:
sha.update(f.read())
f.seek(0)
sha.update(pack('I', filesize(f)))
else:
sha.update(pack('I', 0))
def pad_file(f, padding):
pad = (padding - (f.tell() & (padding - 1))) & (padding - 1)
f.write(pack(str(pad) + 'x'))
def get_number_of_pages(image_size, page_size):
"""calculates the number of pages required for the image"""
return (image_size + page_size - 1) / page_size
def get_recovery_dtbo_offset(args):
"""calculates the offset of recovery_dtbo image in the boot image"""
num_header_pages = 1 # header occupies a page
num_kernel_pages = get_number_of_pages(filesize(args.kernel), args.pagesize)
num_ramdisk_pages = get_number_of_pages(filesize(args.ramdisk), args.pagesize)
num_second_pages = get_number_of_pages(filesize(args.second), args.pagesize)
dtbo_offset = args.pagesize * (num_header_pages + num_kernel_pages +
num_ramdisk_pages + num_second_pages)
return dtbo_offset
def write_header_v3(args):
BOOT_IMAGE_HEADER_V3_SIZE = 1580
BOOT_MAGIC = 'ANDROID!'.encode()
args.output.write(pack('8s', BOOT_MAGIC))
args.output.write(pack(
'4I',
filesize(args.kernel), # kernel size in bytes
filesize(args.ramdisk), # ramdisk size in bytes
(args.os_version << 11) | args.os_patch_level, # os version and patch level
BOOT_IMAGE_HEADER_V3_SIZE))
args.output.write(pack('4I', 0, 0, 0, 0)) # reserved
args.output.write(pack('I', args.header_version)) # version of bootimage header
args.output.write(pack('1536s', args.cmdline.encode()))
pad_file(args.output, BOOT_IMAGE_HEADER_V3_PAGESIZE)
def write_vendor_boot_header(args):
VENDOR_BOOT_IMAGE_HEADER_V3_SIZE = 2112
BOOT_MAGIC = 'VNDRBOOT'.encode()
args.vendor_boot.write(pack('8s', BOOT_MAGIC))
args.vendor_boot.write(pack(
'5I',
args.header_version, # version of header
args.pagesize, # flash page size we assume
args.base + args.kernel_offset, # kernel physical load addr
args.base + args.ramdisk_offset, # ramdisk physical load addr
filesize(args.vendor_ramdisk))) # vendor ramdisk size in bytes
args.vendor_boot.write(pack('2048s', args.vendor_cmdline.encode()))
args.vendor_boot.write(pack('I', args.base + args.tags_offset)) # physical addr for kernel tags
args.vendor_boot.write(pack('16s', args.board.encode())) # asciiz product name
args.vendor_boot.write(pack('I', VENDOR_BOOT_IMAGE_HEADER_V3_SIZE)) # header size in bytes
if filesize(args.dtb) == 0:
raise ValueError("DTB image must not be empty.")
args.vendor_boot.write(pack('I', filesize(args.dtb))) # size in bytes
args.vendor_boot.write(pack('Q', args.base + args.dtb_offset)) # dtb physical load address
pad_file(args.vendor_boot, args.pagesize)
def write_header(args):
BOOT_IMAGE_HEADER_V1_SIZE = 1648
BOOT_IMAGE_HEADER_V2_SIZE = 1660
BOOT_MAGIC = 'ANDROID!'.encode()
if args.header_version > 3:
raise ValueError('Boot header version %d not supported' % args.header_version)
elif args.header_version == 3:
return write_header_v3(args)
args.output.write(pack('8s', BOOT_MAGIC))
final_ramdisk_offset = (args.base + args.ramdisk_offset) if filesize(args.ramdisk) > 0 else 0
final_second_offset = (args.base + args.second_offset) if filesize(args.second) > 0 else 0
args.output.write(pack(
'10I',
filesize(args.kernel), # size in bytes
args.base + args.kernel_offset, # physical load addr
filesize(args.ramdisk), # size in bytes
final_ramdisk_offset, # physical load addr
filesize(args.second), # size in bytes
final_second_offset, # physical load addr
args.base + args.tags_offset, # physical addr for kernel tags
args.pagesize, # flash page size we assume
args.header_version, # version of bootimage header
(args.os_version << 11) | args.os_patch_level)) # os version and patch level
args.output.write(pack('16s', args.board.encode())) # asciiz product name
args.output.write(pack('512s', args.cmdline[:512].encode()))
sha = sha1()
update_sha(sha, args.kernel)
update_sha(sha, args.ramdisk)
update_sha(sha, args.second)
if args.header_version > 0:
update_sha(sha, args.recovery_dtbo)
if args.header_version > 1:
update_sha(sha, args.dtb)
img_id = pack('32s', sha.digest())
args.output.write(img_id)
args.output.write(pack('1024s', args.cmdline[512:].encode()))
if args.header_version > 0:
args.output.write(pack('I', filesize(args.recovery_dtbo))) # size in bytes
if args.recovery_dtbo:
args.output.write(pack('Q', get_recovery_dtbo_offset(args))) # recovery dtbo offset
else:
args.output.write(pack('Q', 0)) # Will be set to 0 for devices without a recovery dtbo
# Populate boot image header size for header versions 1 and 2.
if args.header_version == 1:
args.output.write(pack('I', BOOT_IMAGE_HEADER_V1_SIZE))
elif args.header_version == 2:
args.output.write(pack('I', BOOT_IMAGE_HEADER_V2_SIZE))
if args.header_version > 1:
# if filesize(args.dtb) == 0:
# raise ValueError("DTB image must not be empty.")
args.output.write(pack('I', filesize(args.dtb))) # size in bytes
args.output.write(pack('Q', args.base + args.dtb_offset)) # dtb physical load address
pad_file(args.output, args.pagesize)
return img_id
class ValidateStrLenAction(Action):
def __init__(self, option_strings, dest, nargs=None, **kwargs):
if 'maxlen' not in kwargs:
raise ValueError('maxlen must be set')
self.maxlen = int(kwargs['maxlen'])
del kwargs['maxlen']
super(ValidateStrLenAction, self).__init__(option_strings, dest, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
if len(values) > self.maxlen:
raise ValueError(
'String argument too long: max {0:d}, got {1:d}'.format(self.maxlen, len(values)))
setattr(namespace, self.dest, values)
def write_padded_file(f_out, f_in, padding):
if f_in is None:
return
f_out.write(f_in.read())
pad_file(f_out, padding)
def parse_int(x):
return int(x, 0)
def parse_os_version(x):
match = re.search(r'^(\d{1,3})(?:\.(\d{1,3})(?:\.(\d{1,3}))?)?', x)
if match:
a = int(match.group(1))
b = c = 0
if match.lastindex >= 2:
b = int(match.group(2))
if match.lastindex == 3:
c = int(match.group(3))
# 7 bits allocated for each field
assert a < 128
assert b < 128
assert c < 128
return (a << 14) | (b << 7) | c
return 0
def parse_os_patch_level(x):
match = re.search(r'^(\d{4})-(\d{2})(?:-(\d{2}))?', x)
if match:
y = int(match.group(1)) - 2000
m = int(match.group(2))
# 7 bits allocated for the year, 4 bits for the month
assert 0 <= y < 128
assert 0 < m <= 12
return (y << 4) | m
return 0
def parse_cmdline():
parser = ArgumentParser()
parser.add_argument('--kernel', help='path to the kernel', type=FileType('rb'))
parser.add_argument('--ramdisk', help='path to the ramdisk', type=FileType('rb'))
parser.add_argument('--second', help='path to the 2nd bootloader', type=FileType('rb'))
parser.add_argument('--dtb', help='path to dtb', type=FileType('rb'))
recovery_dtbo_group = parser.add_mutually_exclusive_group()
recovery_dtbo_group.add_argument('--recovery_dtbo', help='path to the recovery DTBO',
type=FileType('rb'))
recovery_dtbo_group.add_argument('--recovery_acpio', help='path to the recovery ACPIO',
type=FileType('rb'), metavar='RECOVERY_ACPIO',
dest='recovery_dtbo')
parser.add_argument('--cmdline', help='extra arguments to be passed on the '
'kernel command line', default='', action=ValidateStrLenAction, maxlen=1536)
parser.add_argument('--vendor_cmdline',
help='kernel command line arguments contained in vendor boot',
default='', action=ValidateStrLenAction, maxlen=2048)
parser.add_argument('--base', help='base address', type=parse_int, default=0x10000000)
parser.add_argument('--kernel_offset', help='kernel offset', type=parse_int, default=0x00008000)
parser.add_argument('--ramdisk_offset', help='ramdisk offset', type=parse_int,
default=0x01000000)
parser.add_argument('--second_offset', help='2nd bootloader offset', type=parse_int,
default=0x00f00000)
parser.add_argument('--dtb_offset', help='dtb offset', type=parse_int, default=0x01f00000)
parser.add_argument('--os_version', help='operating system version', type=parse_os_version,
default=0)
parser.add_argument('--os_patch_level', help='operating system patch level',
type=parse_os_patch_level, default=0)
parser.add_argument('--tags_offset', help='tags offset', type=parse_int, default=0x00000100)
parser.add_argument('--board', help='board name', default='', action=ValidateStrLenAction,
maxlen=16)
parser.add_argument('--pagesize', help='page size', type=parse_int,
choices=[2**i for i in range(11, 15)], default=2048)
parser.add_argument('--id', help='print the image ID on standard output',
action='store_true')
parser.add_argument('--header_version', help='boot image header version', type=parse_int,
default=0)
parser.add_argument('-o', '--output', help='output file name', type=FileType('wb'))
parser.add_argument('--vendor_boot', help='vendor boot output file name', type=FileType('wb'))
parser.add_argument('--vendor_ramdisk', help='path to the vendor ramdisk', type=FileType('rb'))
return parser.parse_args()
def write_data(args, pagesize):
write_padded_file(args.output, args.kernel, pagesize)
write_padded_file(args.output, args.ramdisk, pagesize)
write_padded_file(args.output, args.second, pagesize)
if args.header_version > 0 and args.header_version < 3:
write_padded_file(args.output, args.recovery_dtbo, pagesize)
if args.header_version == 2:
write_padded_file(args.output, args.dtb, pagesize)
def write_vendor_boot_data(args):
write_padded_file(args.vendor_boot, args.vendor_ramdisk, args.pagesize)
write_padded_file(args.vendor_boot, args.dtb, args.pagesize)
def main():
args = parse_cmdline()
if args.vendor_boot is not None:
if args.header_version < 3:
raise ValueError('--vendor_boot not compatible with given header version')
if args.vendor_ramdisk is None:
raise ValueError('--vendor_ramdisk missing or invalid')
write_vendor_boot_header(args)
write_vendor_boot_data(args)
if args.output is not None:
if args.kernel is None:
raise ValueError('kernel must be supplied when creating a boot image')
if args.second is not None and args.header_version > 2:
raise ValueError('--second not compatible with given header version')
img_id = write_header(args)
if args.header_version > 2:
write_data(args, BOOT_IMAGE_HEADER_V3_PAGESIZE)
else:
write_data(args, args.pagesize)
if args.id and img_id is not None:
# Python 2's struct.pack returns a string, but py3 returns bytes.
if isinstance(img_id, str):
img_id = [ord(x) for x in img_id]
print('0x' + ''.join('{:02x}'.format(c) for c in img_id))
if __name__ == '__main__':
main()

View File

@ -1,263 +0,0 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd.
set -e
usage() {
cat >&2 << USAGE
usage: $0 [-h] --dtb DTB
optional arguments:
-h, --help show this help message and exit
--dtb DTB the dtb file name
USAGE
}
# Parse command-line arguments
while [ $# -gt 0 ]; do
case $1 in
--dtb)
DTB=$2
shift 2
;;
--keep-dtb-name)
DTB_ARGS="--dtbname"; shift 1;;
-h)
usage
exit 0
;;
--help)
usage
exit 0
;;
*)
shift
;;
esac
done
srctree=${srctree-"."}
objtree=${objtree-"."}
if [ "${ARCH}" == "" ]; then
if [ "$($srctree/scripts/config --state CONFIG_ARM)" == "y" ]; then
ARCH=arm
else
ARCH=arm64
fi
fi
LOGO_PATH=${srctree}/logo.bmp
[ -f ${LOGO_PATH} ] && LOGO=logo.bmp
LOGO_KERNEL_PATH=${srctree}/logo_kernel.bmp
[ -f ${LOGO_KERNEL_PATH} ] && LOGO_KERNEL=logo_kernel.bmp
KERNEL_IMAGE_PATH=${objtree}/arch/${ARCH}/boot/Image
KERNEL_IMAGE_ARG="--kernel ${KERNEL_IMAGE_PATH}"
if [ "${ARCH}" == "arm" ]; then
DTB_PATH=${objtree}/arch/arm/boot/dts/${DTB}
ZIMAGE=zImage
else
DTB_PATH=${objtree}/arch/arm64/boot/dts/rockchip/${DTB}
ZIMAGE=Image.lz4
fi
KERNEL_ZIMAGE_PATH=${objtree}/arch/${ARCH}/boot/${ZIMAGE}
KERNEL_ZIMAGE_ARG="--kernel ${KERNEL_ZIMAGE_PATH}"
if ! find ${DTB_PATH} >/dev/null; then
echo "No dtb" >&2
usage
exit 1
fi
OUT=out
ITB=${BOOT_IMG}
ITS=${OUT}/boot.its
MKIMAGE=${MKIMAGE-"mkimage"}
MKIMAGE_ARG="-E -p 0x800"
make_boot_img()
{
RAMDISK_IMG_PATH=${objtree}/ramdisk.img
[ -f ${RAMDISK_IMG_PATH} ] && RAMDISK_IMG=ramdisk.img && RAMDISK_ARG="--ramdisk ${RAMDISK_IMG_PATH}"
${srctree}/scripts/mkbootimg \
${KERNEL_IMAGE_ARG} \
${RAMDISK_ARG} \
--second resource.img \
-o boot.img && \
echo " Image: boot.img (with Image ${RAMDISK_IMG} resource.img) is ready";
[ -f ${KERNEL_ZIMAGE_PATH} ] || return 0
${srctree}/scripts/mkbootimg \
${KERNEL_ZIMAGE_ARG} \
${RAMDISK_ARG} \
--second resource.img \
-o zboot.img && \
echo " Image: zboot.img (with ${ZIMAGE} ${RAMDISK_IMG} resource.img) is ready"
}
repack_boot_img()
{
${srctree}/scripts/repack-bootimg \
--boot_img ${BOOT_IMG} --out ${OUT} \
${KERNEL_IMAGE_ARG} \
--second resource.img \
--dtb ${DTB_PATH} \
-o boot.img &&
echo " Image: boot.img (${BOOT_IMG} + Image) is ready";
${srctree}/scripts/repack-bootimg \
--boot_img ${BOOT_IMG} --out ${OUT} \
${KERNEL_ZIMAGE_ARG} \
--second resource.img \
--dtb ${DTB_PATH} \
-o zboot.img && \
echo " Image: zboot.img (${BOOT_IMG} + ${ZIMAGE}) is ready"
}
check_mkimage()
{
MKIMAGE=$(type -p ${MKIMAGE} || true)
if [ -z "${MKIMAGE}" ]; then
# Doesn't exist
echo '"mkimage" command not found - U-Boot images will not be built' >&2
exit 1;
fi
}
unpack_itb()
{
rm -rf ${OUT}
mkdir -p ${OUT}
for NAME in $(fdtget -l ${ITB} /images)
do
# generate image
NODE="/images/${NAME}"
OFFS=$(fdtget -ti ${ITB} ${NODE} data-position)
SIZE=$(fdtget -ti ${ITB} ${NODE} data-size)
if [ -z ${OFFS} ]; then
continue;
fi
if [ ${SIZE} -ne 0 ]; then
dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1
else
touch ${OUT}/${NAME}
fi
done
[ ! -f ${OUT}/kernel ] && echo "FIT ${ITB} no kernel" >&2 && exit 1 || true
}
gen_its()
{
TMP_ITB=${OUT}/boot.tmp
# add placeholder
cp ${ITB} ${TMP_ITB}
for NAME in $(fdtget -l ${ITB} /images); do
fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})"
done
dtc -I dtb -O dts ${TMP_ITB} -o ${ITS} >/dev/null 2>&1
rm -f ${TMP_ITB}
# fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("...");
sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS}
# remove
sed -i "/memreserve/d" ${ITS}
sed -i "/timestamp/d" ${ITS}
sed -i "/data-size/d" ${ITS}
sed -i "/data-position/d" ${ITS}
sed -i "/value/d" ${ITS}
sed -i "/hashed-strings/d" ${ITS}
sed -i "/hashed-nodes/d" ${ITS}
sed -i "/signer-version/d" ${ITS}
sed -i "/signer-name/d" ${ITS}
}
gen_itb()
{
[ -f ${OUT}/fdt ] && cp -a ${DTB_PATH} ${OUT}/fdt && FDT=" + ${DTB}"
[ -f ${OUT}/resource ] && cp -a resource.img ${OUT}/resource && RESOURCE=" + resource.img"
COMP=$(fdtget ${ITB} /images/kernel compression)
case "${COMP}" in
gzip) EXT=".gz";;
lz4) EXT=".lz4";;
bzip2) EXT=".bz2";;
lzma) EXT=".lzma";;
lzo) EXT=".lzo";;
esac
cp -a ${KERNEL_IMAGE_PATH}${EXT} ${OUT}/kernel && \
${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} boot.img >/dev/null && \
echo " Image: boot.img (FIT ${BOOT_IMG} + Image${EXT}${FDT}${RESOURCE}) is ready";
if [ "${EXT}" == "" ] && [ -f ${KERNEL_ZIMAGE_PATH} ]; then
cp -a ${KERNEL_ZIMAGE_PATH} ${OUT}/kernel && \
${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} zboot.img >/dev/null && \
echo " Image: zboot.img (FIT ${BOOT_IMG} + zImage${FDT}${RESOURCE}) is ready";
fi
}
repack_itb()
{
check_mkimage
unpack_itb
gen_its
gen_itb
}
# Create U-Boot FIT Image use ${BOOT_ITS}
make_fit_boot_img()
{
ITS=${OUT}/boot.its
check_mkimage
mkdir -p ${OUT}
rm -f ${OUT}/fdt ${OUT}/kernel ${OUT}/resource ${ITS}
cp -a ${BOOT_ITS} ${ITS}
cp -a ${DTB_PATH} ${OUT}/fdt
cp -a ${KERNEL_ZIMAGE_PATH} ${OUT}/kernel
cp -a resource.img ${OUT}/resource
if [ "${ARCH}" == "arm64" ]; then
sed -i -e 's/arch = ""/arch = "arm64"/g' -e 's/compression = ""/compression = "lz4"/' ${ITS}
else
sed -i -e 's/arch = ""/arch = "arm"/g' -e 's/compression = ""/compression = "none"/' ${ITS}
fi
FIT_DESC=$(${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} boot.img | grep "FIT description" | sed 's/FIT description: //')
echo " Image: boot.img (${FIT_DESC}) is ready";
}
if [ -x ${srctree}/scripts/bmpconvert ]; then
if [ -f ${LOGO_PATH} ]; then
${srctree}/scripts/bmpconvert ${LOGO_PATH};
fi
if [ -f ${LOGO_KERNEL_PATH} ]; then
${srctree}/scripts/bmpconvert ${LOGO_KERNEL_PATH};
fi
fi
if [ "${srctree}" != "${objtree}" ]; then
if [ -f ${LOGO_PATH} ]; then
cp -a ${LOGO_PATH} ${objtree}/;
fi
if [ -f ${LOGO_KERNEL_PATH} ]; then
cp -a ${LOGO_KERNEL_PATH} ${objtree}/;
fi
fi
scripts/resource_tool ${DTB_ARGS} ${DTB_PATH} ${LOGO} ${LOGO_KERNEL} >/dev/null
echo " Image: resource.img (with ${DTB} ${LOGO} ${LOGO_KERNEL}) is ready"
if [ -f "${BOOT_IMG}" ]; then
if file -L -p -b ${BOOT_IMG} | grep -q 'Device Tree Blob' ; then
repack_itb;
elif [ -x ${srctree}/scripts/repack-bootimg ]; then
repack_boot_img;
fi
elif [ -f "${BOOT_ITS}" ]; then
make_fit_boot_img;
elif [ -x ${srctree}/scripts/mkbootimg ]; then
make_boot_img;
fi

View File

@ -1,159 +0,0 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* (C) Copyright Fuzhou Rockchip Electronics Co., Ltd
*/
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
//#define DEBUG
#ifdef DEBUG
#define PRINTF(fmt, ...) printf(fmt, ##__VA_ARGS__)
#else
static inline __attribute__ ((format(printf, 1, 2)))
int PRINTF(const char *fmt, ...)
{
return 0;
}
#endif
static uint32_t gTable_Crc32[256] = {
0x00000000, 0x04c10db7, 0x09821b6e, 0x0d4316d9,
0x130436dc, 0x17c53b6b, 0x1a862db2, 0x1e472005,
0x26086db8, 0x22c9600f, 0x2f8a76d6, 0x2b4b7b61,
0x350c5b64, 0x31cd56d3, 0x3c8e400a, 0x384f4dbd,
0x4c10db70, 0x48d1d6c7, 0x4592c01e, 0x4153cda9,
0x5f14edac, 0x5bd5e01b, 0x5696f6c2, 0x5257fb75,
0x6a18b6c8, 0x6ed9bb7f, 0x639aada6, 0x675ba011,
0x791c8014, 0x7ddd8da3, 0x709e9b7a, 0x745f96cd,
0x9821b6e0, 0x9ce0bb57, 0x91a3ad8e, 0x9562a039,
0x8b25803c, 0x8fe48d8b, 0x82a79b52, 0x866696e5,
0xbe29db58, 0xbae8d6ef, 0xb7abc036, 0xb36acd81,
0xad2ded84, 0xa9ece033, 0xa4aff6ea, 0xa06efb5d,
0xd4316d90, 0xd0f06027, 0xddb376fe, 0xd9727b49,
0xc7355b4c, 0xc3f456fb, 0xceb74022, 0xca764d95,
0xf2390028, 0xf6f80d9f, 0xfbbb1b46, 0xff7a16f1,
0xe13d36f4, 0xe5fc3b43, 0xe8bf2d9a, 0xec7e202d,
0x34826077, 0x30436dc0, 0x3d007b19, 0x39c176ae,
0x278656ab, 0x23475b1c, 0x2e044dc5, 0x2ac54072,
0x128a0dcf, 0x164b0078, 0x1b0816a1, 0x1fc91b16,
0x018e3b13, 0x054f36a4, 0x080c207d, 0x0ccd2dca,
0x7892bb07, 0x7c53b6b0, 0x7110a069, 0x75d1adde,
0x6b968ddb, 0x6f57806c, 0x621496b5, 0x66d59b02,
0x5e9ad6bf, 0x5a5bdb08, 0x5718cdd1, 0x53d9c066,
0x4d9ee063, 0x495fedd4, 0x441cfb0d, 0x40ddf6ba,
0xaca3d697, 0xa862db20, 0xa521cdf9, 0xa1e0c04e,
0xbfa7e04b, 0xbb66edfc, 0xb625fb25, 0xb2e4f692,
0x8aabbb2f, 0x8e6ab698, 0x8329a041, 0x87e8adf6,
0x99af8df3, 0x9d6e8044, 0x902d969d, 0x94ec9b2a,
0xe0b30de7, 0xe4720050, 0xe9311689, 0xedf01b3e,
0xf3b73b3b, 0xf776368c, 0xfa352055, 0xfef42de2,
0xc6bb605f, 0xc27a6de8, 0xcf397b31, 0xcbf87686,
0xd5bf5683, 0xd17e5b34, 0xdc3d4ded, 0xd8fc405a,
0x6904c0ee, 0x6dc5cd59, 0x6086db80, 0x6447d637,
0x7a00f632, 0x7ec1fb85, 0x7382ed5c, 0x7743e0eb,
0x4f0cad56, 0x4bcda0e1, 0x468eb638, 0x424fbb8f,
0x5c089b8a, 0x58c9963d, 0x558a80e4, 0x514b8d53,
0x25141b9e, 0x21d51629, 0x2c9600f0, 0x28570d47,
0x36102d42, 0x32d120f5, 0x3f92362c, 0x3b533b9b,
0x031c7626, 0x07dd7b91, 0x0a9e6d48, 0x0e5f60ff,
0x101840fa, 0x14d94d4d, 0x199a5b94, 0x1d5b5623,
0xf125760e, 0xf5e47bb9, 0xf8a76d60, 0xfc6660d7,
0xe22140d2, 0xe6e04d65, 0xeba35bbc, 0xef62560b,
0xd72d1bb6, 0xd3ec1601, 0xdeaf00d8, 0xda6e0d6f,
0xc4292d6a, 0xc0e820dd, 0xcdab3604, 0xc96a3bb3,
0xbd35ad7e, 0xb9f4a0c9, 0xb4b7b610, 0xb076bba7,
0xae319ba2, 0xaaf09615, 0xa7b380cc, 0xa3728d7b,
0x9b3dc0c6, 0x9ffccd71, 0x92bfdba8, 0x967ed61f,
0x8839f61a, 0x8cf8fbad, 0x81bbed74, 0x857ae0c3,
0x5d86a099, 0x5947ad2e, 0x5404bbf7, 0x50c5b640,
0x4e829645, 0x4a439bf2, 0x47008d2b, 0x43c1809c,
0x7b8ecd21, 0x7f4fc096, 0x720cd64f, 0x76cddbf8,
0x688afbfd, 0x6c4bf64a, 0x6108e093, 0x65c9ed24,
0x11967be9, 0x1557765e, 0x18146087, 0x1cd56d30,
0x02924d35, 0x06534082, 0x0b10565b, 0x0fd15bec,
0x379e1651, 0x335f1be6, 0x3e1c0d3f, 0x3add0088,
0x249a208d, 0x205b2d3a, 0x2d183be3, 0x29d93654,
0xc5a71679, 0xc1661bce, 0xcc250d17, 0xc8e400a0,
0xd6a320a5, 0xd2622d12, 0xdf213bcb, 0xdbe0367c,
0xe3af7bc1, 0xe76e7676, 0xea2d60af, 0xeeec6d18,
0xf0ab4d1d, 0xf46a40aa, 0xf9295673, 0xfde85bc4,
0x89b7cd09, 0x8d76c0be, 0x8035d667, 0x84f4dbd0,
0x9ab3fbd5, 0x9e72f662, 0x9331e0bb, 0x97f0ed0c,
0xafbfa0b1, 0xab7ead06, 0xa63dbbdf, 0xa2fcb668,
0xbcbb966d, 0xb87a9bda, 0xb5398d03, 0xb1f880b4,
};
static uint32_t CRC_32(uint8_t *aData, long aSize)
{
long i;
uint32_t nAccum = 0;
for (i = 0; i < aSize; i++)
nAccum =
(nAccum << 8) ^ gTable_Crc32[(nAccum >> 24) ^ *aData++];
return nAccum;
}
#define TAG_KERNEL 0x4C4E524B
int main(int argc, char *argv[])
{
FILE *fid_in, *fid_out;
size_t cnt;
uint8_t *ptr1;
long fileSize;
int exit_code = 0;
uint32_t crcData;
PRINTF("mkkrnlimg V20111117\n");
PRINTF("cmd:%s %s [%s]\n", argv[1], argv[2], argv[3]);
if (argc < 3) {
printf("Usage: %s srcFile desFile [flag]\n", argv[0]);
printf("sample:\n");
printf(" %s Image kernel.img\n", argv[0]);
exit(1);
}
fid_in = fopen(argv[1], "rb");
if (fid_in == 0) {
printf("input open NG !\n ");
exit(2);
}
fid_out = fopen(argv[2], "wb");
if (fid_out == 0) {
printf("output open NG !\n ");
fclose(fid_in);
exit(3);
}
fseek(fid_in, 0, SEEK_END);
fileSize = ftell(fid_in);
PRINTF("fileSize = %ld\n", fileSize);
fseek(fid_in, 0, SEEK_SET);
ptr1 = malloc(fileSize + 512 + 20);
if (ptr1 == 0) {
exit_code = 4;
printf("\n malloc error!");
goto app_exit;
}
*(uint32_t *)ptr1 = TAG_KERNEL;
*(uint32_t *)(ptr1 + 4) = fileSize;
fwrite(ptr1, 1, 8, fid_out);
cnt = fread(ptr1, 1, fileSize, fid_in);
PRINTF("fread = %lu\n", cnt);
crcData = CRC_32(ptr1, fileSize);
PRINTF("crc = 0x%x\n", crcData);
cnt = fwrite(ptr1, 1, fileSize, fid_out);
PRINTF("fwrite = %lu\n", cnt);
fwrite(&crcData, 1, 4, fid_out);
app_exit:
fclose(fid_in);
fclose(fid_out);
if (ptr1)
free(ptr1);
exit(exit_code);
}

View File

@ -1,153 +0,0 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd.
set -e
usage() {
cat >&2 << USAGE
usage: $0 [-h] [-z] --boot_img BOOT_IMG [--out OUT] [--kernel KERNEL] [--ramdisk RAMDISK] [--second SECOND] [--dtb DTB ] [--recovery_dtbo RECOVERY_DTBO] -o OUTPUT
optional arguments:
-h, --help show this help message and exit
-z pack compressed kernel image
--boot_img BOOT_IMG path to the original boot image
--out OUT path to out binaries (default: out)
--kernel KERNEL path to the new kernel
--ramdisk RAMDISK path to the new ramdisk
--second SECOND path to the new 2nd bootloader (default: resource.img)
--dtb DTB path to the new dtb
--recovery_dtbo RECOVERY_DTBO
path to the new recovery DTBO
-o OUTPUT, --output OUTPUT
output file name
USAGE
}
# Parse command-line arguments
while [ $# -gt 0 ]; do
case $1 in
--boot_img)
boot_img=$2
shift 2
;;
--out)
out=$2
shift 2
;;
--kernel)
kernel=$2
shift 2
;;
--ramdisk)
ramdisk=$2
shift 2
;;
--second)
second=$2
shift 2
;;
--dtb)
dtb=$2
shift 2
;;
--recovery_dtbo)
recovery_dtbo=$2
shift 2
;;
-h)
usage
exit 0
;;
--help)
usage
exit 0
;;
-z)
compressed_kernel=y
shift
;;
-o)
output=$2
shift 2
;;
--output)
output=$2
shift 2
;;
*)
shift
;;
esac
done
if [ "$boot_img" == "" -o ! -e "$boot_img" ]; then
echo "No boot img"
usage
exit 1
fi
if [ "$output" == "" ]; then
echo "No output file name"
usage
exit 1
fi
srctree=${srctree-"."}
objtree=${objtree-"."}
out=${out-"out"}
if [ "$($srctree/scripts/config --state CONFIG_ARM64)" == "y" ]; then
if [ "$compressed_kernel" == "y" ]; then
default_kernel=arch/arm64/boot/Image.lz4
else
default_kernel=arch/arm64/boot/Image
fi
else
if [ "$compressed_kernel" == "y" ]; then
default_kernel=arch/arm/boot/zImage
else
default_kernel=arch/arm/boot/Image
fi
fi
kernel=${kernel-$objtree/$default_kernel}
second=${second-$objtree/resource.img}
ramdisk=${ramdisk-$out/ramdisk}
dtb=${dtb-$out/dtb}
recovery_dtbo=${recovery_dtbo-$out/recovery_dtbo}
log="$out/unpack.log"
mkdir -p $out
$srctree/scripts/unpack_bootimg --boot_img $boot_img --out $out > $log
cmdline=$(grep -a "^command line args: " $log | tr '\0' '\n'| sed "s/^command line args: //")
extra_cmdline=$(grep -a "^additional command line args: " $log | tr '\0' '\n'| sed "s/^additional command line args: //")
version=$(grep -a "^boot image header version: " $log | sed "s/^boot image header version: //")
os_version=$(grep -a "^os version: " $log | sed "s/^os version: //")
os_patch_level=$(grep -a "^os patch level: " $log | sed "s/^os patch level: //")
dtb_size=$(grep -a "^dtb size: " $log | sed "s/^dtb size: //")
dtb_size=${dtb_size:-0}
if [ $dtb_size -gt 0 -a -e "$dtb" ]; then
DTB="--dtb $dtb"
fi
recovery_dtbo_size=$(grep -a "^recovery dtbo size: " $log | sed "s/^recovery dtbo size: //")
recovery_dtbo_size=${recovery_dtbo_size:-0}
if [ $recovery_dtbo_size -gt 0 -a -e "$recovery_dtbo" ]; then
RECOVERY_DTBO="--recovery_dtbo $recovery_dtbo"
fi
if [ $version -lt 3 ]; then
SECOND="--second $second"
fi
$srctree/scripts/mkbootimg \
--kernel $kernel \
$SECOND \
--ramdisk $ramdisk \
$DTB \
$RECOVERY_DTBO \
--cmdline "${cmdline}${extra_cmdline}" \
--header_version $version \
--os_version $os_version \
--os_patch_level $os_patch_level \
--output $output

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +0,0 @@
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -158,8 +158,12 @@ endif
all: $(notdir $(KBUILD_IMAGE))
+DTBS := rk35*-nanopi*.dtb
Image vmlinuz.efi: vmlinux
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
+ $(Q)scripts/mkkrnlimg $(objtree)/arch/arm64/boot/Image $(objtree)/kernel.img >/dev/null
+ @echo ' Image: kernel.img is ready'
+ $(Q)$(srctree)/scripts/mkimg --dtb $(DTBS)
Image.%: Image
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -10,6 +10,7 @@ hostprogs-always-$(CONFIG_BUILDTIME_TABL
hostprogs-always-$(CONFIG_ASN1) += asn1_compiler
hostprogs-always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file
hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert
+hostprogs-always-$(CONFIG_ARM64) += resource_tool mkkrnlimg
hostprogs-always-$(CONFIG_RUST) += generate_rust_target
generate_rust_target-rust := y