| 
							- #!/usr/bin/python2.5
 - #
 - # Copyright 2009 Olivier Gillet.
 - #
 - # Author: Olivier Gillet (ol.gillet@gmail.com)
 - #
 - # This program is free software: you can redistribute it and/or modify
 - # it under the terms of the GNU General Public License as published by
 - # the Free Software Foundation, either version 3 of the License, or
 - # (at your option) any later version.
 - # This program is distributed in the hope that it will be useful,
 - # but WITHOUT ANY WARRANTY; without even the implied warranty of
 - # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 - # GNU General Public License for more details.
 - # You should have received a copy of the GNU General Public License
 - # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 - #
 - # -----------------------------------------------------------------------------
 - #
 - # Python module for loading/writing Hex files.
 - 
 - """Intel .hex file loader/writer"""
 - 
 - import logging
 - import sys
 - 
 - 
 - def LoadHexFile(lines):
 -   """Loads a Hex file."""
 - 
 -   data = []
 -   for line_number, line in enumerate(lines):
 -     line = line.strip()
 -     if len(line) < 9:
 -       logging.info('Line %(line_number)d: line too short' % locals())
 -       return None
 - 
 -     if not all(x in '0123456789abcdefABCDEF' for x in line[1:]):
 -       logging.info('Line %(line_number)d: unknown character' % locals())
 -       return None
 - 
 -     bytes = [int(line[i:i+2], 16) for i in xrange(1, len(line), 2)]
 -     if bytes[0] != len(bytes) - 5:
 -       logging.info('Line %(line_number)d: invalid byte count' % locals())
 -       return None
 - 
 -     if sum(bytes) % 256 != 0:
 -       logging.info('Line %(line_number)d: corrupted line' % locals())
 -       return None
 - 
 -     if bytes[3] == 1:
 -       if bytes[0] != 0 or bytes[1] != 0 or bytes[2] != 0:
 -         logging.info('Line %(line_number)d: invalid end of file' % locals())
 -         return None
 -       else:
 -         break
 -     elif bytes[3] == 0:
 -       address = bytes[1] << 8 | bytes[2]
 -       padding_size = address + bytes[0] - len(data)
 -       if padding_size > 0:
 -         data += [0] * padding_size
 -       data[address:address + bytes[0]] = bytes[4:-1]
 -   return data
 - 
 - 
 - def WriteHexFile(data, file_object, chunk_size=32):
 -   """Writes a Hex file."""
 - 
 -   for address in xrange(0, len(data), chunk_size):
 -     chunk = data[address:address+chunk_size]
 -     chunk_len = len(chunk)
 -     address_l = address & 255
 -     address_h = address >> 8
 -     file_object.write(':%(chunk_len)02x%(address_h)02x%(address_l)02x00' % vars())
 -     file_object.write(''.join('%02x' % value for value in chunk))
 -     checksum = (-(chunk_len + address_l + address_h + sum(chunk))) & 255
 -     file_object.write('%02x\n' % checksum)
 -   file_object.write(':00000001FF\n')
 
 
  |