From aadde8780cde4f142a28867260f667f0c9208f3d Mon Sep 17 00:00:00 2001 From: SnickerSun Date: Tue, 18 Feb 2025 22:07:37 +0800 Subject: [PATCH] =?utf8?q?flash=E7=83=A7=E5=BD=95=E5=B7=A5=E5=85=B7?= =?utf8?q?=E7=94=A8=E8=B5=84=E6=BA=90=E6=96=87=E4=BB=B6file.bin=E8=BD=AC?= =?utf8?q?=E6=8D=A2=E5=B7=A5=E5=85=B7,=20=E5=B0=B1=E6=98=AFoob=E6=95=B0?= =?utf8?q?=E6=8D=AE=E6=A0=BC=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- tools/scripts/gen_burn_image_for_nandflash.py | 210 +++++------------- 1 file changed, 53 insertions(+), 157 deletions(-) diff --git a/tools/scripts/gen_burn_image_for_nandflash.py b/tools/scripts/gen_burn_image_for_nandflash.py index 73a307822..9ba042393 100755 --- a/tools/scripts/gen_burn_image_for_nandflash.py +++ b/tools/scripts/gen_burn_image_for_nandflash.py @@ -1,163 +1,59 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -import os import sys -import time -import struct -import shutil - -""" -介绍: - 本脚本主要实现 oobsize 64 的 file.bin 的 oob数据调整, - 生成的文件,专门提供给河洛半导体的专用下载工具。 -""" - -#tools/scripts/unyaffs2tool.py -cur_dir = os.path.dirname(os.path.abspath(__file__)) -#tools/unyaffs_0.9.7/unyaffs -image_tool_path = os.path.realpath(os.path.join(cur_dir, '..','unyaffs_0.9.7')) - -# 配置nandflash信息 -cfg_page_size = 2048 -cfg_obb_size = 64 - -partition_list = [ - ["user","0x0", "null"] -] -# 将生成image文件转换大小端,保存成另外文件 -def convert(src_file, dest_file): - fp_src = open(src_file, 'rb') - fp_dest = open(dest_file, 'wb') - oobfound=0 - oobdata_index=0 - oobdata_tmp0=struct.pack('BBBB', 0, 0, 0,0) - oobdata_tmp1=struct.pack('BBBB', 0, 0, 0,0) - oobdata_tmp2=struct.pack('BBBB', 0, 0, 0,0) - oobdata_tmp3=struct.pack('BBBB', 0, 0, 0,0) - oobdata_tmp4=struct.pack('BBBB', 0, 0, 0,0) - oobdata_tmp5=struct.pack('BBBB', 0, 0, 0,0) - oobdata_tmp6=struct.pack('BBBB', 0, 0, 0,0) - src_size = os.path.getsize(src_file) - for i in range(int(src_size / 4)): - data = fp_src.read(4) - # print(" r= {} {} {} {}".format( hex(data[0]), hex(data[1]), hex(data[2]), hex(data[3]))) - if oobfound == 1 : - if oobdata_index < 15: - # print(" r r {} {} {} {}".format( hex(data[0]), hex(data[1]), hex(data[2]), hex(data[3]))) - # header 0 1=0 2=0 - # 3=1 4=2 5=0 6=0 - # 7=3 8=4 9=0 10=0 - # 11=5 12=6 13=0 14=0 - - if oobdata_index == 0: - oobdata_tmp0 = struct.pack('BBBB', data[0], data[1], data[2],data[3]) - fp_dest.write(oobdata_tmp0) - # print(" = = {} {} {} {}".format( hex(oobdata_tmp0[0]), hex(oobdata_tmp0[1]), hex(oobdata_tmp0[2]), hex(oobdata_tmp0[3]))) - elif oobdata_index == 1: - oobdata_tmp1 = struct.pack('BBBB', data[0], data[1], data[2],data[3]) - rw = struct.pack('BBBB', 0, 0, 0, 0) - fp_dest.write(rw) - # print(" = = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) - elif oobdata_index == 2: - oobdata_tmp2 = struct.pack('BBBB', data[0], data[1], data[2],data[3]) - rw = struct.pack('BBBB', 0, 0, 0, 0) - fp_dest.write(rw) - # print(" = = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) - elif oobdata_index == 3: - oobdata_tmp3 = struct.pack('BBBB', data[0], data[1], data[2],data[3]) - fp_dest.write(oobdata_tmp1) - # print(" = = {} {} {} {}".format( hex(oobdata_tmp1[0]), hex(oobdata_tmp1[1]), hex(oobdata_tmp1[2]), hex(oobdata_tmp1[3]))) - elif oobdata_index == 4: - oobdata_tmp4 = struct.pack('BBBB', data[0], data[1], data[2],data[3]) - fp_dest.write(oobdata_tmp2) - # print(" = = {} {} {} {}".format( hex(oobdata_tmp2[0]), hex(oobdata_tmp2[1]), hex(oobdata_tmp2[2]), hex(oobdata_tmp2[3]))) - elif oobdata_index == 5: - oobdata_tmp5 = struct.pack('BBBB', data[0], data[1], data[2],data[3]) - rw = struct.pack('BBBB', 0, 0, 0, 0) - fp_dest.write(rw) - # print(" = = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) - elif oobdata_index == 6: - oobdata_tmp6 = struct.pack('BBBB', data[0], data[1], data[2],data[3]) - rw = struct.pack('BBBB', 0, 0, 0, 0) - fp_dest.write(rw) - # print(" = = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) - elif oobdata_index == 7: - fp_dest.write(oobdata_tmp3) - # print(" = = {} {} {} {}".format( hex(oobdata_tmp3[0]), hex(oobdata_tmp3[1]), hex(oobdata_tmp3[2]), hex(oobdata_tmp3[3]))) - elif oobdata_index == 8: - fp_dest.write(oobdata_tmp4) - # print(" = = {} {} {} {}".format( hex(oobdata_tmp4[0]), hex(oobdata_tmp4[1]), hex(oobdata_tmp4[2]), hex(oobdata_tmp4[3]))) - elif oobdata_index == 9: - rw = struct.pack('BBBB', 0, 0, 0, 0) - fp_dest.write(rw) - # print(" = = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) - elif oobdata_index == 10: - rw = struct.pack('BBBB', 0, 0, 0, 0) - fp_dest.write(rw) - # print(" = = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) - elif oobdata_index == 11: - fp_dest.write(oobdata_tmp5) - # print(" = = {} {} {} {}".format( hex(oobdata_tmp5[0]), hex(oobdata_tmp5[1]), hex(oobdata_tmp5[2]), hex(oobdata_tmp5[3]))) - elif oobdata_index == 12: - fp_dest.write(oobdata_tmp6) - # print(" = = {} {} {} {}".format( hex(oobdata_tmp6[0]), hex(oobdata_tmp6[1]), hex(oobdata_tmp6[2]), hex(oobdata_tmp6[3]))) - elif oobdata_index == 13: - rw = struct.pack('BBBB', 0, 0, 0, 0) - fp_dest.write(rw) - # print(" = = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) - elif oobdata_index == 14: - rw = struct.pack('BBBB', 0, 0, 0, 0) - fp_dest.write(rw) - # print(" = = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) - oobdata_index += 1 - else: - oobfound = 0 - oobdata_index = 0 - rw=struct.pack('BBBB', data[0], data[1], data[2],data[3]) - fp_dest.write(rw) - # print(" w = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) - elif data[0]==16 and data[1]==0 and data[2]==255 and data[3]==255: - # print("-===================") - # print(" r r {} {} {} {}".format( hex(data[0]), hex(data[1]), hex(data[2]), hex(data[3]))) - # print(" = = {} {} {} {}".format( hex(data[0]), hex(data[1]), hex(data[2]), hex(data[3]))) - oobfound=1 - rw=struct.pack('BBBB', data[0], data[1], data[2],data[3]) - fp_dest.write(rw) - # print(" w = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) - else: - rw=struct.pack('BBBB', data[0], data[1], data[2],data[3]) - fp_dest.write(rw) - # print(" w = {} {} {} {}".format( hex(rw[0]), hex(rw[1]), hex(rw[2]), hex(rw[3]))) +def transform_data(data): + """ + 对以 1000FFFF 开头的 64 字节数据进行转换 + 依次读取前 32 字节,每次 8 字节,每组后面添加 8 个 0 + """ + transformed = bytearray() + for i in range(0, 32, 8): + part = data[i:i + 8] + transformed.extend(part) + transformed.extend([0] * 8) + return bytes(transformed) + + +def process_file(input_file_path, output_file_path): + try: + with open(input_file_path, 'rb') as input_file, open(output_file_path, 'wb') as output_file: + prev_address = None + position = 0 + while True: + # 每次读取 64 字节 + chunk = input_file.read(64) + if not chunk: + # 读取到文件末尾,结束循环 + break + hex_prefix = chunk[:4].hex().upper() + if hex_prefix == '1000FFFF': + current_address = position + if prev_address is None or current_address - prev_address >= 2112: + # 是第一个匹配块或者地址间距大于等于 2112 字节 + transformed_chunk = transform_data(chunk) + output_file.write(transformed_chunk) + address_diff = current_address - prev_address if prev_address is not None else "无" + print(f"oob地址: {current_address:08X}, 原数据: {chunk.hex().upper()}, 改后: {transformed_chunk.hex().upper()}, 地址间距: {address_diff}") + prev_address = current_address + else: + # 地址间距不足 2112 字节,跳过该数据块 + output_file.write(chunk) + else: + # 若不以 1000FFFF 开头,直接写入原数据 + output_file.write(chunk) + position += 64 + + print(f"处理完成,结果已保存到 {output_file_path}。") + except FileNotFoundError: + print(f"错误:未找到输入文件 {input_file_path}。") + except Exception as e: + print(f"发生未知错误:{e}") - fp_src.close() - fp_dest.close() - -def convert2(src_file, dest_file): - fp_src = open(src_file, 'rb') - fp_dest = open(dest_file, 'wb') - src_size = os.path.getsize(src_file) - for i in range(int(src_size / 4)): - data = fp_src.read(4) - print(" r= {} {} {} {}".format( hex(data[0]), hex(data[1]), hex(data[2]), hex(data[3]))) - rw=struct.pack('BBBB', data[0], data[1], data[2],data[3]) - fp_dest.write(rw) - - fp_src.close() - fp_dest.close() if __name__ == "__main__": - image_file=sys.argv[1] - tmpdir=sys.argv[2] - # image_file = os.path.join(cur_dir, "file.bin") - - if sys.platform == 'linux2' or sys.platform == 'linux': - - imgfilesize = os.path.getsize(image_file) - # targetfile = os.path.join(sys.argv[2],"filetmp.bin") - convert(image_file,tmpdir) - # convert2(image_file,targetfile) - - print("make yaffs image file over!") + if len(sys.argv) != 3: + print("用法:python {} <输入文件路径> <输出文件路径>".format(sys.argv[0])) + sys.exit(1) + input_file = sys.argv[1] + output_file = sys.argv[2] + process_file(input_file, output_file) \ No newline at end of file -- 2.17.1