conv_rle.py 2.3 KB

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