Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/scripts/dtc/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 8 kB image not shown  

Quelle  dtx_diff   Sprache: Text

 
#! /bin/bash
SPDX-License-Identifier: GPL-2.0-only

Copyright (C) 2015 Frank Rowand
java.lang.NullPointerException


usage() {

 use spaces instead of tabs in the usage message
 cat >&2 <<eod

Usage:

   `basename $0` DTx
        decompile DTx

   `basename $0` DTx_1 DTx_2
        diff DTx_1 and DTx_2


      --annotate    synonym for -T
      --color       synonym for -c (requires diff with --color support)
       -c           enable colored output
       -f           print full dts in diff (--unified=99999)
       -h           synonym for --help
       -help        synonym for --help
      --help        print this message and exit
       -s SRCTREE   linux kernel source tree is at path SRCTREE
                        (default is current directory)
       -S           linux kernel source tree is at root of current git repo
       -T           annotate output .dts with input source file and line
                        (-T -T for more details)
       -u           unsorted, do not sort DTx


Each DTx is processed by the dtc compiler to produce a sorted dts source
file.  If DTx is a dts source file then it is pre-processed in the same
manner as done for the compile of the dts source file in the Linux kernel
build system ('#include' and '/include/' directives are processed).

If two DTx are provided, the resulting dts source files are diffed.

If DTx is a directory, it is treated as a DT subtree, such as
  /proc/device-tree.

If DTx contains the binary blob magic value in the first four bytes,
  it is treated as a binary blob (aka .dtb or FDT).

Otherwise DTx is treated as a dts source file (aka .dts).

   If this script is not run from the root of the linux source tree,
   and DTx utilizes '#include' or '/include/' then the path of the
   linux source tree can be provided by '-s SRCTREE' or '-S' so that
   include paths will be set properly.

   The shell variable \${ARCH} must provide the architecture containing
   the dts source file for include paths to be set properly for '#include'
   or '/include/' to be processed.

   If DTx_1 and DTx_2 are in different architectures, then this script
   may not work since \${ARCH} is part of the include path.  The following
   workaround can be used:

      `basename $0` ARCH=arch_of_dtx_1 DTx_1 >tmp_dtx_1.dts
      `basename $0` ARCH=arch_of_dtx_2 DTx_2 >tmp_dtx_2.dts
      `basename $0` tmp_dtx_1.dts tmp_dtx_2.dts
      rm tmp_dtx_1.dts tmp_dtx_2.dts

   If DTx_1 and DTx_2 are in different directories, then this script will
   add the path of DTx_1 and DTx_2 to the include paths.  If DTx_2 includes
   a local file that exists in both the path of DTx_1 and DTx_2 then the
   file in the path of DTx_1 will incorrectly be included.  Possible
   workaround:

      `basename $0` DTx_1 >tmp_dtx_1.dts
      `basename $0` DTx_2 >tmp_dtx_2.dts
      `basename $0` tmp_dtx_1.dts tmp_dtx_2.dts
      rm tmp_dtx_1.dts tmp_dtx_2.dts

eod
}


compile_to_dts() {

 dtx="$1"
 dtc_include="$2"

 if [ -d "${dtx}" ] ; then

  -----  input is file tree

  if ( ! ${DTC} -I fs ${dtx} ) ; then
   exit 3
  fi

 elif [ -f "${dtx}" ] && [ -r "${dtx}" ] ; then

  magic=`hexdump -n 4 -e '/1 "%02x"' ${dtx}`
  if [ "${magic}" = "d00dfeed" ] ; then

   -----  input is FDT (binary blob)

   if ( ! ${DTC} -I dtb ${dtx} ) ; then
    exit 3
   fi

   return

  fi

  -----  input is DTS (source)

  if ( cpp ${cpp_flags} -x assembler-with-cpp ${dtx} \
   | ${DTC} ${dtc_include} -I dts ) ; then
   return
  fi

  echo ""                                                      >&2
  echo "Possible hints to resolve the above error:"            >&2
  echo " (hints might not fix the problem)"                   >&2

  hint_given=0

  if [ "${ARCH}" = "" ] ; then
   hint_given=1
   echo ""                                              >&2
   echo " shell variable \$ARCH not set"               >&2
  fi

  dtx_arch=`echo "/${dtx}" | sed -e 's|.*/arch/||' -e 's|/.*||'`

  if [ "${dtx_arch}" != ""  -a "${dtx_arch}" != "${ARCH}" ] ; then
   hint_given=1
   echo ""                                              >&2
   echo " architecture ${dtx_arch} is in file path,"   >&2
   echo " but does not match shell variable \$ARCH"    >&2
   echo " >>\$ARCH<< is: >>${ARCH}<<"                  >&2
  fi

  if [ ! -d ${srctree}/arch/${ARCH} ] ; then
   hint_given=1
   echo ""                                              >&2
   echo " ${srctree}/arch/${ARCH}/ does not exist"     >&2
   echo " Is \$ARCH='${ARCH}' correct?"                >&2
   echo " Possible fix: use '-s' option"               >&2

   git_root=`git rev-parse --show-toplevel 2>/dev/null`
   if [ -d ${git_root}/arch/ ] ; then
    echo " Possible fix: use '-S' option"       >&2
   fi
  fi

  if [ $hint_given = 0 ] ; then
   echo ""                                              >&2
   echo " No hints available."                         >&2
  fi

  echo ""                                                      >&2

  exit 3

 else
  echo ""                                                     >&2
  echo "ERROR: ${dtx} does not exist or is not readable"      >&2
  echo ""                                                     >&2
  exit 2
 fi

}


-----  start of script

annotate=""
cmd_diff=0
diff_flags="-u"
diff_color=""
dtx_file_1=""
dtx_file_2=""
dtc_sort="-s"
help=0
srctree=""


while [ $-gt 0 ] ; do

 case $1 in

 -c | --color )
  if diff --color /dev/null /dev/null 2>/dev/null ; then
   diff_color="--color=always"
  fi
  shift
  ;;

 -f )
  diff_flags="--unified=999999"
  shift
  ;;

 -h | -help | --help )
  help=1
  shift
  ;;

 -s )
  srctree="$2"
  shift 2
  ;;

 -S )
  git_root=`git rev-parse --show-toplevel 2>/dev/null`
  srctree="${git_root}"
  shift
  ;;

 -T | --annotate )
  if [ "${annotate}"  = "" ] ; then
   annotate="-T"
  elif [ "${annotate}"  = "-T" ] ; then
   annotate="-T -T"
  fi
  shift
  ;;
 -u )
  dtc_sort=""
  shift
  ;;

 *)
  if [ "${dtx_file_1}"  = "" ] ; then
   dtx_file_1="$1"
  elif [ "${dtx_file_2}" = "" ] ; then
   dtx_file_2="$1"
  else
   echo ""                                             >&2
   echo "ERROR: Unexpected parameter: $1"              >&2
   echo ""                                             >&2
   exit 2
  fi
  shift
  ;;

 esac

done

if [ "${srctree}" = "" ] ; then
 srctree="."
fi

if [ "${dtx_file_2}" != "" ]; then
 cmd_diff=1
fi

if (( ${help} )) ; then
 usage
 exit 1
fi

this must follow check for ${help}
if [ "${dtx_file_1}" = "" ]; then
 echo ""                                                             >&2
 echo "ERROR: parameter DTx required"                                >&2
 echo ""                                                             >&2
 exit 2
fi


-----  prefer dtc from linux kernel, allow fallback to dtc in $PATH

if [ "${KBUILD_OUTPUT:0:2}" = ".." ] ; then
 __KBUILD_OUTPUT="${srctree}/${KBUILD_OUTPUT}"
elif [ "${KBUILD_OUTPUT}" = "" ] ; then
 __KBUILD_OUTPUT="."
else
 __KBUILD_OUTPUT="${KBUILD_OUTPUT}"
fi

DTC="${__KBUILD_OUTPUT}/scripts/dtc/dtc"

if [ ! -x ${DTC} ] ; then
 __DTC="dtc"
 if grep -q "^CONFIG_DTC=y" ${__KBUILD_OUTPUT}/.config 2>/dev/null; then
  make_command='
         make scripts'
 else
  make_command='
         Enable CONFIG_DTC in the kernel configuration
         make scripts'
 fi
 if ( ! which ${__DTC} >/dev/null ) ; then

  use spaces instead of tabs in the error message
  cat >&2 <<eod

ERROR: unable to find a 'dtc' program

   Preferred 'dtc' (built from Linux kernel source tree) was not found or
   is not executable.

      'dtc' is: ${DTC}

      If it does not exist, create it from the root of the Linux source tree:
${make_command}

      If not at the root of the Linux kernel source tree -s SRCTREE or -S
      may need to be specified to find 'dtc'.

      If 'O=\${dir}' is specified in your Linux builds, this script requires
      'export KBUILD_OUTPUT=\${dir}' or add \${dir}/scripts/dtc to \$PATH
      before running.

      If \${KBUILD_OUTPUT} is a relative path, then '-s SRCDIR', -S, or run
      this script from the root of the Linux kernel source tree is required.

   Fallback '${__DTC}' was also not in \${PATH} or is not executable.

eod
  exit 2
 fi
 DTC=${__DTC}
fi


-----  cpp and dtc flags same as for linux source tree build of .dtb files,
#        plus directories of the dtx file(s)

dtx_path_1_dtc_include="-i `dirname ${dtx_file_1}`"

dtx_path_2_dtc_include=""
if (( ${cmd_diff} )) ; then
 dtx_path_2_dtc_include="-i `dirname ${dtx_file_2}`"
fi

cpp_flags="\
 -nostdinc                                  \
 -I${srctree}/scripts/dtc/include-prefixes  \
 -undef -D__DTS__"

DTC="\
 ${DTC}                                     \
 -i ${srctree}/scripts/dtc/include-prefixes \
 -O dts -qq -f ${dtc_sort} ${annotate} -o -"


-----  do the diff or decompile

if (( ${cmd_diff} )) ; then

 diff ${diff_flags} ${diff_color} --label "${dtx_file_1}" --label "${dtx_file_2}" \
  <(compile_to_dts "${dtx_file_1}" "${dtx_path_1_dtc_include}") \
  <(compile_to_dts "${dtx_file_2}" "${dtx_path_2_dtc_include}")

else

 compile_to_dts "${dtx_file_1}" "${dtx_path_1_dtc_include}"

fi

92%


¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.