hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#!/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}
"
 
# <dev>:<mount point>:<fs type>:<mount flags>:<source dir>:<image size(M|K|auto)>:[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 <name> or /dev/.../<name> or <UUID|LABEL|PARTLABEL>=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