91 lines
3.2 KiB
Python
Executable File
Vendored
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() |