conv_rle.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import binascii
  2. import os
  3. import sys
  4. import time
  5. import shutil
  6. LEN = 2 ** 16
  7. huffman = False
  8. TARGET = os.getcwd()
  9. SOURCE = sys.argv[1]
  10. LOC = os.path.dirname(os.path.realpath(__file__))
  11. HUFFMAN_ENCODER = os.path.join(LOC, "..", "tools", "huffman", "huffman-encode")
  12. data = open(SOURCE, "r").read()
  13. print "Load %s, %i bytes" % (SOURCE, len(data))
  14. data = data[:LEN]
  15. print "Use %i bytes" % (len(data))
  16. data = binascii.rlecode_hqx(data)
  17. print "RLE crunch (%i) bytes" % (len(data))
  18. rle_size = len(data)
  19. huffman_size = 0
  20. if huffman:
  21. binfile = open("/tmp/loader.rle", "w")
  22. binfile.write(data)
  23. binfile.close()
  24. cmd = "%s /tmp/loader.rle" % HUFFMAN_ENCODER
  25. print cmd
  26. os.system(cmd)
  27. data = open("/tmp/loader.rle.hfm", "r").read()
  28. print "HUFFMAN crunch (%i) bytes" % (len(data))
  29. huffman_size = len(data)
  30. os.unlink("/tmp/loader.rle")
  31. os.unlink("/tmp/loader.rle.hfm")
  32. cfile = open("/tmp/loader.c", "w")
  33. hfile = open("/tmp/loader.h", "w")
  34. parts = []
  35. cnt = len(data) / ((2 ** 15) - 1)
  36. r = len(data) - (cnt * ((2 ** 15) - 1))
  37. for i in range(0, cnt):
  38. parts.append(((2 ** 15) - 1))
  39. parts.append(r)
  40. hfile.write('''/*
  41. File: %s
  42. Time: %s
  43. */
  44. #ifndef __FIFO_H__
  45. #define __FIFO_H__
  46. #define ROM_HUFFMAN_SIZE %i
  47. #define ROM_RLE_SIZE %i
  48. #define ROM_BUFFER_CNT %i
  49. ''' % (
  50. os.path.basename(SOURCE),
  51. time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime()),
  52. huffman_size,
  53. rle_size,
  54. len(parts)
  55. ))
  56. for idx, val in enumerate(parts):
  57. hfile.write('#define ROM_BUFFER_SIZE%02i %i\n' % (idx + 1, val))
  58. hfile.write('\n#endif\n')
  59. hfile.close()
  60. cfile.write('''/*
  61. File: %s
  62. Time: %s
  63. */
  64. #include <avr/pgmspace.h>
  65. #include <loader.h>
  66. ''')
  67. addr = 0
  68. for idx, val in enumerate(parts):
  69. cfile.write('''
  70. const char _rom%02i[ROM_BUFFER_SIZE%02i] PROGMEM = {
  71. ''' % (idx + 1, idx + 1))
  72. l = addr
  73. h = addr + parts[idx]
  74. addr += parts[idx]
  75. for idx, c in enumerate(data[l:h]):
  76. c = ord(c)
  77. if idx < len(data) - 1:
  78. cfile.write("0x%02x," % c)
  79. else:
  80. cfile.write("0x%02x" % c)
  81. if idx and idx % 16 == 0:
  82. cfile.write("\n")
  83. cfile.write('''
  84. };
  85. ''')
  86. cfile.write('PGM_VOID_P _rom[ROM_BUFFER_CNT]= {')
  87. for idx, val in enumerate(parts):
  88. if idx < len(parts) - 1:
  89. cfile.write('''&_rom%02i,''' % (idx + 1))
  90. else:
  91. cfile.write('''&_rom%02i''' % (idx + 1))
  92. cfile.write('''};
  93. ''')
  94. cfile.write('const int _rom_size[ROM_BUFFER_CNT] = {')
  95. for idx, val in enumerate(parts):
  96. if idx < len(parts) - 1:
  97. cfile.write('''%i,''' % (val))
  98. else:
  99. cfile.write('''%i''' % (val))
  100. cfile.write('''};
  101. ''')
  102. cfile.close()
  103. shutil.copy("/tmp/loader.c", os.path.join(TARGET, "loader.c"))
  104. shutil.copy("/tmp/loader.h", os.path.join(TARGET, "loader.h"))
  105. print "Copy loader.h and loader.c to %s" % TARGET