guowenxue
2024-02-22 86063e8b34368bab47956834efd6536259cd9baf
commit | author | age
849fbd 1 #!/bin/bash
G 2
3 # this project absolute path
4 PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
5
6 # top project absolute path
7 TOP_PATH=$(realpath $PRJ_PATH/..)
8
9 # binaries build prefix install path
10 PRFX_PATH=$PRJ_PATH/install
11
12 # binaries finally install path if needed
8e6109 13 #INST_PATH=/tftp
G 14
2334ec 15 # compress system image or not
G 16 COMPRESS=yes
17
8e6109 18 # download taballs path
G 19 TARBALL_PATH=$PRJ_PATH/tarballs
849fbd 20
G 21 # config file path
22 CONF_FILE=$TOP_PATH/config.json
23
24 # shell script will exit once get command error
25 set -e
26 set -u
27
28 #+-------------------------+
29 #| Shell script functions  |
30 #+-------------------------+
31
32 function pr_error() {
33     echo -e "\033[40;31m $1 \033[0m"
34 }
35
36 function pr_warn() {
37     echo -e "\033[40;33m $1 \033[0m"
38 }
39
40 function pr_info() {
41     echo -e "\033[40;32m $1 \033[0m"
42 }
43
44 # decompress a packet to destination path
45 function do_unpack()
46 {
47     tarball=$1
48     dstpath=`pwd`
49
50     if [[ $# == 2 ]] ; then
51         dstpath=$2
52     fi
53
54     pr_info "decompress $tarball => $dstpath"
55
56     mkdir -p $dstpath
57     case $tarball in
58         *.tar.gz)
59             tar -xzf $tarball -C $dstpath
60             ;;
61
62         *.tar.bz2)
63             tar -xjf $tarball -C $dstpath
64             ;;
65
66         *.tar.xz)
67             tar -xJf $tarball -C $dstpath
68             ;;
69
70         *.tar.zst)
71             tar -I zstd -xf $tarball -C $dstpath
72             ;;
73
74         *.tar)
75             tar -xf $tarball -C $dstpath
76             ;;
77
78         *.zip)
79             unzip -qo $tarball -d $dstpath
80             ;;
81
82         *)
83             pr_error "decompress Unsupport packet: $tarball"
84             return 1;
85             ;;
86     esac
87 }
88
89 # parser configure file and export environment variable
90 function export_env()
91 {
92     export BOARD=`jq -r ".bsp.board" $CONF_FILE | tr 'A-Z' 'a-z'`
93     export BSP_VER=`jq -r ".bsp.version" $CONF_FILE | tr 'A-Z' 'a-z'`
8e6109 94     export BSP_URL=`jq -r ".bsp.giturl" $CONF_FILE`
G 95     export DIS_TYPE=`jq -r ".system.distro" $CONF_FILE | tr 'A-Z' 'a-z'`
849fbd 96     export DIS_VER=`jq -r ".system.version" $CONF_FILE | tr 'A-Z' 'a-z'`
G 97     export IMAGE_SIZE=`jq -r ".system.imgsize" $CONF_FILE | tr 'A-Z' 'a-z'`
98     export BOOT_SIZE=`jq -r ".system.bootsize" $CONF_FILE | tr 'A-Z' 'a-z'`
99
100     export LOOP_DEV=`losetup  -f | cut -d/ -f3`
101     export MNT_POINT=$PRJ_PATH/mnt
102
103     export ROOTFS=rootfs-${DIS_VER}
104     export UBOOT_BINPATH=$TOP_PATH/bootloader/install/
105     export KERNEL_BINPATH=$TOP_PATH/kernel/install/
106     export ROOTFS_YCTPATH=$TOP_PATH/yocto/install/
2334ec 107     export IMAGE_NAME=${DIS_TYPE}-${DIS_VER}-${BSP_VER}.img
86063e 108     export KERNEL_IMAGE=Image
849fbd 109
G 110     if [[ $BOARD =~ mx8ulp ]] || [[ $BOARD =~ mx8mq ]] || [[ $BOARD =~ mx8mm ]] ; then
111         export UBOOT_OFFSET_SECTOR=66
112     elif [[ $BOARD =~ mx8mn ]] || [[ $BOARD =~ mx8mp ]] || [[ $BOARD =~ mx93 ]] ; then
113         export UBOOT_OFFSET_SECTOR=64
114     elif [[ $BOARD =~ mx6 ]] || [[ $BOARD =~ mx7 ]] ; then
115         export UBOOT_OFFSET_SECTOR=2
86063e 116         export KERNEL_IMAGE=zImage
849fbd 117     fi
G 118 }
119
120 function do_fetch()
121 {
122     cd $PRJ_PATH
123
8e6109 124     if [ -d $ROOTFS/bin ] ; then
G 125         pr_info "$ROOTFS fetched already"
126         return ;
127     fi
849fbd 128
8e6109 129     if [[ $DIS_TYPE == yocto ]] ; then
G 130         TAR_TYPE=tar.zst
131     else
132         TAR_TYPE=tar.xz
133     fi
849fbd 134
8e6109 135     # Decompress the rootfs form Yocto build install path
G 136     if [[ $DIS_TYPE == yocto ]] ; then
849fbd 137
2334ec 138         for tarball in $ROOTFS_YCTPATH/*.${TAR_TYPE}
849fbd 139         do
G 140             if [ -s $tarball ] ; then
141                 pr_warn "Decompress $ROOTFS from yocto install path"
142                 mkdir -p $ROOTFS
143                 do_unpack $tarball $ROOTFS
8e6109 144                 return ;
849fbd 145             fi
G 146         done
8e6109 147     fi
849fbd 148
8e6109 149     tarball=rootfs-${DIS_TYPE}-${DIS_VER}.${TAR_TYPE}
849fbd 150
8e6109 151     if [[ $BSP_URL =~ github.com ]] ; then
G 152
153         pr_error "INFO: Please download $tarball and decompress it to folder '$PRJ_PATH/$ROOTFS'"
154
155     else
156
157         pr_info "INFO: download $tarball form $BSP_URL"
158
159         mkdir -p $TARBALL_PATH
160
161         # Download source code packet
162         if [ ! -s $TARBALL_PATH/$tarball ] ; then
86063e 163             wget $BSP_URL/imx/${BOARD}/rootfs/$tarball -P $TARBALL_PATH
8e6109 164         fi
G 165
166         # decompress source code packet
167         do_unpack $TARBALL_PATH/$tarball $ROOTFS
168     fi
169
170     if [ ! -d $ROOTFS/bin ] ; then
849fbd 171         pr_error "Fetch rootfs $ROOTFS failed"
G 172         exit ;
173     fi
174 }
175
176 # System image layout map:
177 # +-------------------+--------------------+----------------------+
178 # | Raw Part(10MB)    | FAT32 Part2(100MB) | EXT4 Part3(All left) |
179 # +-------------------+--------------------+----------------------+
180 # | U-boot on #64     |   Kernel and DTB   |   Root file system   |
181 # +-------------------+--------------------+----------------------+
182
183 function build_image()
184 {
185     # Uboot size set be 10MB and deployed in 64th sector on eMMC/TFCard
186     UBOOT_SIZE=10
187
188     mkdir -p $MNT_POINT
189
190     pr_info "start generate empty system image"
191     dd if=/dev/zero of=${IMAGE_NAME} bs=1024k count=${IMAGE_SIZE} conv=sync
192     chmod a+x ${IMAGE_NAME}
193
194     pr_info "start partition system image"
195     fat_start=$UBOOT_SIZE
196     fat_end=`expr $UBOOT_SIZE + $BOOT_SIZE`
197     parted ${IMAGE_NAME} mklabel msdos
198     parted ${IMAGE_NAME} mkpart primary fat32 ${fat_start}M ${fat_end}M
199     parted ${IMAGE_NAME} mkpart primary ext4 ${fat_end}M 100%
200     sync
201
202     pr_info "losetup system image on $LOOP_DEV"
203     losetup /dev/${LOOP_DEV}  ${IMAGE_NAME}
204     kpartx -av /dev/${LOOP_DEV}
205
206     pr_info "start format system image"
207     mkfs.vfat /dev/mapper/${LOOP_DEV}p1
208     mkfs.ext4 /dev/mapper/${LOOP_DEV}p2
209     sync
210
211     pr_info "start install u-boot image"
212     dd if=$UBOOT_BINPATH/u-boot-${BOARD}.imx of=${IMAGE_NAME} bs=512 seek=$UBOOT_OFFSET_SECTOR conv=notrunc,sync
213
214     pr_info "start install linux kernel images"
215     mount -t vfat /dev/mapper/${LOOP_DEV}p1 ${MNT_POINT}
86063e 216     cp -rf $KERNEL_BINPATH/$KERNEL_IMAGE ${MNT_POINT}/
849fbd 217     cp -rf $KERNEL_BINPATH/${BOARD}.dtb ${MNT_POINT}/
G 218
219     sync && umount ${MNT_POINT}
220
221     pr_info "update drivers in root filesystem"
222     rm -rf $ROOTFS/lib/modules/
223     mkdir -p $ROOTFS/lib/modules/
224     cp -rf $KERNEL_BINPATH/lib/modules/[0-9]*\.[0-9]*\.[0-9]* $ROOTFS/lib/modules/
225
226     pr_info "start install root filesystem"
227     mount -t ext4 /dev/mapper/${LOOP_DEV}p2 ${MNT_POINT}
228     cp -af $ROOTFS/* ${MNT_POINT}
229     sync && umount ${MNT_POINT}
230
2334ec 231     pr_warn "Build system image $IMAGE_NAME done"
849fbd 232 }
G 233
234 function exit_handler()
235 {
236     pr_warn "Shell script exit now, do some clean work\n"
237     set +e
238
239     if mountpoint ${MNT_POINT} > /dev/null 2>&1 ; then
240         pr_info "umount ${MNT_POINT}"
241         umount ${MNT_POINT} > /dev/null 2>&1
242     fi
243
244     rm -rf ${MNT_POINT}
245
246     if [ -e /dev/mapper/${LOOP_DEV}p1 ] ; then
247         pr_info "kpartx -dv /dev/${LOOP_DEV}"
248         kpartx -dv /dev/${LOOP_DEV}
249     fi
250
251     losetup -a | grep "${LOOP_DEV}" > /dev/null 2>&1
252     if [ $? == 0 ]  ; then
253         pr_info "losetup -d /dev/${LOOP_DEV}"
254         losetup -d /dev/${LOOP_DEV}
255     fi
256 }
257
258 function do_build()
259 {
260     cd $PRJ_PATH
261
262     build_image
263 }
264
265 function do_install()
266 {
267     cd $PRJ_PATH
268
2334ec 269     if [[ `echo $COMPRESS | tr 'A-Z' 'a-z'` == "yes" ]] ; then
G 270         pr_info "Start bzip2 compress $IMAGE_NAME"
271         rm -f $IMAGE_NAME.bz2
272         bzip2 $IMAGE_NAME
273     fi
274
849fbd 275     mkdir -p $PRFX_PATH
2334ec 276     mv $IMAGE_NAME* $PRFX_PATH
849fbd 277     cp $UBOOT_BINPATH/u-boot-${BOARD}.imx $PRFX_PATH
G 278
279     if [[ -n "$INST_PATH" && -w $INST_PATH ]] ; then
280         pr_info "install bootloader and system image to '$INST_PATH'"
281         cp $PRFX_PATH/u-boot-${BOARD}.imx $INST_PATH
2334ec 282         cp $PRFX_PATH/$IMAGE_NAME* $INST_PATH
849fbd 283     fi
G 284 }
285
286 function do_clean()
287 {
288     for d in rootfs-*
289     do
290         rm -rf $PRJ_PATH/$d
291     done
292
8e6109 293     rm -rf $PRJ_PATH/tarballs
849fbd 294     rm -rf $PRFX_PATH
G 295     rm -f *.img
296 }
297
298 #+-------------------------+
299 #| Shell script body entry |
300 #+-------------------------+
301
302 if [ `id -u` != 0 ] ; then
303     pr_error "ERROR: This shell script must run as root"
304     exit;
305 fi
306
307 cd $PRJ_PATH
308
309 export_env
310
311 if [[ $# == 1 && $1 == -c ]] ;then
312     pr_warn "start clean system image"
313     do_clean
314     exit;
315 fi
316
2334ec 317 pr_warn "Build system image $IMAGE_NAME"
849fbd 318
G 319 trap 'exit_handler' EXIT
320
321 do_fetch
322
323 do_build
324
325 do_install
326