flash_cksum.tcl
来自「eCos操作系统源码」· TCL 代码 · 共 180 行
TCL
180 行
#!/bin/bash# restart using a Tcl shell \ exec sh -c 'for tclshell in tclsh tclsh83 cygtclsh80 ; do \ ( echo | $tclshell ) 2> /dev/null && exec $tclshell "`( cygpath -w \"$0\" ) 2> /dev/null || echo $0`" "$@" ; \ done ; \ echo "flash_cksum.tcl: cannot find Tcl shell" ; exit 1' "$0" "$@"#===============================================================================## flash_cksum.tcl## Compute the checksum for a AEB-1 flash module##===============================================================================#####ECOSGPLCOPYRIGHTBEGIN###### -------------------------------------------## This file is part of eCos, the Embedded Configurable Operating System.## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.#### eCos 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 2 or (at your option) any later version.#### eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.#### As a special exception, if other files instantiate templates or use macros## or inline functions from this file, or you compile this file and link it## with other works to produce a work based on this file, this file does not## by itself cause the resulting work to be covered by the GNU General Public## License. However the source code for this file must still be made available## in accordance with section (3) of the GNU General Public License.#### This exception does not invalidate any other reasons why a work based on## this file might be covered by the GNU General Public License.#### Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.## at http://sources.redhat.com/ecos/ecos-license/## -------------------------------------------#####ECOSGPLCOPYRIGHTEND#####===============================================================================######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_platformset byteOrder $tcl_platform(byteOrder)# puts "platform byte order = $byteOrder"# Parse command line argumentsset argc 0array 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]# }# Tcl up to at least version 8.3 has problems on alphas,# Tcl_FormatObjCmd() invokes Tcl_GetIntFromObj() which# ends up doing dodgy conversions between int and long.# This results in an error if bit 32 is set. Rewriting# the format string to output one byte at a time is# safer.# puts "[format 0x%8.8X $cksum]"puts [format "0x%02X%02X%02X%02X" \ [expr (($cksum >> 24) & 0x0FF)] \ [expr (($cksum >> 16) & 0x0FF)] \ [expr (($cksum >> 8) & 0x0FF)] \ [expr (($cksum ) & 0x0FF)]]
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?