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