| #!/usr/bin/env python3 |
| |
| """ |
| CFE Partition Tag |
| |
| { |
| u32 part_id; |
| u32 part_size; |
| u16 flags; |
| char part_name[33]; |
| char part_version[21]; |
| u32 part_crc32; |
| } |
| |
| """ |
| |
| import argparse |
| import os |
| import struct |
| import binascii |
| |
| |
| PART_NAME_SIZE = 33 |
| PART_VERSION_SIZE = 21 |
| |
| |
| def auto_int(x): |
| return int(x, 0) |
| |
| |
| def str_to_bytes_pad(string, size): |
| str_bytes = string.encode() |
| num_bytes = len(str_bytes) |
| if num_bytes >= size: |
| str_bytes = str_bytes[: size - 1] + "\0".encode() |
| else: |
| str_bytes += "\0".encode() * (size - num_bytes) |
| return str_bytes |
| |
| |
| def create_tag(args, in_bytes, size): |
| # JAM CRC32 is bitwise not and unsigned |
| crc = ~binascii.crc32(in_bytes) & 0xFFFFFFFF |
| |
| tag = bytearray() |
| tag += struct.pack(">I", args.part_id) |
| tag += struct.pack(">I", size) |
| tag += struct.pack(">H", args.part_flags) |
| tag += str_to_bytes_pad(args.part_name, PART_NAME_SIZE) |
| tag += str_to_bytes_pad(args.part_version, PART_VERSION_SIZE) |
| tag += struct.pack(">I", crc) |
| |
| return tag |
| |
| |
| def create_output(args): |
| in_st = os.stat(args.input_file) |
| in_size = in_st.st_size |
| |
| in_f = open(args.input_file, "r+b") |
| in_bytes = in_f.read(in_size) |
| in_f.close() |
| |
| tag = create_tag(args, in_bytes, in_size) |
| |
| out_f = open(args.output_file, "w+b") |
| out_f.write(tag) |
| out_f.close() |
| |
| |
| def main(): |
| global args |
| |
| parser = argparse.ArgumentParser(description="") |
| |
| parser.add_argument( |
| "--flags", |
| dest="part_flags", |
| action="store", |
| type=auto_int, |
| help="Partition Flags", |
| ) |
| |
| parser.add_argument( |
| "--id", |
| dest="part_id", |
| action="store", |
| type=auto_int, |
| help="Partition ID", |
| ) |
| |
| parser.add_argument( |
| "--input-file", |
| dest="input_file", |
| action="store", |
| type=str, |
| help="Input file", |
| ) |
| |
| parser.add_argument( |
| "--output-file", |
| dest="output_file", |
| action="store", |
| type=str, |
| help="Output file", |
| ) |
| |
| parser.add_argument( |
| "--name", |
| dest="part_name", |
| action="store", |
| type=str, |
| help="Partition Name", |
| ) |
| |
| parser.add_argument( |
| "--version", |
| dest="part_version", |
| action="store", |
| type=str, |
| help="Partition Version", |
| ) |
| |
| args = parser.parse_args() |
| |
| if ( |
| (not args.part_flags) |
| or (not args.part_id) |
| or (not args.input_file) |
| or (not args.output_file) |
| or (not args.part_name) |
| or (not args.part_version) |
| ): |
| parser.print_help() |
| else: |
| create_output(args) |
| |
| |
| main() |