add script to verify and write NXP LCP13xx firmware checksums
This commit is contained in:
parent
0c447df7b0
commit
c0ee3dc8b9
|
@ -0,0 +1,72 @@
|
|||
#!/usr/bin/env ruby
|
||||
# encoding: utf-8
|
||||
# ruby: 1.9.3
|
||||
=begin
|
||||
this script verifies and writes the checksum for NXP LPC13xx firmwares.
|
||||
for more information about how it is calculated refer to document UM10375 section 21.7 Criterion for Valid User Code
|
||||
=end
|
||||
|
||||
def help
|
||||
puts "usage: #{__FILE__} [operation] file"
|
||||
puts "operations:"
|
||||
puts "\t-v,--verify\tverify checksum (default)"
|
||||
puts "\t-w,--write\twrite checksum"
|
||||
puts "file: LPC13xx firmware"
|
||||
end
|
||||
|
||||
puts "LPC13xx firmware checksum verifier and writer"
|
||||
|
||||
# should the checksum be written
|
||||
write = false
|
||||
file = nil
|
||||
|
||||
if ARGV.size==1 then
|
||||
file = ARGV[0]
|
||||
elsif ARGV.size==2 then
|
||||
case ARGV[0]
|
||||
when "-h","--help"
|
||||
help
|
||||
exit 0
|
||||
when "-v","--verify"
|
||||
# this is done per default
|
||||
when "-w","--write"
|
||||
write = true
|
||||
else
|
||||
help
|
||||
exit 0
|
||||
end
|
||||
file = ARGV[1]
|
||||
else
|
||||
help
|
||||
exit 0
|
||||
end
|
||||
|
||||
raise "#{file} is not a file" unless File.file? file
|
||||
raise "#{file} is too short" if File.size(file)<4*8
|
||||
|
||||
firmware = File.open(file,"r+") # open file
|
||||
header = firmware.read(4*7).unpack("l*") # read the 7 first words (of 32 bits) to checksum
|
||||
checksum = firmware.read(4).unpack("l*")[0]&0xffffffff # read the current checksum (8th word)
|
||||
|
||||
# calculate the correct checksum
|
||||
sum = 0
|
||||
header.each do |word|
|
||||
sum += word
|
||||
sum &= 0xffffffff
|
||||
end
|
||||
correct = ((~sum)+1)&0xffffffff # the 2's complement
|
||||
|
||||
puts "current checksum: 0x%08x" % checksum
|
||||
puts "correct checksum: 0x%08x" % correct
|
||||
if checksum==correct then
|
||||
puts "checksum matches"
|
||||
else
|
||||
puts "checksum does not match"
|
||||
if write then
|
||||
firmware.seek(4*7,:SET)
|
||||
firmware.write([correct].pack("l"))
|
||||
puts "checksum written"
|
||||
end
|
||||
end
|
||||
firmware.close
|
||||
|
Loading…
Reference in New Issue