flash烧录工具用资源文件file.bin转换工具, 就是oob数据格式修改 1649/1 1649/head
authorSnickerSun <snickersun@163.com>
Tue, 18 Feb 2025 14:07:37 +0000 (22:07 +0800)
committerSnickerSun <snickersun@163.com>
Tue, 18 Feb 2025 14:07:37 +0000 (22:07 +0800)
tools/scripts/gen_burn_image_for_nandflash.py

index 73a3078..9ba0423 100755 (executable)
-#!/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