hc
2023-02-18 a08c8b75ee83d7f62c9aefc23bfb42082aa4076c
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
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
#!/bin/bash
 
BUILDROOT=$(pwd)
BUILDROOT_IMAGE_DIR=$1
BUILDROOT_HOST_DIR=$BUILDROOT_IMAGE_DIR/../host
BUILDROOT_DEFCONFIG=$BUILDROOT_IMAGE_DIR/../.config
 
ROOTFS_IMAGE_FAKEROOT_UBI=$BUILDROOT_IMAGE_DIR/fakeroot-ubi.fs
ROOTFS_SRC_DIR=$BUILDROOT_IMAGE_DIR/../target
 
IMAGE_OUTPUT_DIR=$BUILDROOT/../rockdev/
TOP_DIR=$BUILDROOT/../
FAKEROOT_TOOL=$BUILDROOT_HOST_DIR/bin/fakeroot
MKUBIFS_TOOL=$BUILDROOT_HOST_DIR/sbin/mkfs.ubifs
MKUBINIZE_TOOL=$BUILDROOT_HOST_DIR/sbin/ubinize
MKSQUASHFS_TOOL=$BUILDROOT_HOST_DIR/bin/mksquashfs
 
function unset_board_config_all()
{
   local tmp_file=`mktemp`
   grep -o "^export.*RK_.*=" `find $TOP_DIR/device/rockchip -name "Board*.mk" -type f` -h | sort | uniq > $tmp_file
   source $tmp_file
   rm -f $tmp_file
}
 
mk_ubi_image_fake()
{
   temp_dir="$BUILDROOT_IMAGE_DIR"
 
   if [ $(( $UBI_BLOCK_SIZE )) -eq $(( 0x20000 )) ]; then
       ubi_block_size_str="128KB"
   elif [ $(( $UBI_BLOCK_SIZE )) -eq $(( 0x40000 )) ]; then
       ubi_block_size_str="256KB"
   else
       echo "[$0:error] Please add ubi block size [$UBI_BLOCK_SIZE] to $PWD/$0"
       exit 1
   fi
 
   if [ $(( $UBI_PAGE_SIZE )) -eq 2048 ]; then
       ubi_page_size_str="2KB"
   elif [ $(( $UBI_PAGE_SIZE )) -eq 4096 ]; then
       ubi_page_size_str="4KB"
   else
       echo "[$0:error] Please add ubi block size [$UBI_PAGE_SIZE] to $PWD/$0"
       exit 1
   fi
 
   if [ -z "$UBI_VOL_NAME" ]; then
       echo "[$0:error] Please config ubifs partition volume name"
       exit 1
   fi
 
   ubifs_lebsize=$(( $UBI_BLOCK_SIZE - 2 * $UBI_PAGE_SIZE ))
   ubifs_miniosize=$UBI_PAGE_SIZE
   partition_size=$(( $UBI_PART_SIZE ))
   partition_size_str="$(( $partition_size / 1024 / 1024 ))MB"
   output_image=${IMAGE_OUTPUT_DIR}/${UBI_VOL_NAME}_${ubi_page_size_str}_${ubi_block_size_str}_${partition_size_str}.ubi
   temp_ubinize_file=$temp_dir/${UBI_VOL_NAME}_${ubi_page_size_str}_${ubi_block_size_str}_${partition_size_str}_ubinize.cfg
   UBI_VOL_TYPE=${UBI_VOL_TYPE:-dynamic}
   UBI_COMPRESSION_TPYE=${UBI_COMPRESSION_TPYE:-lzo}
 
   if [ $partition_size -le 0 ]; then
       echo "[$0:error] ubifs partition MUST set partition size"
       exit 1
   fi
 
   if [ ! -f $UBI_IMAGE_FAKEROOT ]; then
       echo "[$0:error] ubifs $UBI_IMAGE_FAKEROOT not found!!!"
       exit 1
   fi
 
   ubifs_maxlebcnt=$(( $partition_size / $ubifs_lebsize ))
 
   echo "[$0:info] ubifs_lebsize=$UBI_BLOCK_SIZE"
   echo "[$0:info] ubifs_miniosize=$UBI_PAGE_SIZE"
   echo "[$0:info] ubifs_maxlebcnt=$ubifs_maxlebcnt"
 
   case $UBIFS_TYPE in
       squashfs)
           temp_image=$temp_dir/${UBI_VOL_NAME}_${partition_size_str}.squashfs
           parallel_jobs=$((1 + `getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1`))
 
           if grep -w "BR2_TARGET_ROOTFS_SQUASHFS4_LZ4=y" $BUILDROOT_DEFCONFIG; then
               squashfs_compression_args=lz4
           elif grep -w "BR2_TARGET_ROOTFS_SQUASHFS4_LZO=y" $BUILDROOT_DEFCONFIG; then
               squashfs_compression_args=lzo
           elif grep -w "BR2_TARGET_ROOTFS_SQUASHFS4_LZMA=y" $BUILDROOT_DEFCONFIG; then
               squashfs_compression_args=lzma
           elif grep -w "BR2_TARGET_ROOTFS_SQUASHFS4_XZ=y" $BUILDROOT_DEFCONFIG; then
               squashfs_compression_args=xz
           elif grep -w "BR2_TARGET_ROOTFS_SQUASHFS4_ZSTD=y" $BUILDROOT_DEFCONFIG; then
               squashfs_compression_args=zstd
           else
               squashfs_compression_args=gzip
           fi
 
           if [ "$squashfs_compression_args" = "lz4" ]; then
               echo "$MKSQUASHFS_TOOL $UBI_SRC_DIR $temp_image -noappend -processors $parallel_jobs -comp $squashfs_compression_args -Xhc" >> $UBI_IMAGE_FAKEROOT
           else
               echo "$MKSQUASHFS_TOOL $UBI_SRC_DIR $temp_image -noappend -processors $parallel_jobs -comp $squashfs_compression_args" >> $UBI_IMAGE_FAKEROOT
           fi
           ;;
 
       ubifs|*)
           temp_image=$temp_dir/${UBI_VOL_NAME}_${ubi_page_size_str}_${ubi_block_size_str}_${partition_size_str}.ubifs
           echo "$MKUBIFS_TOOL -x $UBI_COMPRESSION_TPYE -e $ubifs_lebsize -m $ubifs_miniosize -c $ubifs_maxlebcnt -d $UBI_SRC_DIR -F -v -o $temp_image" >> $UBI_IMAGE_FAKEROOT
           ;;
   esac
 
   echo "[ubifs]" > $temp_ubinize_file
   echo "mode=ubi" >> $temp_ubinize_file
   echo "vol_id=0" >> $temp_ubinize_file
   echo "vol_type=$UBI_VOL_TYPE" >> $temp_ubinize_file
   echo "vol_name=$UBI_VOL_NAME" >> $temp_ubinize_file
   echo "vol_alignment=1" >> $temp_ubinize_file
   echo "vol_flags=autoresize" >> $temp_ubinize_file
   echo "image=$temp_image" >> $temp_ubinize_file
   echo "$MKUBINIZE_TOOL -o $output_image -m $ubifs_miniosize -p $UBI_BLOCK_SIZE -v $temp_ubinize_file" >> $UBI_IMAGE_FAKEROOT
   echo ""
 
   # Pick a default ubi image
   if [ $(( $DEFAULT_UBI_PAGE_SIZE )) -eq $(( $UBI_PAGE_SIZE )) \
       -a $(( $DEFAULT_UBI_BLOCK_SIZE )) -eq $(( $UBI_BLOCK_SIZE )) ]; then
       if [ "$UBI_VOL_NAME" = "rootfs" ]; then
           echo "rm -f $BUILDROOT_IMAGE_DIR/rootfs.ubi" >> $UBI_IMAGE_FAKEROOT
           echo "ln -rfs $output_image $BUILDROOT_IMAGE_DIR/rootfs.ubi" >> $UBI_IMAGE_FAKEROOT
       fi
   fi
 
   UBIFS_TYPE=
   UBI_BLOCK_SIZE=
   UBI_IMAGE_FAKEROOT=
   UBI_PAGE_SIZE=
   UBI_PART_SIZE=
   UBI_SRC_DIR=
   UBI_VOL_NAME=
   UBI_VOL_TYPE=
}
 
get_partition_size()
{
   echo $PARAMETER
 
   PARTITIONS_PREFIX=`echo -n "CMDLINE: mtdparts=rk29xxnand:"`
   while read line
   do
       if [[ $line =~ $PARTITIONS_PREFIX ]]
       then
           partitions=`echo $line | sed "s/$PARTITIONS_PREFIX//g"`
           echo $partitions
           break
       fi
   done < $PARAMETER
 
   [ -z $"partitions" ] && return
 
   IFS=,
   for part in $partitions;
   do
       part_size=`echo $part | cut -d '@' -f1`
       part_name=`echo $part | cut -d '(' -f2|cut -d ')' -f1`
 
       [[ $part_size =~ "-" ]] && continue
 
       part_size=$(($part_size))
       part_size_bytes=$[$part_size*512]
 
       case $part_name in
           rootfs | system_[ab])
               ROOTFS_PART_SIZE=$part_size_bytes
               ;;
           oem)
               OEM_PART_SIZE=$part_size_bytes
               ;;
       esac
   done
}
 
mk_ubi_image_fake_for_rootfs()
{
   UBI_BLOCK_SIZE=$1
   UBI_PAGE_SIZE=$2
 
   UBI_VOL_NAME="rootfs"
   UBI_PART_SIZE=$ROOTFS_PART_SIZE
   UBI_IMAGE_FAKEROOT=$ROOTFS_IMAGE_FAKEROOT_UBI
   UBI_SRC_DIR=$ROOTFS_SRC_DIR
 
   UBIFS_TYPE=`grep -w BR2_PACKAGE_ROOTFS_UBI_CUSTOM_FILESYSTEM $BUILDROOT_DEFCONFIG`
   UBIFS_TYPE=${UBIFS_TYPE##*=}
   UBIFS_TYPE=${UBIFS_TYPE%*\"}
   UBIFS_TYPE=${UBIFS_TYPE#*\"}
   case $UBIFS_TYPE in
       squashfs)
           UBI_VOL_TYPE=static
           ;;
       ubifs|*)
           UBI_VOL_TYPE=dynamic
           ;;
   esac
 
   mk_ubi_image_fake
}
 
get_ubi_image_compression_tpye()
{
   UBI_COMPRESSION_TPYE=""
   if grep -w "BR2_TARGET_ROOTFS_UBIFS_RT_ZLIB=y" $BUILDROOT_DEFCONFIG; then
       UBI_COMPRESSION_TPYE=zlib
   fi
   if grep -w "BR2_TARGET_ROOTFS_UBIFS_RT_LZO=y" $BUILDROOT_DEFCONFIG; then
       UBI_COMPRESSION_TPYE=lzo
   fi
}
 
stash_unused_files()
{
   # stash $ROOTFS_SRC_DIR/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM
   mv $ROOTFS_SRC_DIR/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM $BUILDROOT_IMAGE_DIR/
}
 
pop_unused_files()
{
   mv $BUILDROOT_IMAGE_DIR/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM $ROOTFS_SRC_DIR/
}
 
# Start
 
if [ ! -d $IMAGE_OUTPUT_DIR ]; then
   mkdir -p $IMAGE_OUTPUT_DIR
fi
 
unset_board_config_all
 
# Get the parameter file
source $TOP_DIR/device/rockchip/.BoardConfig.mk
PARAMETER=$TOP_DIR/device/rockchip/.target_product/$RK_PARAMETER
# default page size 2KB
DEFAULT_UBI_PAGE_SIZE=${RK_UBI_PAGE_SIZE:-2048}
# default block size 128KB
DEFAULT_UBI_BLOCK_SIZE=${RK_UBI_BLOCK_SIZE:-0x20000}
 
stash_unused_files
 
echo "[$0:info] Start build ubi images..."
 
get_partition_size
get_ubi_image_compression_tpye
 
if which fakeroot; then
FAKEROOT_TOOL="`which fakeroot`"
else
   echo -e "[$0:error] Install fakeroot First."
   echo -e "[$0:error]   sudo apt-get install fakeroot"
   exit -1
fi
 
sed -i '/\<ubinize\>/d' $ROOTFS_IMAGE_FAKEROOT_UBI
mk_ubi_image_fake_for_rootfs 0x20000 2048
mk_ubi_image_fake_for_rootfs 0x40000 2048
mk_ubi_image_fake_for_rootfs 0x40000 4096
$FAKEROOT_TOOL -- $ROOTFS_IMAGE_FAKEROOT_UBI
 
echo "[$0:info] End build ubi images..."
pop_unused_files
 
exit 0