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