conv_rle.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. HUFFMAN_ENCODER="/Users/david/Devel/arch/avr/code/quickdev16/tools/huffman/huffman-encode"
  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. huffman_size = 0
  19. if huffman == True:
  20. binfile = open("/tmp/loader.rle","w")
  21. binfile.write(data)
  22. binfile.close()
  23. cmd = "%s /tmp/loader.rle" % HUFFMAN_ENCODER
  24. os.system(cmd)
  25. data = open("/tmp/loader.rle.hfm","r").read()
  26. print "HUFFMAN crunch (%i) bytes" % (len(data))
  27. huffman_size = len(data)
  28. os.unlink("/tmp/loader.rle")
  29. os.unlink("/tmp/loader.rle.hfm")
  30. cfile = open("/tmp/loader.c","w")
  31. hfile = open("/tmp/loader.h","w")
  32. hfile.write('''
  33. #ifndef __FIFO_H__
  34. #define __FIFO_H__
  35. #define ROM_BUFFER_SIZE %i
  36. #define ROM_HUFFMAN_SIZE %i
  37. #define ROM_RLE_SIZE %i
  38. #endif
  39. ''' % (len(data), huffman_size, rle_size))
  40. cfile.write('''/*
  41. File: %s
  42. Time: %s
  43. */
  44. #include <avr/pgmspace.h>
  45. #include <loader.h>
  46. const char _rom[ROM_BUFFER_SIZE] PROGMEM = {
  47. ''' % (sys.argv[1],time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime())))
  48. for idx,c in enumerate(data):
  49. c = ord(c)
  50. if idx<len(data)-1:
  51. cfile.write("0x%02x," % c)
  52. else:
  53. cfile.write("0x%02x" % c)
  54. if idx and idx%16==0:
  55. cfile.write("\n")
  56. cfile.write('''
  57. };
  58. ''')
  59. cfile.close()
  60. shutil.copy("/tmp/loader.c", os.path.join(TARGET,"loader.c"))
  61. shutil.copy("/tmp/loader.h", os.path.join(TARGET,"loader.h"))