summaryrefslogtreecommitdiff
path: root/core/arch/arm/plat-amlogic/scripts/aml_bin2img.py
blob: 28a037d46c1c45cf38640fc74df642c6b02f28fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/env python3
# SPDX-License-Identifier: BSD-2-Clause
#
# Copyright (c) 2020 Carlo Caione <ccaione@baylibre.com>
#
# Derived from plat-stm32mp1/scripts/stm32image.py
#

import argparse
import struct
import mmap

header_size = 0x200
ext_magic_number = 0x12348765
version = 0x00002710


def get_size(file):
    file.seek(0, 2)        # End of the file
    size = file.tell()
    return size


def aml_set_header(dest_fd, entry, res_mem_start, res_mem_size, sec_mem_start,
                   sec_mem_size):
    dest_fd.seek(0, 0)

    dest_fd.write(struct.pack('<IIQQQQQ',
                  ext_magic_number,
                  version,
                  entry,
                  res_mem_start,
                  res_mem_size,
                  sec_mem_start,
                  sec_mem_size))

    # Padding
    dest_fd.write(b'\x00' * 464)
    dest_fd.close()


def aml_create_header_file(source, dest, entry, res_mem_start, res_mem_size,
                           sec_mem_start, sec_mem_size):
    dest_fd = open(dest, 'w+b')
    src_fd = open(source, 'rb')

    dest_fd.write(b'\x00' * header_size)

    sizesrc = get_size(src_fd)
    if sizesrc > 0:
        mmsrc = mmap.mmap(src_fd.fileno(), 0, access=mmap.ACCESS_READ)
        dest_fd.write(mmsrc[:sizesrc])
        mmsrc.close()

    src_fd.close()

    aml_set_header(dest_fd, entry, res_mem_start, res_mem_size, sec_mem_start,
                   sec_mem_size)

    dest_fd.close()


def auto_int(x):
    return int(x, 0)


def get_args():
    parser = argparse.ArgumentParser()

    parser.add_argument('--source',
                        required=True,
                        help='Source file')

    parser.add_argument('--dest',
                        required=True,
                        help='Destination file')

    parser.add_argument('--entry',
                        required=True,
                        type=auto_int,
                        help='Entry point')

    parser.add_argument('--res_mem_start',
                        required=True,
                        type=auto_int,
                        help='Reserved memory start')

    parser.add_argument('--res_mem_size',
                        required=True,
                        type=auto_int,
                        help='Reserved memory size')

    parser.add_argument('--sec_mem_start',
                        required=True,
                        type=auto_int,
                        help='Secure memory start')

    parser.add_argument('--sec_mem_size',
                        required=True,
                        type=auto_int,
                        help='Secure memory size')

    return parser.parse_args()


def main():
    args = get_args()

    source_file = args.source
    destination_file = args.dest
    entry_point = args.entry
    res_mem_start = args.res_mem_start
    res_mem_size = args.res_mem_size
    sec_mem_start = args.sec_mem_start
    sec_mem_size = args.sec_mem_size

    aml_create_header_file(source_file,
                           destination_file,
                           entry_point,
                           res_mem_start,
                           res_mem_size,
                           sec_mem_start,
                           sec_mem_size)


if __name__ == "__main__":
    main()