blob: d35cc68b9da2234ef8ebab682f93a7d83f4422ac [file] [log] [blame]
Etienne Carrieref0d19bd2018-11-23 18:04:02 +01001#!/usr/bin/env python3
2# SPDX-License-Identifier: BSD-2-Clause
3#
4# Copyright (c) 2018, Linaro Limited
5#
6
7import argparse
8import array
9import os
10import re
Jerome Forissierdfb96022019-09-18 17:58:00 +020011import sys
Etienne Carrieref0d19bd2018-11-23 18:04:02 +010012
13
14def get_args():
15
Jerome Forissier9171d162019-01-30 08:24:23 +010016 parser = argparse.ArgumentParser(description='Converts a binary file '
17 'into C source file defining binary '
18 'data as a constant byte array.')
Etienne Carrieref0d19bd2018-11-23 18:04:02 +010019
Jerome Forissier9171d162019-01-30 08:24:23 +010020 parser.add_argument('--bin', required=True,
21 help='Path to the input binary file')
Etienne Carrieref0d19bd2018-11-23 18:04:02 +010022
Jerome Forissier9171d162019-01-30 08:24:23 +010023 parser.add_argument('--vname', required=True,
24 help='Variable name for the generated table in '
25 'the output C source file.')
Etienne Carrieref0d19bd2018-11-23 18:04:02 +010026
Jerome Forissier9171d162019-01-30 08:24:23 +010027 parser.add_argument('--out', required=True,
28 help='Path for the generated C file')
Etienne Carrieref0d19bd2018-11-23 18:04:02 +010029
Jerome Forissierdfb96022019-09-18 17:58:00 +020030 parser.add_argument('--text', required=False, action='store_true',
31 help='Treat input as a text file')
32
Jerome Forissier9171d162019-01-30 08:24:23 +010033 return parser.parse_args()
Etienne Carrieref0d19bd2018-11-23 18:04:02 +010034
35
36def main():
37
Jerome Forissier9171d162019-01-30 08:24:23 +010038 args = get_args()
Etienne Carrieref0d19bd2018-11-23 18:04:02 +010039
Jerome Forissier9171d162019-01-30 08:24:23 +010040 with open(args.bin, 'rb') as indata:
41 bytes = indata.read()
Jerome Forissierdfb96022019-09-18 17:58:00 +020042 if args.text:
43 bytes += b'\0'
Jerome Forissier9171d162019-01-30 08:24:23 +010044 size = len(bytes)
Etienne Carrieref0d19bd2018-11-23 18:04:02 +010045
Jerome Forissier9171d162019-01-30 08:24:23 +010046 f = open(args.out, 'w')
47 f.write('/* Generated from ' + args.bin + ' by ' +
48 os.path.basename(__file__) + ' */\n\n')
49 f.write('#include <compiler.h>\n')
50 f.write('#include <stdint.h>\n')
Jerome Forissierdfb96022019-09-18 17:58:00 +020051 if args.text:
52 f.write('__extension__ const char ' + args.vname + '[] = {\n')
53 else:
54 f.write('__extension__ const uint8_t ' + args.vname + '[] ' +
55 ' __aligned(__alignof__(uint64_t)) = {\n')
Jerome Forissier9171d162019-01-30 08:24:23 +010056 i = 0
57 while i < size:
58 if i % 8 == 0:
59 f.write('\t\t')
Jerome Forissierdfb96022019-09-18 17:58:00 +020060 if args.text and i != size - 1 and bytes[i] == b'\0':
61 print('Error: null byte encountered in text file')
62 sys.exit(1)
Jerome Forissier9171d162019-01-30 08:24:23 +010063 f.write('0x' + '{:02x}'.format(bytes[i]) + ',')
64 i = i + 1
65 if i % 8 == 0 or i == size:
66 f.write('\n')
67 else:
68 f.write(' ')
69 f.write('};\n')
70 f.close()
Etienne Carrieref0d19bd2018-11-23 18:04:02 +010071
72
73if __name__ == "__main__":
Jerome Forissier9171d162019-01-30 08:24:23 +010074 main()