|  | @@ -1,17 +1,17 @@
 | 
	
		
			
				|  |  | -# mk_update.py <bootloader> <main_firmware> <output> <stm_type>
 | 
	
		
			
				|  |  | +# mk_update.py <bootloader> <main_firmware> <output> <stm_model>
 | 
	
		
			
				|  |  |  #
 | 
	
		
			
				|  |  |  # Convert a raw firmware binary into an update file for our bootloader.
 | 
	
		
			
				|  |  |  #
 | 
	
		
			
				|  |  |  # Update Format (Little endian, unless otherwise stated):
 | 
	
		
			
				|  |  |  #   Catalogue Header:
 | 
	
		
			
				|  |  |  #     2 bytes: <length> (excludes Catalogue Header)
 | 
	
		
			
				|  |  | -#     2 bytes: <hw_type>
 | 
	
		
			
				|  |  | +#     2 bytes: <hw_model>
 | 
	
		
			
				|  |  |  #   Payload:
 | 
	
		
			
				|  |  |  #     N bytes: <raw binary data>
 | 
	
		
			
				|  |  |  #   Footer:
 | 
	
		
			
				|  |  |  #     2 bytes: 'GW' or 'BL'
 | 
	
		
			
				|  |  |  #     2 bytes: major, minor
 | 
	
		
			
				|  |  | -#     2 bytes: <hw_type>
 | 
	
		
			
				|  |  | +#     2 bytes: <hw_model>
 | 
	
		
			
				|  |  |  #     2 bytes: CRC16-CCITT, seed 0xFFFF (big endian, excludes Catalogue Header)
 | 
	
		
			
				|  |  |  #
 | 
	
		
			
				|  |  |  # Written & released by Keir Fraser <keir.xen@gmail.com>
 | 
	
	
		
			
				|  | @@ -24,14 +24,14 @@ import re, struct, sys
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from greaseweazle import version
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -def mk_cat_entry(dat, hw_type, sig):
 | 
	
		
			
				|  |  | +def mk_cat_entry(dat, hw_model, sig):
 | 
	
		
			
				|  |  |      max_kb = { 1: { b'BL':  8, b'GW': 56 },
 | 
	
		
			
				|  |  |                 7: { b'BL': 16, b'GW': 48 } }
 | 
	
		
			
				|  |  |      dlen = len(dat)
 | 
	
		
			
				|  |  |      assert (dlen & 3) == 0, "input is not longword padded"
 | 
	
		
			
				|  |  | -    assert dlen <= max_kb[hw_type][sig]*1024, "input is too long"
 | 
	
		
			
				|  |  | -    header = struct.pack("<2H", dlen + 8, hw_type)
 | 
	
		
			
				|  |  | -    footer = struct.pack("<2s2BH", sig, version.major, version.minor, hw_type)
 | 
	
		
			
				|  |  | +    assert dlen <= max_kb[hw_model][sig]*1024, "input is too long"
 | 
	
		
			
				|  |  | +    header = struct.pack("<2H", dlen + 8, hw_model)
 | 
	
		
			
				|  |  | +    footer = struct.pack("<2s2BH", sig, version.major, version.minor, hw_model)
 | 
	
		
			
				|  |  |      crc16 = crcmod.predefined.Crc('crc-ccitt-false')
 | 
	
		
			
				|  |  |      crc16.update(dat)
 | 
	
		
			
				|  |  |      crc16.update(footer)
 | 
	
	
		
			
				|  | @@ -40,11 +40,11 @@ def mk_cat_entry(dat, hw_type, sig):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  def main(argv):
 | 
	
		
			
				|  |  |      out_f = open(argv[3], "wb")
 | 
	
		
			
				|  |  | -    hw_type = int(re.match("f(\d)", argv[4]).group(1))
 | 
	
		
			
				|  |  | +    hw_model = int(re.match("f(\d)", argv[4]).group(1))
 | 
	
		
			
				|  |  |      with open(argv[2], "rb") as gw_f:
 | 
	
		
			
				|  |  | -        out_f.write(mk_cat_entry(gw_f.read(), hw_type, b'GW'))
 | 
	
		
			
				|  |  | +        out_f.write(mk_cat_entry(gw_f.read(), hw_model, b'GW'))
 | 
	
		
			
				|  |  |      with open(argv[1], "rb") as bl_f:
 | 
	
		
			
				|  |  | -        out_f.write(mk_cat_entry(bl_f.read(), hw_type, b'BL'))
 | 
	
		
			
				|  |  | +        out_f.write(mk_cat_entry(bl_f.read(), hw_model, b'BL'))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  if __name__ == "__main__":
 | 
	
		
			
				|  |  |      main(sys.argv)
 |