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