conv_zip.py 2.5 KB

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