#!/bin/bash -e echo "Executing $(basename "$0")..." SCRIPT_PATH=$(realpath "$BASH_SOURCE") SCRIPT_DIR=$(dirname "$SCRIPT_PATH") TOP_DIR="$SCRIPT_DIR/../../.." echo "Top of tree: $TOP_DIR" source "$TOP_DIR/device/rockchip/.BoardConfig.mk" TARGET_DIR=$(realpath "$1") shift FSTAB="$TARGET_DIR/etc/fstab" OS_RELEASE="$TARGET_DIR/etc/os-release" # The repo tool might not work when path is too long. INFO_DIR=$(realpath --relative-base="$TOP_DIR" "$TARGET_DIR/info") REBOOT_WRAPPER=busybox-reboot RK_LEGACY_PARTITIONS=" \ ${RK_OEM_FS_TYPE:+oem:/oem:$RK_OEM_FS_TYPE} ${RK_USERDATA_FS_TYPE:+userdata:/userdata:$RK_USERDATA_FS_TYPE} " # ::::::[options] # for example: # RK_EXTRA_PARTITIONS="oem:/oem:ext2:defaults:oem_normal:256M:fixed # userdata:/userdata:vfat:errors=remount-ro:userdata_empty:auto" RK_EXTRA_PARTITIONS="${RK_EXTRA_PARTITIONS:-$RK_LEGACY_PARTITIONS}" function fixup_root() { echo "Fixing up rootfs type: $1" FS_TYPE=$1 sed -i "s#\([[:space:]]/[[:space:]]\+\)\w\+#\1${FS_TYPE}#" "$FSTAB" } function fixup_part() { echo "Fixing up partition: ${@//:/ }" SRC="$1" MOUNT="$2" FS_TYPE="$3" MOUNT_OPTS="$4" PASS="$5" # Remove old entries with same mountpoint sed -i "/[[:space:]]${MOUNT//\//\\\/}[[:space:]]/d" "$FSTAB" if [ "$SRC" != tmpfs ]; then # Remove old entries with same source sed -i "/^${SRC//\//\\\/}[[:space:]]/d" "$FSTAB" fi # Append new entry echo -e "$SRC\t$MOUNT\t$FS_TYPE\t$MOUNT_OPTS\t0 $PASS" >> "$FSTAB" mkdir -p "$TARGET_DIR/$MOUNT" } function fixup_basic_part() { echo "Fixing up basic partition: $@" FS_TYPE="$1" MOUNT="$2" MOUNT_OPTS="${3:-defaults}" fixup_part "$FS_TYPE" "$MOUNT" "$FS_TYPE" "$MOUNT_OPTS" 0 } function partition_arg() { PART="$1" I="$2" DEFAULT="$3" ARG=$(echo $PART | cut -d':' -f"$I") echo ${ARG:-$DEFAULT} } function fixup_device_part() { echo "Fixing up device partition: ${@//:/ }" DEV="$(partition_arg "$*" 1)" # Dev is either or /dev/.../ or =xxx [ "$DEV" ] || return 0 echo $DEV | grep -qE "^/|=" || DEV="LABEL=$DEV" MOUNT="$(partition_arg "$*" 2 "/${DEV##*[/=]}")" FS_TYPE="$(partition_arg "$*" 3 ext2)" MOUNT_OPTS="$(partition_arg "$*" 4 defaults)" fixup_part "$DEV" "$MOUNT" "$FS_TYPE" "$MOUNT_OPTS" 2 } function fixup_fstab() { [ -f "$FSTAB" ] || return 0 echo "Fixing up /etc/fstab..." cd "$TARGET_DIR" case "$RK_ROOTFS_TYPE" in ext[234]) fixup_root "$RK_ROOTFS_TYPE" ;; *) fixup_root auto ;; esac fixup_basic_part proc /proc fixup_basic_part devtmpfs /dev fixup_basic_part devpts /dev/pts mode=0620,ptmxmode=0666,gid=5 fixup_basic_part tmpfs /dev/shm nosuid,nodev,noexec fixup_basic_part sysfs /sys fixup_basic_part configfs /sys/kernel/config fixup_basic_part debugfs /sys/kernel/debug fixup_basic_part pstore /sys/fs/pstore if echo "$TARGET_DIR" | grep -qE "_recovery/target/*$"; then fixup_device_part /dev/sda1:/mnt/udisk:auto:defaults:: fixup_device_part /dev/mmcblk1p1:/mnt/sdcard:auto:defaults:: fi for part in ${RK_EXTRA_PARTITIONS//@/ }; do fixup_device_part $part done } function fixup_os_release() { KEY=$1 shift sed -i "/^$KEY=/d" "$OS_RELEASE" echo "$KEY=\"$@\"" >> "$OS_RELEASE" } function kernel_version(){ VERSION_KEYS="VERSION PATCHLEVEL" VERSION="" for k in $VERSION_KEYS; do v=$(grep "^$k = " $1/Makefile | cut -d' ' -f3) VERSION=${VERSION:+$VERSION.}$v done echo ${VERSION:-unknown} } function add_build_info() { [ -f "$OS_RELEASE" ] || touch "$OS_RELEASE" echo "Adding information to /etc/os-release..." cd "$TOP_DIR" KVER=$(kernel_version kernel/) fixup_os_release BUILD_INFO "$(whoami)@$(hostname) $(date)${@:+ - $@}" fixup_os_release KERNEL "$KVER - ${RK_KERNEL_DEFCONFIG:-unkown}" mkdir -p "$INFO_DIR" cp device/rockchip/.BoardConfig.mk "$INFO_DIR/BoardConfig.xml" cp kernel/.config "$INFO_DIR/config-$KVER" cp kernel/System.map "$INFO_DIR/System.map-$KVER" EXTRA_FILES=" \ /etc/os-release /etc/fstab /var/log \ /tmp/usbdevice.log /tmp/bootanim.log \ /tmp/resize-all.log /tmp/mount-all.log \ /proc/version /proc/cmdline /proc/kallsyms /proc/interrupts /proc/cpuinfo \ /proc/softirqs /proc/device-tree /proc/diskstats /proc/iomem \ /proc/meminfo /proc/partitions /proc/slabinfo \ /proc/rk_dmabuf /proc/rkcif-mipi-lvds /proc/rkisp0-vir0 \ /sys/kernel/debug/wakeup_sources /sys/kernel/debug/clk/clk_summary \ /sys/kernel/debug/gpio /sys/kernel/debug/pinctrl/ \ /sys/kernel/debug/dma_buf /sys/kernel/debug/dri \ " ln -sf $EXTRA_FILES "$INFO_DIR/" } function fixup_reboot() { echo "Fixup busybox reboot commands..." cd "$TARGET_DIR" [ $(readlink sbin/reboot) = busybox ] || return 0 install -D -m 0755 "$SCRIPT_DIR/data/$REBOOT_WRAPPER" sbin/$REBOOT_WRAPPER for cmd in halt reboot poweroff shutdown; do ln -sf $REBOOT_WRAPPER sbin/$cmd done } function add_dirs_and_links() { echo "Adding dirs and links..." cd "$TARGET_DIR" rm -rf mnt/* udisk sdcard data mkdir -p mnt/sdcard mnt/udisk ln -sf udisk mnt/usb_storage ln -sf sdcard mnt/external_sd ln -sf mnt/udisk udisk ln -sf mnt/sdcard sdcard ln -sf userdata data } add_build_info $@ fixup_fstab fixup_reboot add_dirs_and_links exit 0