source: mainline/tools/mkuimage.py@ 77578e8

Last change on this file since 77578e8 was 4dd3912, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 3 years ago

Update python scripts

  • Property mode set to 100755
File size: 3.0 KB
Line 
1#!/usr/bin/env python
2#
3# SPDX-FileCopyrightText: 2010 Jiri Svoboda
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7
8"""
9Create legacy uImage (U-Boot image)
10"""
11
12from collections import deque
13import os
14import sys
15import xstruct
16import zlib
17
18UIMAGE_HEADER = """big:
19 uint32_t magic
20 uint32_t header_crc
21 uint32_t c_tstamp
22 uint32_t data_size
23 uint32_t load_addr
24 uint32_t start_addr
25 uint32_t data_crc
26 uint8_t os
27 uint8_t arch
28 uint8_t img_type
29 uint8_t compression
30 char img_name[32]
31"""
32
33def main():
34 args = deque(sys.argv)
35 cmd_name = args.popleft()
36 base_name = os.path.basename(cmd_name)
37 image_name = 'Noname'
38 load_addr = 0
39 start_addr = 0
40 os_type = 5 #Linux is the default
41
42 while len(args) >= 2 and args[0][0] == '-':
43 opt = args.popleft()[1:]
44 optarg = args.popleft()
45
46 if opt == 'name':
47 image_name = optarg
48 elif opt == 'laddr':
49 load_addr = (int)(optarg, 0)
50 elif opt == 'saddr':
51 start_addr = (int)(optarg, 0)
52 elif opt == 'ostype':
53 os_type = (int)(optarg, 0)
54 else:
55 print(base_name + ": Unrecognized option.")
56 print_syntax(cmd_name)
57 return
58
59 if len(args) < 2:
60 print(base_name + ": Argument missing.")
61 print_syntax(cmd_name)
62 return
63
64 inf_name = args[0]
65 outf_name = args[1]
66
67 try:
68 mkuimage(inf_name, outf_name, image_name, load_addr, start_addr, os_type)
69 except:
70 os.remove(outf_name)
71 raise
72
73def mkuimage(inf_name, outf_name, image_name, load_addr, start_addr, os_type):
74 inf = open(inf_name, 'rb')
75 outf = open(outf_name, 'wb')
76
77 header = xstruct.create(UIMAGE_HEADER)
78 header_size = header.size()
79
80 #
81 # Write data
82 #
83 outf.seek(header_size, os.SEEK_SET)
84 data = inf.read()
85 data_size = inf.tell()
86 data_crc = calc_crc32(data)
87 data_tstamp = (int)(os.path.getmtime(inf_name))
88 outf.write(data)
89 data = ''
90
91 #
92 # Write header
93 #
94 outf.seek(0, os.SEEK_SET)
95
96 header.magic = 0x27051956 # uImage magic
97 header.header_crc = 0
98 header.c_tstamp = data_tstamp
99 header.data_size = data_size
100 header.load_addr = load_addr # Address where to load image
101 header.start_addr = start_addr # Address of entry point
102 header.data_crc = data_crc
103 header.os = os_type
104 header.arch = 2 # ARM
105 header.img_type = 2 # Kernel
106 header.compression = 0 # None
107 header.img_name = image_name.encode('ascii')
108
109 header_crc = calc_crc32(header.pack())
110 header.header_crc = header_crc
111
112 outf.write(header.pack())
113 outf.close()
114
115## Compute CRC32 of binary string.
116#
117# Works around bug in zlib.crc32() which returns signed int32 result
118# in Python < 3.0.
119#
120def calc_crc32(byteseq):
121 signed_crc = zlib.crc32(byteseq, 0)
122 if signed_crc < 0:
123 return signed_crc + (1 << 32)
124 else:
125 return signed_crc
126
127## Print command-line syntax.
128#
129def print_syntax(cmd):
130 print("syntax: " + cmd + " [<options>] <raw_image> <uImage>")
131 print()
132 print("\traw_image\tInput image name (raw binary data)")
133 print("\tuImage\t\tOutput uImage name (U-Boot image)")
134 print()
135 print("options:")
136 print("\t-name <name>\tImage name (default: 'Noname')")
137 print("\t-laddr <name>\tLoad address (default: 0x00000000)")
138 print("\t-saddr <name>\tStart address (default: 0x00000000)")
139
140if __name__ == '__main__':
141 main()
Note: See TracBrowser for help on using the repository browser.