NXP i.MX EVK board build tools
guowenxue
2023-09-26 75a960df1eb8abad7c1c693d8cad75db63478d6b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
#!/bin/bash
 
PRJ_PATH=`pwd`
BOARD=evk_8mp
 
ANDROID_VER=imx-android-12.0.0_1.0.0
IMAGE_PATH=${PRJ_PATH}/android_image
IMAGE_NAME=${ANDROID_VER}-${BOARD}.img
IMAGE_SIZE=14336M  #14G
 
JOBS=`cat /proc/cpuinfo | grep processor | wc -l`
LOOP_DEV=`losetup  -f | cut -d/ -f3`
 
set -e
 
# display in green
function pr_info() {
    echo -e "\033[40;32m --I-- $1 \033[0m"
}
 
function exit_handler()
{
    pr_info "Shell script exit now, do some clean work"
 
    set +e
 
    if [ -L /dev/mapper/${LOOP_DEV}p1 ] ; then
        echo "kpartx -dv /dev/${LOOP_DEV}"
        kpartx -dv /dev/${LOOP_DEV} > /dev/null
    fi
 
    losetup -a | grep "${LOOP_DEV}" > /dev/null 2>&1
    if [ $? == 0 ]  ; then
        echo "losetup -d /dev/${LOOP_DEV}"
        losetup -d /dev/${LOOP_DEV} > /dev/null
    fi
}
 
function do_systool()
{
    if command -v simg2img > /dev/null 2>&1 ; then
        pr_info "system tools installed already."
        return ;
    fi
 
    pr_info "Start install system tools."
    # ubuntu22.04 miss android-sdk-ext4-utils
    sudo apt install -y uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev make libssl-dev \
        lzop git curl u-boot-tools mtd-utils device-tree-compiler gdisk m4 bison flex gcc-multilib \
        android-sdk-libsparse-utils android-sdk android-sdk-build-tools libncurses5
 
    sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
}
 
function do_fetch()
{
    if [ -f ${PRJ_PATH}/${ANDROID_VER}/imx_android_setup.sh ] ; then
        pr_info "android source code fetch already."
        return;
    fi
 
    pr_info "Start fetch source code."
    mkdir -p ${PRJ_PATH}/bin
    curl https://storage.googleapis.com/git-repo-downloads/repo > ${PRJ_PATH}/bin/repo
    chmod a+x ${PRJ_PATH}/bin/repo
 
    export PATH=${PATH}:${PRJ_PATH}/bin
 
 
    if [ ! -d $ANDROID_VER ] ; then
        tar -xzf $ANDROID_VER.tar.gz
    fi
 
    source ${PRJ_PATH}/${ANDROID_VER}/imx_android_setup.sh 
 
    # By default, after preceding command finishes execution, current working directory changed to the
    # i.MX Android source code root directory.
    # ${MY_ANDROID} will be refered as the i.MX Android source code root directory in all i.MX Andorid
    # release documentation
 
    export MY_ANDROID=${PRJ_PATH}
}
 
function do_build()
{
    IMX_TARGET="bootloader kernel mxmwifi dtboimage bootimage vendorbootimage vendorimage"
 
    pr_info "Start build android source code."
 
    export AARCH64_GCC_CROSS_COMPILE=aarch64-linux-gnu-
    export MY_ANDROID=${PRJ_PATH}/android_build
 
    cd $MY_ANDROID
    source build/envsetup.sh
    #lunch ${BOARD}-eng
    lunch ${BOARD}-userdebug
 
    # Build U-Boot/kernel with imx-make.sh first, but not to build Android images.
    ./imx-make.sh -j${JOBS} ${IMX_TARGET} 2>&1 | tee build-log.txt
 
    # Start the process of build Android images with "make" function.
    make -j${JOBS} 2>&1 | tee -a build-log.txt
 
    # output in ${MY_ANDROID}/out/target/product/${BOARD}
    ls out/target/product/${BOARD}/*.img
}
 
function do_install()
{
    export MY_ANDROID=${PRJ_PATH}/android_build
 
    IMAGE_FILES="boot.img  dtbo-imx8mp.img  partition-table.img  super.img  \
        u-boot-imx8mp.imx  vbmeta-imx8mp.img  vendor_boot.img \
        fastboot_imx_flashall.* imx-sdcard-partition.* uuu_imx_android_flash.* "
 
    pr_info "Start install output images"
 
    mkdir -p $IMAGE_PATH && rm -f $IMAGE_PATH/*
    cd ${MY_ANDROID}/out/target/product/${BOARD}/
 
    for f in $IMAGE_FILES
    do
        cp $f ${IMAGE_PATH}
    done
 
    cd $PRJ_PATH
}
 
function do_image()
{
    cd $IMAGE_PATH
 
    # Generate android system image file and losetup for it
    pr_info "Start generate android system images: ${IMAGE_NAME}"
    cp partition-table.img ${IMAGE_NAME}
    chmod +x ${IMAGE_NAME}
 
    truncate -s ${IMAGE_SIZE} ${IMAGE_NAME}
    sgdisk -e ${IMAGE_NAME}
    gdisk -l ${IMAGE_NAME}
 
    losetup /dev/${LOOP_DEV}  ${IMAGE_NAME}
    kpartx -av /dev/${LOOP_DEV} > /dev/null
 
    # Android system image partition table and written images
    part1=(dtbo_a:dtbo-imx8mp.img)
    part2=(dtbo_b:dtbo-imx8mp.img)
    part3=(boot_a:boot.img)
    part4=(boot_b:boot.img)
    part5=(vendor_boot_a:vendor_boot.img)
    part6=(vendor_boot_b:vendor_boot.img)
    part7=(misc:zero)
    part8=(metadata:ext4)
    part9=(presistdata:zero)
    part10=(super:super.img)
    part11=(userdata:ext4)
    part12=(fbmisc:zero)
    part13=(vbmeta_a:vbmeta-imx8mp.img)
    part14=(vbmeta_b:vbmeta-imx8mp.img)
 
    pr_info "Start write built output images to android system images"
    for i in `seq 1 14`
    do
        eval var=\${part${i}[@]}
        for info in ${var}
        do
            partnum=$i
            partname=`echo ${info} | cut -d: -f1`
            imgfile=`echo ${info} | cut -d: -f2`
 
            echo "Flash partition${partnum}($partname): $imgfile "
 
            if [ "$imgfile" = "zero" ] ; then
                size=`gdisk -l ${IMAGE_NAME} | grep -w ${partname} | awk '{print $4}' | cut -d. -f1`
                unit=`gdisk -l ${IMAGE_NAME} | grep -w ${partname} | awk '{print $5}'`
                dd if=/dev/zero of=/dev/mapper/${LOOP_DEV}p${partnum} bs=1${unit} count=${size} conv=fsync,nocreat status=none
 
            elif [ "$imgfile" = "ext4" ] ; then
                mkfs.ext4 -F /dev/mapper/${LOOP_DEV}p${partnum} -L${partname} > /dev/null 2>&1
 
            elif [ "$imgfile" = "super.img" ] ; then
                simg2img $imgfile /dev/mapper/${LOOP_DEV}p${partnum}
 
            else
                dd if=$imgfile of=/dev/mapper/${LOOP_DEV}p${partnum} bs=10M conv=fsync,nocreat status=none
 
            fi
        done
    done
 
    pr_info "Start write u-boot image to android system images"
    dd if=u-boot-imx8mp.imx of=/dev/${LOOP_DEV} bs=1k seek=32 conv=fsync status=none
 
    sync
    pr_info "generate ${IMAGE_NAME} successful!"
}
 
function do_usage()
{
    echo ""
    echo "Usage:"
    echo " $0 [-b] [-g] [-h]"
    echo "     -b : build android source code SDK"
    echo "     -g : generate android system image"
    echo "     -h : show this help message"
    echo ""
    echo " WARNNING: Generate android image need run as sudo"
    echo ""
    echo " Build Example: $0 -b && sudo $0 -g"
    echo ""
    exit;
}
 
action="usage"
 
while getopts "bgh" OPTNAME
do
    case "${OPTNAME}" in
        "b")
            action="build"
            shift
            ;;  
 
        "g")
            action="generate"
            shift
            ;;  
 
        "h")
            action="usage"
            ;;  
    esac
done
 
trap 'exit_handler' EXIT
 
#do_systool
 
if [ $action == "usage" ] ; then
    do_usage
 
elif [ $action == "build" ] ; then
    do_fetch
    do_build
    do_install
 
elif [ $action == "generate" ] ; then
    do_image
 
fi