#!/usr/bin/env python3
import sys
import os
def process_bitstream(input_path, output_path):
if not os.path.exists(input_path):
print(f"Error: File {input_path} not found.")
return False
with open(input_path, 'rb') as f:
raw_data = f.read()
file_size = len(raw_data)
curr_pos = 4 # Пропускаем "LSCC"
# Ищем позицию преамбулы Nexus (байт 0xB3)
pos_b3 = -1
for i in range(curr_pos, file_size - 3):
if raw_data[i] == 0xb3 and raw_data[i - 1] in (0xbd, 0xbe, 0xbf):
pos_b3 = i
break
if pos_b3 == -1:
print("Error: Preamble not found!")
return False
end_header = pos_b3 - 4 # Точка отсечения заголовка (обычно 346 байт)
# Извлекаем чистое тело битстрима (808325 байт)
clean_bitstream = bytearray(raw_data[end_header:])
original_clean_size = len(clean_bitstream)
# !!! ДОБАВЛЯЕМ ВЫРАВНИВАНИЕ (PADDING) ПО ГРАНИЦЕ 4096 БАЙТ ДЛЯ DMA i.MX95 !!!
page_size = 4096
remainder = original_clean_size % page_size
if remainder != 0:
padding_size = page_size - remainder
print(f"Applying alignment: payload size ({original_clean_size} bytes) is not multiple of {page_size}.")
print(f"Adding {padding_size} bytes of zero padding to the end of stream.")
# Дописываем нули в конец потока данных
clean_bitstream.extend(b'\x00' * padding_size)
else:
print(f"Payload size ({original_clean_size} bytes) is already perfectly aligned to {page_size}.")
# Зеркально разворачиваем биты в каждом байте для I2C (MSB-first), включая дополненный хвост
# Пример: 0b11000110 (0xC6) превратится в 0b01100011 (0x63)
reversed_bitstream = bytes(int('{:08b}'.format(b)[::-1], 2) for b in clean_bitstream)
with open(output_path, 'wb') as f:
f.write(reversed_bitstream)
print(f"Successfully processed!")
print(f"Original file size: {file_size} bytes")
print(f"Stripped header size: {end_header} bytes")
print(f"Final aligned & reversed binary size: {len(reversed_bitstream)} bytes (Exactly {len(reversed_bitstream) // page_size} blocks of 4KB)")
return True
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Usage: python3 parse_and_reverse.py <input.bit> <output.bin>")
sys.exit(1)
success = process_bitstream(sys.argv[1], sys.argv[2])
sys.exit(0 if success else 1)