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