Mercurial > nand-ecoscentric
diff packages/hal/arm/aeb/current/misc/flash_cksum.tcl @ 2:443894e2e912 ecos-v1_2_1-release
Block commit of eCos version 1.2.1
| author | jlarmour |
|---|---|
| date | Tue, 11 May 1999 12:24:34 +0000 |
| parents | |
| children | c38311975d4f |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/hal/arm/aeb/current/misc/flash_cksum.tcl @@ -0,0 +1,140 @@ +#!/bin/sh +# the next line restarts using tclsh \ + exec tclsh "$0" ${1+"$@"} + +#=============================================================================== +# +# flash_cksum.tcl +# +# Compute the checksum for a AEB-1 flash module +# +#=============================================================================== +#####COPYRIGHTBEGIN#### +# +# Copyright (c) 1999 Cygnus Solutions +# +# This is copyrighted software that may only +# be reproduced, modified, or distributed +# under license from Cygnus Solutions. +# +#####COPYRIGHTEND#### +#=============================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): gthomas +# Contact(s): gthomas +# Date: 1999/01/06 +# Version: 0.01 $RcsVersion$ +# Purpose: Compute the checksum for a FLASH ROM module. +# Description: +# Requires: A working Tcl interpreter, V8.0 or later. +# Provides: Command line operation only. +# Inputs: +# Side FX: +# Outputs: +# See also: 'Notes' which describes the process of creating the GDB stubs +# module. +# Known bugs: +# Usage: +# +#####DESCRIPTIONEND#### +#=============================================================================== + +# +# This ckecksum is the 32-bit XOR of all 32 bit words in the file. +# The output of the program is a single number, suitable for use in +# a Makefile/script used to create an AEB-1 module for FLASH ROM. +# + +proc checksum { name } { + + set status [ catch { + set fd [open $name "r"] + fconfigure $fd -translation binary + set data [read $fd] + close $fd + } message] + + if { $status != 0 } { + puts "Unable to read file $name: $message" + exit 1 + } + + set sum 0 + set length [string length $data] + for { set i 0 } { $i < $length } { incr i 4 } { + # Fetch the next 32 bit word. The funky tests are to handle the case + # of zero bytes. + set char0 [string index $data [expr $i + 0]] + if { "$char0" != "" } { + scan $char0 "%c" ascii0 + } else { + set ascii0 0 + } + set char1 [string index $data [expr $i + 1]] + if { "$char1" != "" } { + scan $char1 "%c" ascii1 + } else { + set ascii1 0 + } + set char2 [string index $data [expr $i + 2]] + if { "$char2" != "" } { + scan $char2 "%c" ascii2 + } else { + set ascii2 0 + } + set char3 [string index $data [expr $i + 3]] + if { "$char3" != "" } { + scan $char3 "%c" ascii3 + } else { + set ascii3 0 + } + set word [expr $ascii0 << 24] + set word [expr $word | [expr $ascii1 << 16]] + set word [expr $word | [expr $ascii2 << 8]] + set word [expr $word | $ascii3] + set sum [expr $sum ^ $word] + # puts "sum: [format %8.8X $sum], word: [format %8.8X $word]" + } + + return $sum +} + +proc bswap { native } { + set byte0 [expr [expr $native >> 24] & 255] + set byte1 [expr [expr $native >> 16] & 255] + set byte2 [expr [expr $native >> 8] & 255] + set byte3 [expr [expr $native >> 0] & 255] + set swapped [expr $byte3 << 24] + set swapped [expr $swapped | [expr $byte2 << 16]] + set swapped [expr $swapped | [expr $byte1 << 8]] + set swapped [expr $swapped | [expr $byte0 << 0]] + # puts "native: [format %8.8X $native], swapped: [format %8.8X $swapped]" + return $swapped +} + +global tcl_platform +set byteOrder $tcl_platform(byteOrder) +# puts "platform byte order = $byteOrder" + +# Parse command line arguments +set argc 0 +array set args { } +foreach arg $argv { + set args([incr argc]) $arg +} + +if { "$argc" != "1" } { + puts "usage: flash_cksum <file>" + exit 1 +} + +set cksum [checksum $args(1)] + +# if { "$byteOrder" == "littleEndian" } { + # puts "Swap bytes!" + set cksum [bswap $cksum] +# } + +puts "[format 0x%8.8X $cksum]" +
