Загрузка данных


#!/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)