conv_rle.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import binascii
  2. import os
  3. import sys
  4. import time
  5. LEN = 2**16
  6. TARGET="/Users/david/Devel/arch/avr/code/quickdev16/avr/usbload"
  7. HUFFMAN_ENCODER="/Users/david/Devel/arch/avr/code/quickdev16/tools/huffman/huffman-encode"
  8. data = open(sys.argv[1],"r").read()
  9. print "Load %s, %i bytes" % (sys.argv[1],len(data))
  10. data = data[:LEN]
  11. print "Use %i bytes" % (len(data))
  12. data = binascii.rlecode_hqx(data)
  13. print "RLE crunch (%i) bytes" % (len(data))
  14. binfile = open("/tmp/loader.rle","w")
  15. binfile.write(data)
  16. binfile.close()
  17. rle_size = len(data)
  18. cmd = "%s /tmp/loader.rle" % HUFFMAN_ENCODER
  19. os.system(cmd)
  20. data = open("/tmp/loader.rle.hfm","r").read()
  21. print "HUFFMAN crunch (%i) bytes" % (len(data))
  22. huffman_size = len(data)
  23. os.unlink("/tmp/loader.rle")
  24. os.unlink("/tmp/loader.rle.hfm")
  25. cfile = open("/tmp/loader.c","w")
  26. hfile = open("/tmp/loader.h","w")
  27. hfile.write('''
  28. #ifndef __FIFO_H__
  29. #define __FIFO_H__
  30. #define ROM_BUFFER_SIZE %i
  31. #define ROM_HUFFMAN_SIZE %i
  32. #define ROM_RLE_SIZE %i
  33. #endif
  34. ''' % (len(data), huffman_size, rle_size))
  35. cfile.write('''/*
  36. File: %s
  37. Time: %s
  38. */
  39. #include <avr/pgmspace.h>
  40. #include <loader.h>
  41. const char _rom[ROM_BUFFER_SIZE] PROGMEM = {
  42. ''' % (sys.argv[1],time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime())))
  43. for idx,c in enumerate(data):
  44. c = ord(c)
  45. if idx<len(data)-1:
  46. cfile.write("0x%02x," % c)
  47. else:
  48. cfile.write("0x%02x" % c)
  49. if idx and idx%16==0:
  50. cfile.write("\n")
  51. cfile.write('''
  52. };
  53. ''')
  54. cfile.close()
  55. os.rename("/tmp/loader.c", os.path.join(TARGET,"loader.c"))
  56. os.rename("/tmp/loader.h", os.path.join(TARGET,"loader.h"))