3 # SPDX-License-Identifier: GPL-2.0-or-later
5 # sercomm-kernel-header.py: Creates Sercomm kernel header
7 # Copyright © 2022 Mikhail Zhilkin
15 KERNEL_HEADER_SIZE
= 0x100
17 ROOTFS_FAKE_HEADER
= "UBI#"
22 def create_kernel_header(args
):
23 out_file
= open(args
.header_file
, "wb")
24 header
= get_kernel_header(args
)
25 out_file
.write(header
)
28 def get_kernel_header(args
):
29 header
= bytearray([PADDING
] * KERNEL_HEADER_SIZE
)
31 struct
.pack_into('<L', header
, 0xc, 0xffffff02)
32 struct
.pack_into('<L', header
, 0x1c, 0x0)
33 struct
.pack_into('<L', header
, 0x34, 0x0)
34 struct
.pack_into('<L', header
, 0x10, args
.kernel_offset
)
35 struct
.pack_into('<L', header
, 0x28, args
.rootfs_offset
)
37 if (args
.rootfs_file
):
38 if (args
.rootfs_checking_size
):
39 rootfs_size
= args
.rootfs_checking_size
41 rootfs_size
= os
.path
.getsize(args
.rootfs_file
)
42 buf
= open(args
.rootfs_file
,'rb').read(rootfs_size
)
43 crc
= binascii
.crc32(buf
) & 0xffffffff
45 rootfs_size
= len(ROOTFS_FAKE_HEADER
)
46 crc
= binascii
.crc32(str.encode(ROOTFS_FAKE_HEADER
)) & \
48 struct
.pack_into('<L', header
, 0x2c, rootfs_size
)
49 struct
.pack_into('<L', header
, 0x30, crc
)
51 kernel_size
= os
.path
.getsize(args
.kernel_file
)
52 struct
.pack_into('<L', header
, 0x14, kernel_size
)
54 kernel_end_offset
= args
.kernel_offset
+ kernel_size
55 struct
.pack_into('<L', header
, 0x4, kernel_end_offset
)
57 buf
= open(args
.kernel_file
,'rb').read()
58 crc
= binascii
.crc32(buf
) & 0xffffffff
59 struct
.pack_into('<L', header
, 0x18, crc
)
61 crc
= binascii
.crc32(header
) & 0xffffffff
62 struct
.pack_into('<L', header
, 0x8, crc
)
64 struct
.pack_into('<L', header
, 0x0, 0x726553)
71 parser
= argparse
.ArgumentParser(description
='This script generates \
72 a kernel header for the Sercomm mt7621 devices')
74 parser
.add_argument('--kernel-image',
78 help='Path to a Kernel binary image')
80 parser
.add_argument('--kernel-offset',
86 parser
.add_argument('--rootfs-offset',
92 parser
.add_argument('--output-header',
96 help='Output kernel header file')
98 parser
.add_argument('--rootfs-image',
102 help='Path to RootFS binary image (optional)')
104 parser
.add_argument('--rootfs-checking-size',
105 dest
='rootfs_checking_size',
108 help='Bytes count for CRC calculation (optional)')
110 args
= parser
.parse_args()
112 if ((not args
.kernel_file
) or
113 (not args
.kernel_offset
) or
114 (not args
.rootfs_offset
) or
115 (not args
.header_file
)):
119 create_kernel_header(args
)