Files

91 lines
3.2 KiB
Python
Executable File
Vendored

#!/usr/bin/python
import os, sys, struct
import binascii
HEADER_VER = 1
MAGIC_ID = 0x5346574C
ALIGN_UNIT = 131072
PARTITION_HEADER_SIZE = 64
FILE_HEADER_SIZE = 64
COMPRESS_TYPE = 0
def calc_crc32(filename):
buf = open(filename,'rb').read()
buf = (binascii.crc32(buf) & 0xFFFFFFFF)
return buf
def main():
if len(sys.argv) != 3:
print 'Input error! usage:\n %s FOLDER_NAME OUTPUT_BIN_NAME' %sys.argv[0]
return
ALIGN_UNIT_cnt = 0;
write_ptr = 0
entries = os.listdir(sys.argv[1])
header_size = len(entries)*FILE_HEADER_SIZE + PARTITION_HEADER_SIZE
"""print 'Partition Header:'
print ' magic id : 0x%08X' %MAGIC_ID
print ' hearer ver : 0x%08X' %HEADER_VER
print ' header size : %d' %header_size
print ' file number : %d' %len(entries)"""
write_ptr += ((header_size-1)/ALIGN_UNIT+1)*ALIGN_UNIT;
image_name = sys.argv[2]
# Write partition header
image = open(image_name, 'wb')
image.write(struct.pack('I', MAGIC_ID)) # magic id
image.write(struct.pack('I', HEADER_VER)) # header version
image.write(struct.pack('I', header_size)) # header size
image.write(struct.pack('I', ALIGN_UNIT)) # access align unit
image.write(struct.pack('I', len(entries))) # file number
# Padding partition header to PARTITION_HEADER_SIZE
for x in range(PARTITION_HEADER_SIZE-image.tell()%PARTITION_HEADER_SIZE):
image.write('%c' % 0x00)
for entry in entries:
file_path = sys.argv[1] + "/" + entry
file_len = os.path.getsize(file_path)
crc32_value = calc_crc32(file_path)
"""print 'File Header:'
print ' file name : %s' %file_path
print ' position : 0x%08X' %write_ptr
print ' file len : %d' %file_len
print ' padding len : %d' %(ALIGN_UNIT - file_len%ALIGN_UNIT)
print ' crc32 : 0x%08X' %crc32_value
print ' compress : 0x%08X' %COMPRESS_TYPE"""
# Write file header
image.write(struct.pack('32s', entry)) # file name
image.write(struct.pack('I', write_ptr)) # file position
image.write(struct.pack('I', file_len)) # file length
image.write(struct.pack('I', (ALIGN_UNIT - file_len%ALIGN_UNIT))) # padding length
image.write(struct.pack('I', crc32_value)) # crc32
image.write(struct.pack('I', COMPRESS_TYPE)) # compress type
# Padding file header to FILE_HEADER_SIZE
for x in range(PARTITION_HEADER_SIZE-image.tell()%PARTITION_HEADER_SIZE):
image.write('%c' % 0x00)
write_ptr += ((file_len-1)/ALIGN_UNIT+1)*ALIGN_UNIT
# Padding header
for x in range(((header_size-1)/ALIGN_UNIT+1)*ALIGN_UNIT-image.tell()):
image.write('%c' % 0x00)
# Write file content
for entry in entries:
file_path = sys.argv[1] + "/" + entry
f = open(file_path, "r")
image.write(f.read())
# Padding file content
for x in range(ALIGN_UNIT-image.tell()%ALIGN_UNIT):
image.write('%c' % 0x00)
image.close()
print ' %d files packed in %s' %(len(entries), image_name)
if __name__ == '__main__':
main()