nbtevo-system-dump/sda0/bin/create_sdc.sh
2025-06-09 15:07:26 +02:00

528 lines
14 KiB
Bash

#!/bin/ksh
# ----------------------------------------------------------------------
# Project : Harman Car Multimedia System
# Harman/becker Automotive Systems GmbH
# All rights reserved
#
# File : NAND Management Script
# Author : SPreuss
# ----------------------------------------------------------------------
CDIR=$PWD
VERSION=V2.1.2
SDA0_DEVICE=/dev/sda0
SDA1_DEVICE=/dev/sda1
DEVICE=$SDA0_DEVICE
rRETVAL=0
QUITE=0
cd ${0%/*}
export PATH=$PATH:$PWD
cd $CDIR
LOG=/dev/ser1
if [[ ! -e $LOG ]]; then
LOG=/dev/console
fi
NUM_CYLINDERS=$(fdisk $DEVICE query -T)
echo "Found NAND with $NUM_CYLINDERS cylinders!"
# calculate partition sizes
SIZE_FAT_BOOT=32
SIZE_RAW_BOOT=16
SIZE_QNX_APPL=6500
SIZE_QNX_BOLO=200
SIZE_QNX_PERS=$(($NUM_CYLINDERS-$SIZE_FAT_BOOT-2*$SIZE_RAW_BOOT-$SIZE_QNX_APPL-2*$SIZE_QNX_BOLO))
SIZE_EXT_PART=$(($SIZE_QNX_APPL+2*$SIZE_QNX_BOLO+$SIZE_QNX_PERS))
# notes: ext: != 0 add partition to extended partition of specifed slot
# == 0 add partition as primary partition in specified slot
# mount pt: none don't mount this partition
# /fs/sdaX mount partition to specified mount point
# size: != 0 size of the partition
# == 0 size size is been filled up to the rest of the partition table
# option: boot format and mount fs as FAT16 and set partition as boot partition
# dos format and mount fs as FAT16
# fat16 format and mount fs as FAT16
# fat32 format and mount fs as FAT32
# qnx6 format and mount fs as QNX6
# ext mark partition as extended partition (no format and/or mount)
# raw mark partition as raw partition (no format and/or mount)
# type slot ext mount pt mode size option inodes
DEF_BOOT=" 4 1 0 /fs/sda2 ro $SIZE_FAT_BOOT boot default"
DEF_EXT=" 15 2 0 none ro $SIZE_EXT_PART ext default"
DEF_APPL=" 179 2 1 /fs/sda0 ro $SIZE_QNX_APPL qnx6 95000"
DEF_BOLO1=" 177 2 2 /fs/sda31 ro $SIZE_QNX_BOLO qnx6 default"
DEF_BOLO2=" 180 2 3 /fs/sda32 ro $SIZE_QNX_BOLO qnx6 default"
DEF_PERS=" 178 2 4 /fs/sda1 rw $SIZE_QNX_PERS qnx6 default"
DEF_BOOT1=" 101 3 0 none ro $SIZE_RAW_BOOT raw default"
DEF_BOOT2=" 102 4 0 none ro $SIZE_RAW_BOOT raw default"
ALL_PARTITIONS="$DEF_BOOT $DEF_EXT $DEF_APPL $DEF_BOLO1 $DEF_BOLO2 $DEF_PERS $DEF_BOOT1 $DEF_BOOT2"
VAR_DIRS="log dump opt/car opt/conn opt/hmi opt/mm opt/nav opt/speech opt/sys"
debug_msg()
{
if [[ $QUITE -eq 0 ]]; then
echo "$*"
fi
}
kPartitionSdc()
{
rSTAT=0
rDEVICE=$1
shift
# test if we are running in emergency mode.
if [[ -e /dev/starter ]] ; then
echo "ERROR: To initalize the NAND Flash you need to boot into emergency IFS."
rSTAT=$((rSTAT + 1))
return $rSTAT;
fi
# test if partition is called with specific partition parameter.
if [[ -n $PARTITION ]] ; then
echo "ERROR: To repartition the NAND Flash you must not use the -p parameter!"
rSTAT=$((rSTAT + 1))
return $rSTAT;
fi
debug_msg "fdisk $rDEVICE delete -a"
fdisk $rDEVICE delete -a || rSTAT=$((rSTAT + 1))
while [[ $# -gt 0 ]]
do
rTYPE=$1
rSLOT=$2
rEXT=$3
rMP=$4
rMODE=$5
rSIZE=$6
rOPTION=$7
shift; shift; shift; shift; shift; shift; shift; shift
if [[ $rEXT -ne 0 ]]; then
if [[ $rSIZE -ne 0 ]]; then
debug_msg "fdisk $rDEVICE add -t $rTYPE -s $rSLOT -e $rEXT -n $rSIZE"
fdisk $rDEVICE add -t $rTYPE -s $rSLOT -e $rEXT -n $rSIZE || rSTAT=$((rSTAT + 1))
else
debug_msg "fdisk $rDEVICE add -t $rTYPE -s $rSLOT -e $rEXT"
fdisk $rDEVICE add -t $rTYPE -s $rSLOT -e $rEXT || rSTAT=$((rSTAT + 1))
fi
else
if [[ $rSIZE -ne 0 ]]; then
debug_msg "fdisk $rDEVICE add -t $rTYPE -s $rSLOT -n $rSIZE"
fdisk $rDEVICE add -t $rTYPE -s $rSLOT -n $rSIZE || rSTAT=$((rSTAT + 1))
else
debug_msg "fdisk $rDEVICE add -t $rTYPE -s $rSLOT"
fdisk $rDEVICE add -t $rTYPE -s $rSLOT || rSTAT=$((rSTAT + 1))
fi
fi
if [[ $rOPTION == "boot" ]]; then
debug_msg "fdisk $rDEVICE boot -t $rTYPE"
fdisk $rDEVICE boot -t $rTYPE
fi
done
fdisk $rDEVICE show || rSTAT=$((rSTAT + 1))
mount -e $rDEVICE || rSTAT=$((rSTAT + 1))
return $rSTAT
}
kFormatSdc()
{
rBS=4096
rSTAT=0
rDEVICE=$1
shift
while [[ $# -gt 0 ]]
do
rTYPE=$1
rSLOT=$2
rEXT=$3
rMP=$4
rMODE=$5
rSIZE=$6
rOPTION=$7
rINODES=""
if [[ $8 != "default" ]]; then
rINODES="-i $8"
fi
shift; shift; shift; shift; shift; shift; shift; shift
if [[ $rOPTION == "boot" || $rOPTION == "dos" || $rOPTION == "fat16" ]]; then
debug_msg "mkdosfs -e32 -F16 -c$rBS ${rDEVICE}t$rTYPE"
mkdosfs -e32 -F16 -c$rBS ${rDEVICE}t$rTYPE || rSTAT=$((rSTAT + 1))
elif [[ $rOPTION == "fat32" ]]; then
debug_msg "mkdosfs -F32 -c$rBS ${rDEVICE}t$rTYPE"
mkdosfs -F32 -c$rBS ${rDEVICE}t$rTYPE || rSTAT=$((rSTAT + 1))
elif [[ $rOPTION == "qnx6" ]]; then
whence wipe > /dev/null
if [[ $? -eq 0 ]]; then
debug_msg "discard partition ${rDEVICE}t$rTYPE before formation."
wipe -i -me -sp ${rDEVICE}t$rTYPE
fi
debug_msg "mkqnx6fs -q -b$rBS $rINODES ${rDEVICE}t$rTYPE"
mkqnx6fs -q -b$rBS $rINODES ${rDEVICE}t$rTYPE || rSTAT=$((rSTAT + 1))
fi
done
return $rSTAT
}
kMountSdc()
{
rSTAT=0
rDEVICE=$1
shift
while [[ $# -gt 0 ]]
do
rTYPE=$1
rSLOT=$2
rEXT=$3
rMP=$4
rMODE=$5
rSIZE=$6
rOPTION=$7
shift; shift; shift; shift; shift; shift; shift; shift
if [[ $rOPTION == "boot" || $rOPTION == "dos" || $rOPTION == "fat16" || $rOPTION == "fat32" ]]; then
debug_msg "mount -t dos -o $rMODE ${rDEVICE}t$rTYPE $rMP"
mount -t dos -o $rMODE ${rDEVICE}t$rTYPE $rMP || rSTAT=$((rSTAT + 1))
elif [[ $rOPTION == "qnx6" ]]; then
debug_msg "mount -t qnx6 -o $rMODE ${rDEVICE}t$rTYPE $rMP"
mount -t qnx6 -o $rMODE ${rDEVICE}t$rTYPE $rMP || rSTAT=$((rSTAT + 1))
fi
done
return $rSTAT
}
kUmountSdc()
{
rSTAT=0
rDEVICE=$1
shift
# test if we are running in emergency mode.
if [[ -e /dev/starter ]] ; then
echo "ERROR: Unmounting in application or bootloader mode is no good idea. ;-)"
rSTAT=$((rSTAT + 1))
return $rSTAT;
fi
while [[ $# -gt 0 ]]
do
rTYPE=$1
rSLOT=$2
rEXT=$3
rMP=$4
rMODE=$5
rSIZE=$6
rOPTION=$7
shift; shift; shift; shift; shift; shift; shift; shift
if [[ $rMP != "none" ]]; then
if [[ -e $rMP ]]; then
debug_msg "umount -f $rMP"
umount -f $rMP || rSTAT=$((rSTAT + 1))
else
echo "mountpoint $rMP not available"
fi
fi
done
return $rSTAT
}
kRemountSdc()
{
rSTAT=0
rNEW_MODE=$1
shift
while [[ $# -gt 0 ]]
do
rTYPE=$1
rSLOT=$2
rEXT=$3
rMP=$4
rMODE=$5
rSIZE=$6
rOPTION=$7
shift; shift; shift; shift; shift; shift; shift; shift
if [[ $rMP != "none" ]]; then
if [[ -e $rMP ]] ; then
if [[ $rNEW_MODE != "default" ]] ; then
rMODE=$rNEW_MODE
fi
debug_msg "mount -u -o $rMODE $rMP"
mount -u -o $rMODE $rMP || rSTAT=$((rSTAT + 1))
fi
fi
done
return $rSTAT
}
kDirectoriesSdc()
{
rSTAT=0
rCURRDIR=$PWD
rDEVICE=$1
shift
while [[ $# -gt 0 ]]
do
rTYPE=$1
rSLOT=$2
rEXT=$3
rMP=$4
rMODE=$5
rSIZE=$6
rOPTION=$7
shift; shift; shift; shift; shift; shift; shift; shift
mount -u -o rw $rMP
cd $rMP
for rDIR in $VAR_DIRS
do
debug_msg "mkdir $rMP/$rDIR"
mkdir -p $rDIR || rSTAT=$((rSTAT + 1))
done
mount -u -o $rMODE $rMP
done
cd $rCURRDIR
return $rSTAT
}
kChkfs()
{
rSTAT=0
rDEVICE=$1
shift
while [[ $# -gt 0 ]]
do
rTYPE=$1
rSLOT=$2
rEXT=$3
rMP=$4
rMODE=$5
rSIZE=$6
rOPTION=$7
shift; shift; shift; shift; shift; shift; shift; shift
if [[ $rOPTION == "boot" || $rOPTION == "dos" || $rOPTION == "fat16" || $rOPTION == "fat32" ]]; then
debug_msg "chkdosfs -un ${rDEVICE}t$rTYPE"
chkdosfs -un ${rDEVICE}t$rTYPE || rSTAT=$((rSTAT + 1))
elif [[ $rOPTION == "qnx6" ]]; then
if [[ $rTYPE == 181 && ! -e /dev/sda0t181 ]] ; then
echo "WARNING: BD persistence is missing, please update your partition table!"
else
debug_msg "chkqnx6fs -vvv ${rDEVICE}t$rTYPE"
chkqnx6fs -svvv ${rDEVICE}t$rTYPE || rSTAT=$((rSTAT + 1))
chkqnx6fs -vvv ${rDEVICE}t$rTYPE || rSTAT=$((rSTAT + 1))
fi
fi
done
if [ $rSTAT -ne 0 ] ; then
echo "ERROR: while checking file systems!"
else
echo "SUCCESS: checking file systems finished!"
fi
return $rSTAT
}
kPrintPartitionTabel()
{
CURRENT_PART_TAB=$(fdisk /dev/sda0 show) || rSTAT=$((rSTAT + 1))
echo "$CURRENT_PART_TAB"
return $rSTAT
}
kHelp()
{
echo "Usage $0 [-d <device_num>] [-p <partition>] [-c <command> [-c <command>] ...]"
echo " [-i] [-f] [-m] [-r] [-w] [-R] [-u] [-q] [-P]"
echo " -d <device_num> set device (default: 0 (for /dev/sda0))"
echo " -p <partition> set specific partition (default: all partitions)"
echo " valid partitions: boot appl bolo1 bolo2 pers boot1 boot2"
echo " -i initalize the NAND flash: create partiton table, make filesystems and add domain directories."
echo " -I <partition> initalize one partiton, make filesystems and add domain directories."
echo " -f check nand file systems"
echo " -m mount all partitons"
echo " -r remount all partitons read only"
echo " -P print the partition table"
echo " -w remount all partitons read and write"
echo " -R remount all partitons in default mode"
echo " -u umount all partitons"
echo " -q quite no messages except errors."
echo " -h print this help screen"
echo " -c <command>"
echo " valid commands:"
echo " ==============="
echo " partition: create partiton table"
echo " format: make filesystems"
echo " mount: mount filesystems"
echo " umount: umount filesystems"
echo " remount_r: remount filesystems read only"
echo " remount_w: remount filesystems read and write"
echo " remount: remount filesystems in default mode"
echo " directories: make domain directories on certain filesystems"
echo " chkfs: checks the qnx6 file system"
echo " help: print this help screen"
echo " Commands are executed in the order specified on the command line."
echo " Examples:"
echo " $0 -c umount -c partition -c format -c mount -c directories"
echo " $0 -p pers -c format -c mount -c directories"
echo
}
COMMANDLIST=""
# if there are no arguments
if [[ $# -lt 1 ]] ; then
kHelp
exit 0
fi
# parse command line
while getopts "d:p:c:PRrvwfumiI:hq" OPTION
do
case $OPTION in
d)
if [[ $OPTARG -eq 1 ]] ; then
DEVICE=$SDA1_DEVICE
elif [[ $OPTARG -eq 0 ]] ; then
DEVICE=$SDA0_DEVICE
else
echo "ERROR: Invalid device id! Only [0|1] is valid!"
exit 1
fi
echo "INFO: Set device to $DEVICE!"
;;
p)
typeset -u ARG=$OPTARG
eval "PARTITION=\$DEF_$ARG"
if [[ -z $PARTITION ]] ; then
echo "ERROR: Invalid partition specified!"
exit 1
fi
;;
f)
COMMANDLIST="remount_r chkfs remount"
;;
i)
COMMANDLIST="umount partition format mount directories"
;;
I)
typeset -u ARG=$OPTARG
eval "PARTITION=\$DEF_$ARG"
if [[ -z $PARTITION ]] ; then
echo "ERROR: Invalid partition specified!"
exit 1
fi
COMMANDLIST="umount format mount directories"
;;
u)
COMMANDLIST="umount"
;;
m)
COMMANDLIST="mount"
;;
R)
COMMANDLIST="remount"
;;
r)
COMMANDLIST="remount_r"
;;
P)
COMMANDLIST="print_parttab"
;;
w)
COMMANDLIST="remount_w"
;;
c)
COMMANDLIST="$COMMANDLIST $OPTARG"
;;
q)
QUITE=1
;;
h | *)
kHelp
exit 0
;;
esac
done
debug_msg "-------------------------"
debug_msg "$0 $VERSION"
debug_msg "-------------------------"
if [[ -n $PARTITION ]] ; then
PATITIONS_TO_PROCESS=$PARTITION
else
PATITIONS_TO_PROCESS=$ALL_PARTITIONS
fi
for COMMAND in $COMMANDLIST
do
if [[ $COMMAND == partition ]]; then
kPartitionSdc $DEVICE $PATITIONS_TO_PROCESS
rRETVAL=$((rRETVAL + $?))
fi
if [[ $COMMAND == format ]]; then
kFormatSdc $DEVICE $PATITIONS_TO_PROCESS
rRETVAL=$((rRETVAL + $?))
fi
if [[ $COMMAND == mount ]]; then
kMountSdc $DEVICE $PATITIONS_TO_PROCESS
rRETVAL=$((rRETVAL + $?))
fi
if [[ $COMMAND == umount ]]; then
kUmountSdc $DEVICE $PATITIONS_TO_PROCESS
rRETVAL=$((rRETVAL + $?))
fi
if [[ $COMMAND == remount ]]; then
kRemountSdc default $PATITIONS_TO_PROCESS
rRETVAL=$((rRETVAL + $?))
fi
if [[ $COMMAND == remount_r ]]; then
kRemountSdc ro $PATITIONS_TO_PROCESS
rRETVAL=$((rRETVAL + $?))
fi
if [[ $COMMAND == remount_w ]]; then
kRemountSdc rw $PATITIONS_TO_PROCESS
rRETVAL=$((rRETVAL + $?))
fi
if [[ $COMMAND == directories ]]; then
kDirectoriesSdc $DEVICE $DEF_PERS
rRETVAL=$((rRETVAL + $?))
fi
if [[ $COMMAND == chkfs ]]; then
kChkfs $DEVICE $PATITIONS_TO_PROCESS
rRETVAL=$((rRETVAL + $?))
fi
if [[ $COMMAND == print_parttab ]]; then
kPrintPartitionTabel
rRETVAL=$((rRETVAL + $?))
fi
if [[ $COMMAND == help ]]; then
kHelp
fi
if [[ $rRETVAL -ne 0 ]]; then
echo "ERROR: $0 failed!"
exit $rRETVAL
fi
done
debug_msg "SUCCESS: $0 finished!"
exit $rRETVAL