conv_zip.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import os
  2. import sys
  3. import time
  4. import shutil
  5. LEN = 2 ** 16
  6. TARGET = os.getcwd()
  7. SOURCE = sys.argv[1]
  8. NAME = os.path.basename(sys.argv[1])
  9. DEFLATE = NAME + ".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 LOADER_NAME "%s"
  40. #define LOADER_COMPRESS "ZIP"
  41. #define ROM_ZIP_SIZE %i
  42. #define ROM_BUFFER_CNT %i
  43. ''' % (
  44. os.path.basename(SOURCE),
  45. time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime()),
  46. NAME,
  47. zip_size,
  48. len(parts)
  49. ))
  50. for idx, val in enumerate(parts):
  51. hfile.write('#define ROM_BUFFER_SIZE%02i %i\n' % (idx + 1, val))
  52. hfile.write('\n#endif\n')
  53. hfile.close()
  54. cfile.write('''/*
  55. File: %s
  56. Time: %s
  57. */
  58. #include <avr/pgmspace.h>
  59. #include <loader.h>
  60. ''')
  61. addr = 0
  62. for idx, val in enumerate(parts):
  63. cfile.write('''
  64. const char _rom%02i[ROM_BUFFER_SIZE%02i] PROGMEM = {
  65. ''' % (idx + 1, idx + 1))
  66. l = addr
  67. h = addr + parts[idx]
  68. addr += parts[idx]
  69. for idx, c in enumerate(data[l:h]):
  70. c = ord(c)
  71. if idx < len(data) - 1:
  72. cfile.write("0x%02x," % c)
  73. else:
  74. cfile.write("0x%02x" % c)
  75. if idx and idx % 16 == 0:
  76. cfile.write("\n")
  77. cfile.write('''
  78. };
  79. ''')
  80. cfile.write('PGM_VOID_P _rom[ROM_BUFFER_CNT]= {')
  81. for idx, val in enumerate(parts):
  82. if idx < len(parts) - 1:
  83. cfile.write('''&_rom%02i,''' % (idx + 1))
  84. else:
  85. cfile.write('''&_rom%02i''' % (idx + 1))
  86. cfile.write('''};
  87. ''')
  88. cfile.write('const int _rom_size[ROM_BUFFER_CNT] = {')
  89. for idx, val in enumerate(parts):
  90. if idx < len(parts) - 1:
  91. cfile.write('''%i,''' % (val))
  92. else:
  93. cfile.write('''%i''' % (val))
  94. cfile.write('''};
  95. ''')
  96. cfile.close()
  97. shutil.copy("/tmp/loader.c", os.path.join(TARGET, "loader.c"))
  98. shutil.copy("/tmp/loader.h", os.path.join(TARGET, "loader.h"))
  99. print "Copy loader.h and loader.c to %s" % TARGET