1
1
Files
zyxel-vmg8825_b50b-cfw/target/linux/brcm963xx/image/buildUBI
T
2026-04-17 18:33:03 +02:00

196 lines
6.5 KiB
Bash
Executable File

#!/bin/bash
# pass this script the UBI .ini filename, metadata location, the binary to generate, the files to add to the binary,
# and if applicable the rootfs filesystem
# for example:
# $PROFILE_DIR/../buildUBI $PROFILE_DIR/ubi_full.ini $TARGET_FS/../metadata.bin $PROFILE_DIR/filestruct.bin $TARGET_BOOTFS $PROFILE_DIR/rootfs.ubifs
# passing directory/* for some reason passes each file into $1, $2 etc.
# This is a sequence of records which may be aligned with padding, each contains the following in this order:
# 1. 32-bit offset within volume to next record, big endian, referenced from byte following this pointer (points to #10)
# 2. 32-bit offset to entry data, big endian, referenced from byte following this pointer (points to #7)
# 3. 32-bit entry data length (length of #7) big endian
# 4. 32-bit CRC of the above header (#1 - #3)
# 5. Filename - null terminated
# 6. Padding (if desired to align data)
# 7. Data (8-byte aligned if desired)
# 8. 32-bit CRC of the entry (covers items #5 - #7)
# 9. Padding (to next record if desired for alignment)
# 10. Next entry (same as item 1)
# 11. (Same as #2)
# 12. (etc.)
# volume IDs
####################################################
#define VOLID_METADATA 1
#define VOLID_METADATA_COPY 2
# UBIFILES are CFERAM and/or VMLINUX in blob format
#define VOLID_UBIFILES 10
#define VOLID_UBIFS 0
set -x
# subroutines
append_file_struct() # push TEMP file plus CRC into blob, and TEMP2 file plus CRC into blob
{ # $1 if the first passed parameter
PUSHFILE=$1
SIZE=`stat -c%s "$PROFILE_DIR/TEMP2"`+12+4 # pointer to next entry, file size plus header (minus this pointer itself) + CRC
FILEPOINT=`echo $SIZE | bc`
printf "%.8x" $FILEPOINT | xxd -r -p > $PROFILE_DIR/TEMP3 # put pointer to data first
cat $PROFILE_DIR/TEMP >> $PROFILE_DIR/TEMP3 # rest of header next
CRC32=`$HOSTTOOLS_DIR/gencrc32 $PROFILE_DIR/TEMP3` # calculate CRC on whole header
printf "%.8x" $CRC32 | xxd -r -p >> $PROFILE_DIR/TEMP3 # append CRC
cat $PROFILE_DIR/TEMP3 >> $PUSHFILE
CRC32=`$HOSTTOOLS_DIR/gencrc32 $PROFILE_DIR/TEMP2` # calculate CRC on entry
printf "%.8x" $CRC32 | xxd -r -p >> $PROFILE_DIR/TEMP2 # append CRC
cat $PROFILE_DIR/TEMP2 >> $PUSHFILE
};
# start, grab input parameters
while getopts "u:m:f:t:y:s:" opt; do
case "$opt" in
u)
UBI_INI=$OPTARG
;;
m)
METADATA=$OPTARG
;;
f)
FILESTRUCT=$OPTARG
;;
t)
TARGET_DIR=$OPTARG
;;
y)
FILESYSTEM=$OPTARG
;;
s)
SQUASH=$OPTARG
;;
esac
done
if [ -z "$METADATA" ] || [ -z "$FILESTRUCT" ] || [ -z "$TARGET_DIR" ]; then
@echo "ERROR!!! Missing input parameters"
exit 1
fi
######## generate metadata file
if [ ! -z "$METADATA" ]; then
> $METADATA
printf "%.8x" 18 | xxd -r -p > $PROFILE_DIR/TEMP # pointer to data after header and CRC
printf "%.8x" 1 | xxd -r -p >> $PROFILE_DIR/TEMP # size of data
printf "committed\0" > $PROFILE_DIR/TEMP2
printf "0" >> $PROFILE_DIR/TEMP2
append_file_struct $METADATA;
printf "%.8x" 19 | xxd -r -p > $PROFILE_DIR/TEMP # pointer to data after header and CRC
printf "%.8x" 3 | xxd -r -p >> $PROFILE_DIR/TEMP # size of data
printf "cferam.000\0" > $PROFILE_DIR/TEMP2 # NAND_CFE_RAM_NAME
printf "998" >> $PROFILE_DIR/TEMP2
append_file_struct $METADATA;
###start...zyxel add ubiattach check mark
printf "%.8x" 14 | xxd -r -p > $PROFILE_DIR/TEMP # pointer to data after header and CRC
printf "%.8x" 1 | xxd -r -p >> $PROFILE_DIR/TEMP # size of data
printf "zyxel\0" > $PROFILE_DIR/TEMP2 # zyxel ubiattach check mark
printf "0" >> $PROFILE_DIR/TEMP2
append_file_struct $METADATA;
###end...zyxel add ubiattach check mark
if [ ! -z "$SQUASH" ]; then
printf "%.8x" 15 | xxd -r -p > $PROFILE_DIR/TEMP # pointer to data after header and CRC
printf "%.8x" 1 | xxd -r -p >> $PROFILE_DIR/TEMP # size of data
printf "squash\0" > $PROFILE_DIR/TEMP2 # NAND_CFE_RAM_NAME
printf $SQUASH >> $PROFILE_DIR/TEMP2
append_file_struct $METADATA;
fi
printf "%.8x" 0 | xxd -r -p >> $METADATA # metadata terminator
fi
# generate blob
if [ ! -z "$FILESTRUCT" ]; then
> $FILESTRUCT
for FILENAME in $TARGET_DIR/* $TARGET_DIR/**/*
do
if [ -f $FILENAME ]; then
BASENAME=`basename "$FILENAME"`
SIZE=`echo ${#BASENAME}+1+4+4 | bc` # pointer to data after entry name plus size of data plus CRC
printf "%.8x" $SIZE | xxd -r -p > $PROFILE_DIR/TEMP
SIZE=`stat -c%s $FILENAME` # size of data
printf "%.8x" $SIZE | xxd -r -p >> $PROFILE_DIR/TEMP
printf "$BASENAME\0" > $PROFILE_DIR/TEMP2
cat $FILENAME >> $PROFILE_DIR/TEMP2
append_file_struct $FILESTRUCT;
fi
done
printf "%.8x" 0 | xxd -r -p >> $FILESTRUCT
BLOBNAME=`basename "$FILESTRUCT"`
fi
# erase file
if [ ! -z "$UBI_INI" ]; then
> $UBI_INI
# add files cferam and possibly vmlinux
echo -e "[ubi2]" >> $UBI_INI
echo -e "mode=ubi" >> $UBI_INI
echo -e "vol_type=static" >> $UBI_INI
echo -e "image=$FILESTRUCT" >> $UBI_INI
echo -e "vol_id=10" >> $UBI_INI
echo -e "vol_name=$BLOBNAME" >> $UBI_INI
# metadata
echo -e "[ubi0]" >> $UBI_INI
echo -e "mode=ubi" >> $UBI_INI
# setting as dynamic, size and CRC will both be zero, changing these causes kernel panic
echo -e "vol_type=dynamic" >> $UBI_INI
echo -e "image=$METADATA" >> $UBI_INI
echo -e "vol_id=1" >> $UBI_INI
echo -e "vol_name=METADATA" >> $UBI_INI
# metadata copy
echo -e "[ubi1]" >> $UBI_INI
echo -e "mode=ubi" >> $UBI_INI
echo -e "vol_type=dynamic" >> $UBI_INI
echo -e "image=$METADATA" >> $UBI_INI
echo -e "vol_id=2" >> $UBI_INI
echo -e "vol_name=METADATACOPY" >> $UBI_INI
# if vmlinux, also add filesystem
if [ ! -z "$FILESYSTEM" ]; then
echo -e "[ubi3]" >> $UBI_INI
echo -e "mode=ubi" >> $UBI_INI
echo -e "vol_type=static" >> $UBI_INI
echo -e "image=$FILESYSTEM" >> $UBI_INI
echo -e "vol_id=0" >> $UBI_INI
echo -e "vol_name=rootfs_ubifs" >> $UBI_INI
# echo -e "vol_flags=autoresize" >> $UBI_INI
fi
fi
rm -f $PROFILE_DIR/TEMP
rm -f $PROFILE_DIR/TEMP2
rm -f $PROFILE_DIR/TEMP3