guowenxue
2024-12-23 b8e5f60912c77d52214c21e67fa91ec5f522c54c
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/
256f95 228     cp -rf $KERNEL_BINPATH/lib/firmware/* $ROOTFS/lib/firmware/
849fbd 229
G 230     pr_info "start install root filesystem"
231     mount -t ext4 /dev/mapper/${LOOP_DEV}p2 ${MNT_POINT}
232     cp -af $ROOTFS/* ${MNT_POINT}
233     sync && umount ${MNT_POINT}
234
2334ec 235     pr_warn "Build system image $IMAGE_NAME done"
849fbd 236 }
G 237
238 function exit_handler()
239 {
240     pr_warn "Shell script exit now, do some clean work\n"
241     set +e
242
243     if mountpoint ${MNT_POINT} > /dev/null 2>&1 ; then
244         pr_info "umount ${MNT_POINT}"
245         umount ${MNT_POINT} > /dev/null 2>&1
246     fi
247
248     rm -rf ${MNT_POINT}
249
250     if [ -e /dev/mapper/${LOOP_DEV}p1 ] ; then
251         pr_info "kpartx -dv /dev/${LOOP_DEV}"
252         kpartx -dv /dev/${LOOP_DEV}
253     fi
254
255     losetup -a | grep "${LOOP_DEV}" > /dev/null 2>&1
256     if [ $? == 0 ]  ; then
257         pr_info "losetup -d /dev/${LOOP_DEV}"
258         losetup -d /dev/${LOOP_DEV}
259     fi
260 }
261
262 function do_build()
263 {
264     cd $PRJ_PATH
265
266     build_image
267 }
268
269 function do_install()
270 {
271     cd $PRJ_PATH
272
2334ec 273     if [[ `echo $COMPRESS | tr 'A-Z' 'a-z'` == "yes" ]] ; then
G 274         pr_info "Start bzip2 compress $IMAGE_NAME"
275         rm -f $IMAGE_NAME.bz2
276         bzip2 $IMAGE_NAME
277     fi
278
849fbd 279     mkdir -p $PRFX_PATH
2334ec 280     mv $IMAGE_NAME* $PRFX_PATH
849fbd 281     cp $UBOOT_BINPATH/u-boot-${BOARD}.imx $PRFX_PATH
G 282
283     if [[ -n "$INST_PATH" && -w $INST_PATH ]] ; then
284         pr_info "install bootloader and system image to '$INST_PATH'"
285         cp $PRFX_PATH/u-boot-${BOARD}.imx $INST_PATH
2334ec 286         cp $PRFX_PATH/$IMAGE_NAME* $INST_PATH
849fbd 287     fi
G 288 }
289
290 function do_clean()
291 {
292     for d in rootfs-*
293     do
294         rm -rf $PRJ_PATH/$d
295     done
296
8e6109 297     rm -rf $PRJ_PATH/tarballs
849fbd 298     rm -rf $PRFX_PATH
G 299     rm -f *.img
300 }
301
302 #+-------------------------+
303 #| Shell script body entry |
304 #+-------------------------+
305
306 if [ `id -u` != 0 ] ; then
307     pr_error "ERROR: This shell script must run as root"
308     exit;
309 fi
310
311 cd $PRJ_PATH
312
313 export_env
314
315 if [[ $# == 1 && $1 == -c ]] ;then
316     pr_warn "start clean system image"
317     do_clean
318     exit;
319 fi
320
2334ec 321 pr_warn "Build system image $IMAGE_NAME"
849fbd 322
G 323 trap 'exit_handler' EXIT
324
325 do_fetch
326
327 do_build
328
329 do_install
330