summaryrefslogtreecommitdiff
path: root/nuttx/tools/mkromfsimg.sh
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/tools/mkromfsimg.sh')
-rwxr-xr-xnuttx/tools/mkromfsimg.sh261
1 files changed, 261 insertions, 0 deletions
diff --git a/nuttx/tools/mkromfsimg.sh b/nuttx/tools/mkromfsimg.sh
new file mode 100755
index 000000000..5e742f47d
--- /dev/null
+++ b/nuttx/tools/mkromfsimg.sh
@@ -0,0 +1,261 @@
+#!/bin/bash
+############################################################################
+# tools/mkromfsimg.sh
+#
+# Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# 3. Neither the name NuttX nor the names of its contributors may be
+# used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+############################################################################
+
+# Environmental stuff
+
+wd=`pwd`
+workingdir=$wd/img
+rcsfile=rcS
+rcstemplate=$rcsfile.template
+romfsimg=romfs.img
+headerfile=nsh_romfsimg.h
+
+# Get the input parameters
+
+topdir=$1
+usage="USAGE: $0 <topdir>"
+
+if [ -z "$topdir" -o ! -d "$topdir" ]; then
+ echo "The full path to the NuttX base directory must be provided on the command line"
+ echo $usage
+ exit 1
+fi
+
+# Extract all values from the .config in the $topdir that contains all of the NuttX
+# configuration settings. The .config file was intended to be include-able by makefiles
+# and source-able by scripts. Unfortunately,there are too many syntactic differents
+# to make that practical
+
+if [ ! -r $topdir/.config ]; then
+ echo "No readable file at $topdir/.config"
+ echo "Has NuttX been configured?"
+ exit 1
+fi
+
+romfsetc=`grep CONFIG_EXAMPLES_NSH_ROMFSETC= $topdir/.config | cut -d'=' -f2`
+disablempt=`grep CONFIG_DISABLE_MOUNTPOINT= $topdir/.config | cut -d'=' -f2`
+disablescript=`grep CONFIG_EXAMPLES_NSH_DISABLESCRIPT= $topdir/.config | cut -d'=' -f2`
+ndescriptors=`grep CONFIG_NFILE_DESCRIPTORS= $topdir/.config | cut -d'=' -f2`
+devconsole=`grep CONFIG_DEV_CONSOLE= $topdir/.config | cut -d'=' -f2`
+romfs=`grep CONFIG_FS_ROMFS= $topdir/.config | cut -d'=' -f2`
+romfsmpt=`grep CONFIG_EXAMPLES_NSH_ROMFSMOUNTPT= $topdir/.config | cut -d'=' -f2`
+initscript=`grep CONFIG_EXAMPLES_NSH_INITSCRIPT= $topdir/.config | cut -d'=' -f2`
+romfsdevno=`grep CONFIG_EXAMPLES_NSH_ROMFSDEVNO= $topdir/.config | cut -d'=' -f2`
+romfssectsize=`grep CONFIG_EXAMPLES_NSH_ROMFSSECTSIZE= $topdir/.config | cut -d'=' -f2`
+fatfs=`grep CONFIG_FS_FAT= $topdir/.config | cut -d'=' -f2`
+fatdevno=`grep CONFIG_EXAMPLES_NSH_FATDEVNO= $topdir/.config | cut -d'=' -f2`
+fatsectsize=`grep CONFIG_EXAMPLES_NSH_FATSECTSIZE= $topdir/.config | cut -d'=' -f2`
+fatnsectors=`grep CONFIG_EXAMPLES_NSH_FATNSECTORS= $topdir/.config | cut -d'=' -f2`
+fatmpt=`grep CONFIG_EXAMPLES_NSH_FATMOUNTPT= $topdir/.config | cut -d'=' -f2`
+
+# The following settings are required for general ROMFS support
+#
+# Mountpoint support must be enabled
+
+if [ "X$disablempt" = "Xy" ]; then
+ echo "Mountpoint support is required for this feature"
+ echo "Set CONFIG_DISABLE_MOUNTPOINT=n to continue"
+ exit 1
+fi
+
+# Scripting support must be enabled
+
+if [ "X$disablescript" = "Xy" ]; then
+ echo "NSH scripting support is required for this feature"
+ echo "Set CONFIG_EXAMPLES_NSH_DISABLESCRIPT=n to continue"
+ exit 1
+fi
+
+# We need at least 2 file descriptors 1 for the ROMFS mount and one for
+# FAT mount performed in rcS. That still wouldn't be enough to to do much
+# with NSH
+
+if [ -z "$ndescriptors" -o "$ndescriptors" -lt 2 ]; then
+ echo "No file descriptors have been allocated"
+ if [ "X$devconsole" = "Xy" ]; then
+ echo "Set CONFIG_NFILE_DESCRIPTORS to value greater than 4"
+ else
+ echo "Set CONFIG_NFILE_DESCRIPTORS to value greater than 1"
+ fi
+ exit 1
+fi
+
+# If a console is enabled, then three more file descriptors are required
+# for stdin, stdout, and stderr
+
+if [ "X$devconsole" = "Xy" -a "$ndescriptors" -lt 5 ]; then
+ echo "Insufficient file descriptors have been allocated"
+ echo "Set CONFIG_NFILE_DESCRIPTORS to value greater than 4"
+fi
+
+# ROMFS support is required, of course
+
+if [ "X$romfs" != "Xy" ]; then
+ echo "ROMFS support is disabled in the NuttX configuration"
+ echo "Set CONFIG_FS_ROMFS=y to continue"
+ exit 0
+fi
+
+# The options in the default rcS.template also require FAT FS support
+
+if [ "X$fatfs" != "Xy" ]; then
+ echo "FAT FS support is disabled in the NuttX configuration"
+ echo "Set CONFIG_FS_FAT=y to continue"
+ exit 0
+fi
+
+# Verify that genromfs has been installed
+
+genromfs -h 1>/dev/null 2>&1 || { \
+ echo "Host executable genromfs not available in PATH"; \
+ echo "You may need to download in from http://romfs.sourceforge.net/"; \
+ exit 1; \
+}
+
+# Supply defaults for all un-defined ROMFS settings
+
+if [ -z "$romfsmpt" ]; then
+ romfsmpt="/etc"
+fi
+if [ -z "$initscript" ]; then
+ initscript="init.d/rcS"
+fi
+if [ -z "$romfsdevno" ]; then
+ romfsdevno=0
+fi
+if [ -z "$romfssectsize" ]; then
+ romfssectsize=64
+fi
+
+# Supply defaults for all un-defined FAT FS settings
+
+if [ -z "$fatdevno" ]; then
+ fatdevno=1
+fi
+if [ -z "$fatsectsize" ]; then
+ fatsectsize=512
+fi
+if [ -z "$fatnsectors" ]; then
+ fatnsectors=1024
+fi
+if [ -z "$fatmpt" ]; then
+ fatmpt="/tmp"
+fi
+
+# Verify the mountpoint. Verify that it is an absolute path but not /, /dev,
+# /., /./*, /.., or /../*
+
+if [ ${romfsmpt:0:1} != "\"" ]; then
+ echo "CONFIG_EXAMPLES_NSH_ROMFSMOUNTPT must be a string"
+ echo "Change it so that it is enclosed in quotes."
+ exit 1
+fi
+
+uromfsmpt=`echo $romfsmpt | sed -e "s/\"//g"`
+
+if [ ${uromfsmpt:0:1} != "/" ]; then
+ echo "CONFIG_EXAMPLES_NSH_ROMFSMOUNTPT must be an absolute path in the target FS"
+ echo "Change it so that it begins with the character '/'. Eg. /etc"
+ exit 1
+fi
+
+tmpdir=$uromfsmpt
+while [ ${tmpdir:0:1} == "/" ]; do
+ tmpdir=${tmpdir:1}
+done
+
+if [ -z "$tmpdir" -o "X$tmpdir" = "Xdev" -o "X$tmpdir" = "." -o \
+ ${tmpdir:0:2} = "./" -o "X$tmpdir" = ".." -o ${tmpdir:0:3} = "../" ]; then
+ echo "Invalid CONFIG_EXAMPLES_NSH_ROMFSMOUNTPT selection."
+ exit 1
+fi
+
+# Verify that the path to the init file is a relative path and not ., ./*, .., or ../*
+
+if [ ${initscript:0:1} != "\"" ]; then
+ echo "CONFIG_EXAMPLES_NSH_INITSCRIPT must be a string"
+ echo "Change it so that it is enclosed in quotes."
+ exit 1
+fi
+
+uinitscript=`echo $initscript | sed -e "s/\"//g"`
+
+if [ ${uinitscript:0:1} == "/" ]; then
+ echo "CONFIG_EXAMPLES_NSH_INITSCRIPT must be an relative path in under $romfsmpt"
+ echo "Change it so that it begins with the character '/'. Eg. init.d/rcS. "
+ exit 1
+fi
+
+if [ "X$uinitscript" = "." -o ${uinitscript:0:2} = "./" -o \
+ "X$uinitscript" = ".." -o ${uinitscript:0:3} = "../" ]; then
+ echo "Invalid CONFIG_EXAMPLES_NSH_INITSCRIPT selection. Must not begin with . or .."
+ exit 1
+fi
+
+# Create a working directory
+
+rm -rf $workingdir || { echo "Failed to remove the old $workingdir"; exit 1; }
+mkdir -p $workingdir || { echo "Failed to created the new $workingdir"; exit 1; }
+
+# Create the rcS file from the rcS.template
+
+if [ ! -r $rcstemplate ]; then
+ echo "$rcstemplete does not exist"
+ rmdir $workingdir
+ exit 1
+fi
+
+cat $rcstemplate | \
+ sed -e "s,XXXMKRDMINORXXX,$fatdevno,g" | \
+ sed -e "s,XXMKRDSECTORSIZEXXX,$fatsectsize,g" | \
+ sed -e "s,XXMKRDBLOCKSXXX,$fatnsectors,g" | \
+ sed -e "s,XXXRDMOUNTPOUNTXXX,$fatmpt,g" >$rcsfile
+
+# And install it at the specified relative location
+
+install -D --mode=0755 $rcsfile $workingdir/$uinitscript || \
+ { echo "Failed to install $rcsfile at $workingdir/$uinitscript"; rm -f $rcsfile; exit 1; }
+rm -f $rcsfile
+
+# Now we are ready to make the ROMFS image
+
+genromfs -f $romfsimg -d $workingdir -V "NSHInitVol" || { echo "genromfs failed" ; exit 1 ; }
+rm -rf $workingdir || { echo "Failed to remove the old $workingdir"; exit 1; }
+
+# And, finally, create the header file
+
+xxd -i $romfsimg >$headerfile || { echo "xxd of $< failed" ; rm -f $romfsimg; exit 1 ; }
+rm -f $romfsimg