96 lines
3.1 KiB
Python
Executable File
96 lines
3.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
############################################################################
|
|
# boards/arm/csk6/tools/patch_header.py
|
|
#
|
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
# contributor license agreements. See the NOTICE file distributed with
|
|
# this work for additional information regarding copyright ownership. The
|
|
# ASF licenses this file to you 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.
|
|
#
|
|
############################################################################
|
|
|
|
import argparse
|
|
|
|
_IMAGE_START = 192
|
|
_IMAGE_SIZE_OFFSET = _IMAGE_START + 4
|
|
_IMAGE_HDR_CHK_OFFSET = _IMAGE_START + 60
|
|
_IMAGE_HEADER_SIZE = _IMAGE_HDR_CHK_OFFSET + 4
|
|
|
|
DEFAULT_INPUT_FILE = "nuttx.bin"
|
|
DEFAULT_OUTPUT_FILE = "nuttx.bin"
|
|
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(description="Patch binary file header.")
|
|
parser.add_argument(
|
|
"--input",
|
|
help=f"The binary file to be patched (default: {DEFAULT_INPUT_FILE})",
|
|
default=DEFAULT_INPUT_FILE,
|
|
)
|
|
parser.add_argument(
|
|
"--output",
|
|
help=f"The output patched binary file (default: {DEFAULT_OUTPUT_FILE})",
|
|
default=DEFAULT_OUTPUT_FILE,
|
|
)
|
|
return parser.parse_args()
|
|
|
|
|
|
def _get_header_sum(header_bytes: bytearray):
|
|
header_sum = 0
|
|
for pos in range(_IMAGE_START, _IMAGE_HDR_CHK_OFFSET):
|
|
header_sum += header_bytes[pos]
|
|
|
|
vector_sum = 0
|
|
for pos in range(_IMAGE_HDR_CHK_OFFSET):
|
|
vector_sum += header_bytes[pos]
|
|
vector_sum += header_sum & 0xFF
|
|
vector_sum += (header_sum >> 8) & 0xFF
|
|
|
|
return header_sum, vector_sum
|
|
|
|
|
|
def patch_header(header_bytes: bytearray, image_size: int):
|
|
header_bytes[_IMAGE_SIZE_OFFSET : _IMAGE_SIZE_OFFSET + 4] = image_size.to_bytes(
|
|
4, "little"
|
|
)
|
|
|
|
header_sum, vector_sum = _get_header_sum(header_bytes)
|
|
header_bytes[_IMAGE_HDR_CHK_OFFSET : _IMAGE_HDR_CHK_OFFSET + 2] = (
|
|
header_sum.to_bytes(2, "little")
|
|
)
|
|
header_bytes[_IMAGE_HDR_CHK_OFFSET + 2 : _IMAGE_HDR_CHK_OFFSET + 4] = (
|
|
vector_sum.to_bytes(2, "little")
|
|
)
|
|
|
|
|
|
def patch_bin(input_filename: str, output_filename: str):
|
|
with open(input_filename, "rb") as bin_file:
|
|
content = bytearray(bin_file.read())
|
|
header = content[:_IMAGE_HEADER_SIZE]
|
|
image_size = len(content)
|
|
patch_header(header, image_size)
|
|
content[:_IMAGE_HEADER_SIZE] = header
|
|
|
|
with open(output_filename, "wb") as out_file:
|
|
out_file.write(content)
|
|
print(f"csk6 rom boot tag added successfully, file: {output_filename}")
|
|
|
|
|
|
def main():
|
|
args = parse_args()
|
|
patch_bin(args.input, args.output)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|