Commit 723226c1a4151e4e1b89c58bff7b045baba16588

Authored by Eric Lee
1 parent 4fbdfd36c0

Yocto Sumo Support for SMARC-iMX8M, Based on Linux 4.14.98_2.0.0_ga, Initial Release

Showing 11 changed files with 737 additions and 137 deletions Side-by-side Diff

conf/machine/smarcimx8m2g.conf
... ... @@ -16,7 +16,7 @@
16 16  
17 17 # Embedian BSP default providers
18 18 PREFERRED_PROVIDER_virtual/kernel_smarcimx8m2g ?= "linux-smarcimx8m"
19   -PREFERRED_VERSION_linux-smarcimx8m2g_smarcimx8m2g = "4.14.78"
  19 +PREFERRED_VERSION_linux-smarcimx8m2g_smarcimx8m2g = "4.14.98"
20 20  
21 21 KERNEL_DEVICETREE = " \
22 22 embedian/fsl-smarcimx8mq.dtb \
... ... @@ -72,6 +72,7 @@
72 72 boost \
73 73 nodejs \
74 74 networkmanager \
  75 + imx-gpu-viv \
75 76 "
76 77  
77 78 BBMASK_prepend = "fsl-image-mfgtool-initramfs "
conf/machine/smarcimx8m2gind.conf
1   -#@TYPE: Machine
2   -#@NAME: EMBEDIAN SMARC-iMX8M COMPUTER ON MODULES with 2GB LPDDR4 MEMORY
3   -#@SOC: i.MX8MQ
4   -#@DESCRIPTION: Machine configuration for Embedian SMARC-iMX8M
5   -#@MAINTAINER: Eric Lee <eric.lee@embedian.com>
6   -#
7   -# http://www.www.embedian.com
8   -
9   -MACHINEOVERRIDES =. "mx8:mx8m:mx8mq:"
10   -require conf/machine/include/imx-base.inc
11   -require conf/machine/include/arm/arch-arm64.inc
12   -
13   -MACHINE_FEATURES += " usbgadget vfat ext2 alsa serial pci wifi bluetooth"
14   -
15   -IMAGE_FEATURES += "package-management"
16   -
17   -# Embedian BSP default providers
18   -PREFERRED_PROVIDER_virtual/kernel_smarcimx8m2gind ?= "linux-smarcimx8m"
19   -PREFERRED_VERSION_linux-smarcimx8m_smarcimx8m2gind = "4.14.78"
20   -
21   -KERNEL_DEVICETREE = " \
22   - embedian/fsl-smarcimx8mq.dtb \
23   - embedian/fsl-smarcimx8mq-dcss-lvds.dtb \
24   - embedian/fsl-smarcimx8mq-lcdif-lvds.dtb \
25   - embedian/fsl-smarcimx8mq-hdmi.dtb \
26   - embedian/fsl-smarcimx8mq-dp.dtb \
27   - embedian/fsl-smarcimx8mq-edp.dtb \
28   - embedian/fsl-smarcimx8mq-dual-display.dtb \
29   -"
30   -IMAGE_BOOTFILES_DEPENDS += "imx-m4-demos:do_deploy"
31   -IMAGE_BOOTFILES += "imx8mq_m4_TCM_hello_world.bin imx8mq_m4_TCM_rpmsg_lite_pingpong_rtos_linux_remote.bin imx8mq_m4_TCM_rpmsg_lite_str_echo_rtos.bin"
32   -
33   -PREFERRED_PROVIDER_u-boot_smarcimx8m2gind = "u-boot-smarcimx8m"
34   -PREFERRED_PROVIDER_virtual/bootloader_smarcimx8m2gind = "u-boot-smarcimx8m"
35   -
36   -UBOOT_CONFIG ??= "sd"
37   -UBOOT_CONFIG[sd] = "smarcimx8mq_2g_ser3_ind_defconfig,sdcard"
38   -SPL_BINARY = "spl/u-boot-spl.bin"
39   -
40   -# Set DDR FIRMWARE
41   -DDR_FIRMWARE_NAME = "lpddr4_pmu_train_1d_imem.bin lpddr4_pmu_train_1d_dmem.bin lpddr4_pmu_train_2d_imem.bin lpddr4_pmu_train_2d_dmem.bin"
42   -
43   -# Set U-Boot DTB
44   -UBOOT_DTB_NAME = "fsl-smarcimx8mq.dtb"
45   -
46   -# Set imx-mkimage boot target
47   -IMXBOOT_TARGETS = "flash_evk flash_evk_no_hdmi flash_dp_evk"
48   -
49   -SERIAL_CONSOLE = "115200 ttymxc0"
50   -
51   -IMAGE_BOOTLOADER = "imx-boot"
52   -
53   -BOOT_SPACE = "65536"
54   -
55   -LOADADDR = ""
56   -UBOOT_SUFFIX = "bin"
57   -UBOOT_MAKE_TARGET = ""
58   -IMX_BOOT_SEEK = "33"
59   -
60   -PREFERRED_RPROVIDER_ptpd = "ptpd"
61   -PREFERRED_RPROVIDER_ptpd-dev = "ptpd"
62   -
63   -MACHINE_EXTRA_RDEPENDS += " \
64   - packagegroup-tools-bluetooth \
65   - pm-utils \
66   - kmod \
67   - hdparm \
68   - gptfdisk \
69   - lftp \
70   - vim \
71   - ntp \
72   - boost \
73   - nodejs \
74   - networkmanager \
75   - "
76   -
77   -BBMASK_prepend = "fsl-image-mfgtool-initramfs "
78   -
79   -# Packages added to all images (including core-image-minimal)
80   -IMAGE_INSTALL_append = " \
81   - firmware-imx-sdma \
82   - firmware-imx-epdc \
83   - fsl-rc-local \
84   -"
85   -
86   -IMAGE_FSTYPES = "tar.bz2"
87   -
88   -# Ship all kernel modules by default
89   -MACHINE_EXTRA_RRECOMMENDS = "kernel-modules"
90   -
91   -MACHINE_FIRMWARE_append_mx8 = " linux-firmware-ath10k"
conf/machine/smarcimx8m4g.conf
... ... @@ -16,7 +16,7 @@
16 16  
17 17 # Embedian BSP default providers
18 18 PREFERRED_PROVIDER_virtual/kernel_smarcimx8m4g ?= "linux-smarcimx8m"
19   -PREFERRED_VERSION_linux-smarcimx8m_smarcimx8m4g = "4.14.78"
  19 +PREFERRED_VERSION_linux-smarcimx8m_smarcimx8m4g = "4.14.98"
20 20  
21 21 KERNEL_DEVICETREE = " \
22 22 embedian/fsl-smarcimx8mq.dtb \
... ... @@ -72,6 +72,7 @@
72 72 boost \
73 73 nodejs \
74 74 networkmanager \
  75 + imx-gpu-viv \
75 76 "
76 77  
77 78 BBMASK_prepend = "fsl-image-mfgtool-initramfs "
recipes-bsp/u-boot/u-boot-smarcimx8m_2018.03.bb
... ... @@ -12,9 +12,9 @@
12 12 LIC_FILES_CHKSUM = "file://Licenses/gpl-2.0.txt;md5=b234ee4d69f5fce4486a80fdaf4a4263"
13 13  
14 14 UBOOT_SRC ?= "${EMB_UBOOT_MIRROR};protocol=ssh"
15   -SRCBRANCH = "smarc-imx_v2018.03_4.14.78_1.0.0_ga"
  15 +SRCBRANCH = "smarc_8m-imx_v2018.03_4.14.98_2.0.0_ga"
16 16 SRC_URI = "${UBOOT_SRC};branch=${SRCBRANCH}"
17   -SRCREV = "2a0a07c75344130b0c43ae5cecc657afc2672a30"
  17 +SRCREV = "f5822d3223a48fbb57c8bde92579b125ef26fd1f"
18 18  
19 19 S = "${WORKDIR}/git"
20 20  
recipes-kernel/linux/linux-smarcimx8m_4.14.78.bb
1   -# Copyright (C) 2013-2016 Freescale Semiconductor
2   -# Copyright 2017 NXP
3   -# Copyright 2018-2019 Embedian, Inc.
4   -# Released under the MIT license (see COPYING.MIT for the terms)
5   -
6   -SUMMARY = "Linux kernel provided and supported by Embedian"
7   -DESCRIPTION = "Linux kernel provided and supported by Embedian (based on the kernel imx_4.14.78_1.0.0_ga provided by NXP) \
8   -with focus on i.MX Family SOMs. It includes support for many IPs such as GPU, VPU and IPU."
9   -
10   -require recipes-kernel/linux/linux-imx.inc
11   -
12   -DEPENDS += "lzop-native bc-native"
13   -
14   -DEFAULT_PREFERENCE = "1"
15   -
16   -SRCBRANCH = "smarc_8m_imx_4.14.78_1.0.0_ga"
17   -
18   -LOCALVERSION = "-${SRCBRANCH}"
19   -KERNEL_DEFCONFIG = "${S}/arch/arm64/configs/smarcimx8m_defconfig"
20   -DEFAULT_DTB = "fsl-smarcimx8mq"
21   -
22   -KERNEL_SRC ?= "git@git.embedian.com:developer/smarc-fsl-linux-kernel.git;protocol=git"
23   -SRC_URI = "${EMB_KERNEL_MIRROR};protocol=ssh;branch=${SRCBRANCH}"
24   -SRCREV = "5391ef46f0e83d177b39b575518a70df15d8dcc2"
25   -
26   -S = "${WORKDIR}/git"
27   -
28   -addtask copy_defconfig after do_unpack before do_preconfigure
29   -do_copy_defconfig () {
30   - install -d ${B}
31   - mkdir -p ${B}
32   - cp ${KERNEL_DEFCONFIG} ${B}/.config
33   - cp ${KERNEL_DEFCONFIG} ${B}/../defconfig
34   -}
35   -
36   -pkg_postinst_kernel-devicetree_append_mx8 () {
37   - cd $D/boot
38   - ln -s ${DEFAULT_DTB}.dtb ${UBOOT_DTB_NAME}
39   -}
40   -
41   -COMPATIBLE_MACHINE = "(mx6|mx7|mx8)"
42   -EXTRA_OEMAKE_append_mx8 = " ARCH=arm64"
recipes-kernel/linux/linux-smarcimx8m_4.14.98.bb
  1 +# Copyright (C) 2013-2016 Freescale Semiconductor
  2 +# Copyright 2017 NXP
  3 +# Copyright 2018-2019 Embedian, Inc.
  4 +# Released under the MIT license (see COPYING.MIT for the terms)
  5 +
  6 +SUMMARY = "Linux kernel provided and supported by Embedian"
  7 +DESCRIPTION = "Linux kernel provided and supported by Embedian (based on the kernel imx_4.14.78_1.0.0_ga provided by NXP) \
  8 +with focus on i.MX Family SOMs. It includes support for many IPs such as GPU, VPU and IPU."
  9 +
  10 +require recipes-kernel/linux/linux-imx.inc
  11 +
  12 +DEPENDS += "lzop-native bc-native"
  13 +
  14 +DEFAULT_PREFERENCE = "1"
  15 +
  16 +SRCBRANCH = "smarc_8m_imx_4.14.98_2.0.0_ga"
  17 +
  18 +LOCALVERSION = "-${SRCBRANCH}"
  19 +KERNEL_DEFCONFIG = "${S}/arch/arm64/configs/smarcimx8m_defconfig"
  20 +DEFAULT_DTB = "fsl-smarcimx8mq"
  21 +
  22 +KERNEL_SRC ?= "git@git.embedian.com:developer/smarc-fsl-linux-kernel.git;protocol=git"
  23 +SRC_URI = "${EMB_KERNEL_MIRROR};protocol=ssh;branch=${SRCBRANCH}"
  24 +SRCREV = "eded7c98ab8eccc988eddf2dcbca68c937c324e8"
  25 +
  26 +S = "${WORKDIR}/git"
  27 +
  28 +addtask copy_defconfig after do_unpack before do_preconfigure
  29 +do_copy_defconfig () {
  30 + install -d ${B}
  31 + mkdir -p ${B}
  32 + cp ${KERNEL_DEFCONFIG} ${B}/.config
  33 + cp ${KERNEL_DEFCONFIG} ${B}/../defconfig
  34 +}
  35 +
  36 +pkg_postinst_kernel-devicetree_append_mx8 () {
  37 + cd $D/boot
  38 + ln -s ${DEFAULT_DTB}.dtb ${UBOOT_DTB_NAME}
  39 +}
  40 +
  41 +COMPATIBLE_MACHINE = "(mx6|mx7|mx8)"
  42 +EXTRA_OEMAKE_append_mx8 = " ARCH=arm64"
scripts/emb_mk_yocto_sdcard/README.txt
  1 +How to use the Embedian SD card creation script:
  2 +=================================================
  3 +
  4 +This utility is provided on an "AS IS" basis.
  5 +This is the script we use to create our recovery SD card.
  6 +For machines with Android support, it is a part of a larger script we use to create our recovery SD card, which also includes Android.
  7 +It is a good example for using the output of the Yocto build to create a bootable SD card, and use it to flash the target NAND flash/eMMC.
  8 +
  9 +Note:
  10 +Before running this script you need to bitbake fsl-image-gui.
  11 +
  12 +
  13 +Usage:
  14 +sudo MACHINE=<smarcimx8m2g|smarcimx8m4g> ./emb-create-yocto-sdcard.sh [options] /dev/sdX
  15 +(Change /dev/sdX to your device name)
  16 +
  17 +options:
  18 + -h Display help message
  19 + -s Only show partition sizes to be written, without actually write them
  20 + -a Automatically set the rootfs partition size to fill the SD card
  21 + -r Select alternative rootfs for recovery images (default: build_x11/tmp/deploy/images/<machine name>/fsl-image-validation-imx.tar.bz2)
  22 +
  23 +If you don't use the '-a' option, a default rootfs size of 3700MiB will be used.
  24 +The '-r' option allows you to create a bootable sdcard with an alternative image for the installation to NAND flash or eMMC.
  25 +Example: "-r tmp/deploy/images/<machine name>/fsl-image-qt5-validation-imx" -- selects the "Qt5 image with X11" recovery image
  26 +
  27 +
  28 +Once the script is done, use the SD card to boot, and then to flash your internal storage/s either use the icons,
  29 +or the following linux shell script:
  30 +install_yocto.sh
scripts/emb_mk_yocto_sdcard/emb-create-yocto-emmc.sh
  1 +#!/bin/bash -e
  2 +
  3 +blue_underlined_bold_echo()
  4 +{
  5 + echo -e "\e[34m\e[4m\e[1m$@\e[0m"
  6 +}
  7 +
  8 +blue_bold_echo()
  9 +{
  10 + echo -e "\e[34m\e[1m$@\e[0m"
  11 +}
  12 +
  13 +red_bold_echo()
  14 +{
  15 + echo -e "\e[31m\e[1m$@\e[0m"
  16 +}
  17 +
  18 +IMGS_PATH=/opt/images/Yocto
  19 +UBOOT_IMAGE=imx-boot-sd.bin
  20 +KERNEL_IMAGE=Image
  21 +ROOTFS_IMAGE=rootfs.tar.bz2
  22 +BOOTLOADER_RESERVED_SIZE=2
  23 +PART1_SIZE=48
  24 +BOOTLOADER_OFFSET=33
  25 +DISPLAY=-hdmi
  26 +PART=p
  27 +BOOTPART=1
  28 +ROOTFSPART=2
  29 +BOOTDIR=/boot
  30 +
  31 +check_board()
  32 +{
  33 + if grep -q "i.MX8M" /sys/devices/soc0/soc_id; then
  34 + BOARD=smarc-imx8m
  35 + DTB_PREFIX=fsl-smarcimx8mq
  36 + BLOCK=mmcblk0
  37 +
  38 + if [[ $DISPLAY != "-lvds" && $DISPLAY != "-hdmi" && \
  39 + $DISPLAY != "-dual-display" && $DISPLAY != "" ]]; then
  40 + red_bold_echo "ERROR: invalid display, should be lvds, hdmi, dual-display or empty"
  41 + exit 1
  42 + fi
  43 + else
  44 + red_bold_echo "ERROR: Unsupported board"
  45 + exit 1
  46 + fi
  47 +
  48 +
  49 + if [[ ! -b /dev/${BLOCK} ]] ; then
  50 + red_bold_echo "ERROR: Can't find eMMC device (/dev/${BLOCK})."
  51 + red_bold_echo "Please verify you are using the correct options for your SMARC Module."
  52 + exit 1
  53 + fi
  54 +}
  55 +
  56 +check_images()
  57 +{
  58 + if [[ ! -f $IMGS_PATH/$UBOOT_IMAGE ]] ; then
  59 + red_bold_echo "ERROR: \"$IMGS_PATH/$UBOOT_IMAGE\" does not exist"
  60 + exit 1
  61 + fi
  62 +
  63 + if [[ ! -f $IMGS_PATH/$KERNEL_IMAGE ]] ; then
  64 + red_bold_echo "ERROR: \"$IMGS_PATH/$KERNEL_IMAGE\" does not exist"
  65 + exit 1
  66 + fi
  67 +
  68 + if [[ ! -f $IMGS_PATH/${DTB_PREFIX}${DISPLAY}.dtb ]] ; then
  69 + red_bold_echo "ERROR: \"$IMGS_PATH/${DTB_PREFIX}${DISPLAY}.dtb\" does not exist"
  70 + exit 1
  71 + fi
  72 +
  73 + if [[ ! -f $IMGS_PATH/uEnv.txt ]] ; then
  74 + red_bold_echo "ERROR: \"$IMGS_PATH/uEnv.txt\" does not exist"
  75 + exit 1
  76 + fi
  77 +
  78 + if [[ ! -f $IMGS_PATH/$ROOTFS_IMAGE ]] ; then
  79 + red_bold_echo "ERROR: \"$IMGS_PATH/$ROOTFS_IMAGE\" does not exist"
  80 + exit 1
  81 + fi
  82 +}
  83 +
  84 +delete_emmc()
  85 +{
  86 + echo
  87 + blue_underlined_bold_echo "Deleting current partitions"
  88 +
  89 + umount /dev/${BLOCK}${PART}* 2>/dev/null || true
  90 +
  91 + for ((i=1; i<=16; i++)); do
  92 + if [[ -e /dev/${BLOCK}${PART}${i} ]]; then
  93 + dd if=/dev/zero of=/dev/${BLOCK}${PART}${i} bs=1M count=1 2>/dev/null || true
  94 + fi
  95 + done
  96 + sync
  97 +
  98 + dd if=/dev/zero of=/dev/${BLOCK} bs=1M count=${BOOTLOADER_RESERVED_SIZE}
  99 +
  100 + sync; sleep 1
  101 +}
  102 +
  103 +create_emmc_parts()
  104 +{
  105 + echo
  106 + blue_underlined_bold_echo "Creating new partitions"
  107 +
  108 + SECT_SIZE_BYTES=`cat /sys/block/${BLOCK}/queue/hw_sector_size`
  109 + PART1_FIRST_SECT=$(($BOOTLOADER_RESERVED_SIZE * 1024 * 1024 / $SECT_SIZE_BYTES))
  110 + PART1_END_SECT=$((($BOOTLOADER_RESERVED_SIZE + $PART1_SIZE) * 1024 * 1024 / $SECT_SIZE_BYTES))
  111 + PART2_FIRST_SECT=`expr ${PART1_END_SECT} + 1`
  112 +
  113 + (echo n; echo p; echo $BOOTPART; echo $PART1_FIRST_SECT; \
  114 + echo $PART1_END_SECT; echo n; echo p; echo $ROOTFSPART; \
  115 + echo $PART2_FIRST_SECT; echo; \
  116 + echo p; echo w) | fdisk -u /dev/${BLOCK} > /dev/null
  117 +
  118 + sync; sleep 1
  119 + fdisk -u -l /dev/${BLOCK}
  120 +}
  121 +
  122 +format_emmc_parts()
  123 +{
  124 + echo
  125 + blue_underlined_bold_echo "Formatting partitions"
  126 +
  127 + mkfs.vfat -F 16 /dev/${BLOCK}${PART}${BOOTPART} -n boot
  128 + mkfs.ext4 /dev/${BLOCK}${PART}${ROOTFSPART} -L rootfs
  129 +
  130 + sync; sleep 1
  131 +}
  132 +
  133 +install_bootloader_to_emmc()
  134 +{
  135 + echo
  136 + blue_underlined_bold_echo "Installing booloader"
  137 +
  138 + dd if=${IMGS_PATH}/${UBOOT_IMAGE} of=/dev/${BLOCK} bs=1K seek=${BOOTLOADER_OFFSET}
  139 + sync
  140 +}
  141 +
  142 +install_kernel_to_emmc()
  143 +{
  144 + echo
  145 + blue_underlined_bold_echo "Installing kernel"
  146 +
  147 + MOUNTDIR=/run/media/${BLOCK}${PART}${BOOTPART}
  148 + mkdir -p ${MOUNTDIR}
  149 + mount /dev/${BLOCK}${PART}${BOOTPART} ${MOUNTDIR}
  150 + mkdir -p ${MOUNTDIR}/dtbs/
  151 + cp -v ${IMGS_PATH}/${KERNEL_IMAGE} ${MOUNTDIR}
  152 + cp -v ${IMGS_PATH}/${DTB_PREFIX}${DISPLAY}.dtb ${MOUNTDIR}/dtbs/fsl-smarcimx8mq.dtb
  153 + cp -v ${IMGS_PATH}/uEnv.txt ${MOUNTDIR}
  154 +
  155 + echo
  156 + sync
  157 +
  158 + umount ${MOUNTDIR}
  159 +}
  160 +
  161 +install_rootfs_to_emmc()
  162 +{
  163 + echo
  164 + blue_underlined_bold_echo "Installing rootfs"
  165 +
  166 + MOUNTDIR=/run/media/${BLOCK}${PART}${ROOTFSPART}
  167 + mkdir -p ${MOUNTDIR}
  168 + mount /dev/${BLOCK}${PART}${ROOTFSPART} ${MOUNTDIR}
  169 +
  170 + printf "Extracting files"
  171 + tar --warning=no-timestamp -jxvf ${IMGS_PATH}/${ROOTFS_IMAGE} -C ${MOUNTDIR} --checkpoint=.1200
  172 +
  173 + # Create DTB symlink
  174 + (cd ${MOUNTDIR}/${BOOTDIR}; ln -fs ${DTB_PREFIX}${DISPLAY}.dtb ${DTB_PREFIX}.dtb)
  175 +
  176 + echo
  177 + sync
  178 +
  179 + umount ${MOUNTDIR}
  180 +}
  181 +
  182 +stop_udev()
  183 +{
  184 + if [ -f /lib/systemd/system/systemd-udevd.service ]; then
  185 + systemctl -q mask --runtime systemd-udevd
  186 + systemctl -q stop systemd-udevd
  187 + fi
  188 +}
  189 +
  190 +start_udev()
  191 +{
  192 + if [ -f /lib/systemd/system/systemd-udevd.service ]; then
  193 + systemctl -q unmask --runtime systemd-udevd
  194 + systemctl -q start systemd-udevd
  195 + fi
  196 +}
  197 +
  198 +usage()
  199 +{
  200 + echo
  201 + echo "This script installs Yocto Rootfs on the SMARC-iMX8M's internal eMMC storage device"
  202 + echo
  203 + echo " Usage: $(basename $0) <option>"
  204 + echo
  205 + echo " options:"
  206 + echo " -h show help message"
  207 + echo " -d <lvds|hdmi|dual-display> set display type, default is lvds"
  208 + echo
  209 +}
  210 +
  211 +finish()
  212 +{
  213 + echo
  214 + blue_bold_echo "Yocto Sumo installed successfully"
  215 + exit 0
  216 +}
  217 +
  218 +#################################################
  219 +# Execution starts here #
  220 +#################################################
  221 +
  222 +if [[ $EUID != 0 ]] ; then
  223 + red_bold_echo "This script must be run with super-user privileges"
  224 + exit 1
  225 +fi
  226 +
  227 +blue_underlined_bold_echo "*** Embedian SMARC-iMX8M on-module eMMC Recovery ***"
  228 +echo
  229 +
  230 +while getopts d:h OPTION;
  231 +do
  232 + case $OPTION in
  233 + d)
  234 + DISPLAY=$OPTARG
  235 + ;;
  236 + h)
  237 + usage
  238 + exit 0
  239 + ;;
  240 + *)
  241 + usage
  242 + exit 1
  243 + ;;
  244 + esac
  245 +done
  246 +
  247 +printf "Board: "
  248 +blue_bold_echo $BOARD
  249 +
  250 +printf "Installing to internal storage device: "
  251 +blue_bold_echo eMMC
  252 +
  253 +check_board
  254 +check_images
  255 +stop_udev
  256 +delete_emmc
  257 +create_emmc_parts
  258 +format_emmc_parts
  259 +install_bootloader_to_emmc
  260 +install_kernel_to_emmc
  261 +install_rootfs_to_emmc
  262 +start_udev
  263 +finish
scripts/emb_mk_yocto_sdcard/emb-create-yocto-sdcard.sh
  1 +#!/bin/bash
  2 +set -e
  3 +
  4 +#### Script version ####
  5 +SCRIPT_NAME=${0##*/}
  6 +readonly SCRIPT_VERSION="0.7"
  7 +
  8 +#### Exports Variables ####
  9 +#### global variables ####
  10 +readonly ABSOLUTE_FILENAME=`readlink -e "$0"`
  11 +readonly ABSOLUTE_DIRECTORY=`dirname ${ABSOLUTE_FILENAME}`
  12 +readonly SCRIPT_POINT=${ABSOLUTE_DIRECTORY}
  13 +readonly SCRIPT_START_DATE=`date +%Y%m%d`
  14 +
  15 +readonly YOCTO_ROOT="${SCRIPT_POINT}/../../../../"
  16 +
  17 +readonly BSP_TYPE="YOCTO"
  18 +readonly YOCTO_BUILD=${YOCTO_ROOT}/imx8m-build-qt5wayland
  19 +readonly YOCTO_DEFAULT_IMAGE=fsl-image-qt5-validation-imx
  20 +
  21 +readonly YOCTO_SCRIPTS_PATH=${SCRIPT_POINT}
  22 +readonly YOCTO_IMGS_PATH=${YOCTO_BUILD}/tmp/deploy/images/${MACHINE}
  23 +
  24 +## display (one of "-hdmi", "-lcdif-lvds", "-dp", "-dcss-lvds", "-dual-display", "-edp")
  25 +readonly DISPLAY="-hdmi"
  26 +
  27 +# $1 -- block device
  28 +# $2 -- output images dir
  29 +readonly LPARAM_BLOCK_DEVICE=${1}
  30 +readonly LPARAM_OUTPUT_DIR=${2}
  31 +readonly P1_MOUNT_DIR="${G_TMP_DIR}/p1"
  32 +readonly P2_MOUNT_DIR="${G_TMP_DIR}/p2"
  33 +
  34 +readonly BOOTLOAD_RESERVE_SIZE=2
  35 +readonly PART1_SIZE=48
  36 +readonly BOOTPART=1
  37 +readonly ROOTFSPART=2
  38 +readonly SPARE_SIZE=4
  39 +
  40 +# Sizes are in MiB
  41 +BOOTLOADER_OFFSET=33
  42 +
  43 +AUTO_FILL_SD=0
  44 +LOOP_MAJOR=7
  45 +
  46 +# This function performs sanity check to verify that the target device is removable devise of proper size
  47 +function check_device()
  48 +{
  49 + # Check that parameter is a valid block device
  50 + if [ ! -b "$1" ]; then
  51 + echo "$1 is not a valid block device, exiting"
  52 + exit 1
  53 + fi
  54 +
  55 + local dev=$(basename $1)
  56 +
  57 + # Check that /sys/block/$dev exists
  58 + if [ ! -d /sys/block/$dev ]; then
  59 + echo "Directory /sys/block/${dev} missing, exiting"
  60 + exit 1
  61 + fi
  62 +
  63 + # Get device parameters
  64 + local removable=$(cat /sys/block/${dev}/removable)
  65 + local size_bytes=$((512*$(cat /sys/class/block/${dev}/size)))
  66 + local size_gb=$((size_bytes/1000000000))
  67 +
  68 + # Non-removable SD card readers require additional check
  69 + if [ "${removable}" != "1" ]; then
  70 + local drive=$(udisksctl info -b /dev/${dev}|grep "Drive:"|cut -d"'" -f 2)
  71 + local mediaremovable=$(gdbus call --system --dest org.freedesktop.UDisks2 \
  72 + --object-path ${drive} --method org.freedesktop.DBus.Properties.Get \
  73 + org.freedesktop.UDisks2.Drive MediaRemovable)
  74 + if [[ "${mediaremovable}" = *"true"* ]]; then
  75 + removable=1
  76 + fi
  77 + fi
  78 +
  79 + # Check that device is either removable or loop
  80 + if [ "$removable" != "1" -a $(stat -c '%t' /dev/$dev) != ${LOOP_MAJOR} ]; then
  81 + echo "$1 is not a removable device, exiting"
  82 + exit 1
  83 + fi
  84 +
  85 + # Check that device is attached
  86 + if [ ${size_bytes} -eq 0 ]; then
  87 + echo "$1 is not attached, exiting"
  88 + exit 1
  89 + fi
  90 +
  91 + # Check that device has a valid size
  92 + echo "Detected removable device $1, size=${size_gb}GB"
  93 +}
  94 +
  95 +YOCTO_RECOVERY_ROOTFS_PATH=${YOCTO_IMGS_PATH}
  96 +
  97 +echo "================================================"
  98 +echo "= Embedian recovery SD card creation script ="
  99 +echo "================================================"
  100 +
  101 +help() {
  102 + bn=`basename $0`
  103 + echo " Usage: MACHINE=<smarcimx8m2g|smarcimx8m4g> $bn <options> device_node"
  104 + echo
  105 + echo " options:"
  106 + echo " -h display this Help message"
  107 + echo " -s only Show partition sizes to be written, without actually write them"
  108 + echo " -a Automatically set the rootfs partition size to fill the SD card (leaving spare ${SPARE_SIZE}MiB)"
  109 + echo " -r ROOTFS_NAME select an alternative Rootfs for recovery images"
  110 + echo " (default: \"${YOCTO_RECOVERY_ROOTFS_PATH}/${YOCTO_DEFAULT_IMAGE}\")"
  111 + echo " -n TEXT_FILE add a release Notes text file"
  112 + echo
  113 +}
  114 +
  115 +if [[ $EUID -ne 0 ]] ; then
  116 + echo "This script must be run with super-user privileges"
  117 + exit 1
  118 +fi
  119 +
  120 +if [[ $MACHINE != "smarcimx8m2g" && $MACHINE != "smarcimx8m4g" ]] ; then
  121 + help
  122 + exit 1
  123 +fi
  124 +
  125 +
  126 +# Parse command line
  127 +moreoptions=1
  128 +node="na"
  129 +cal_only=0
  130 +
  131 +while [ "$moreoptions" = 1 -a $# -gt 0 ]; do
  132 + case $1 in
  133 + -h) help; exit 3 ;;
  134 + -s) cal_only=1 ;;
  135 + -a) AUTO_FILL_SD=1 ;;
  136 + -r) shift;
  137 + YOCTO_RECOVERY_ROOTFS_MASK_PATH=`readlink -e "${1}.tar.bz2"`;
  138 + YOCTO_RECOVERY_ROOTFS_PATH=`dirname ${YOCTO_RECOVERY_ROOTFS_MASK_PATH}`
  139 + YOCTO_RECOVERY_ROOTFS_BASE_IN_NAME=`basename ${1}`
  140 + ;;
  141 + -n) shift;
  142 + RELEASE_NOTES_FILE=${1}
  143 + ;;
  144 + *) moreoptions=0;;
  145 + esac
  146 + [ "$moreoptions" = 0 ] && [ $# -gt 1 ] && help && exit 1
  147 + [ "$moreoptions" = 1 ] && shift
  148 +done
  149 +
  150 + part=""
  151 + if [ `echo ${LPARAM_BLOCK_DEVICE} | grep -c mmcblk` -ne 0 ]; then
  152 + part="p"
  153 + fi
  154 +
  155 +# allow only removable/loopback devices, to protect host PC
  156 +echo "MACHINE=${MACHINE}"
  157 +echo "SD card rootfs: ${YOCTO_DEFAULT_IMAGE}"
  158 +echo "Recovery rootfs: ${YOCTO_DEFAULT_IMAGE}"
  159 +echo "================================================"
  160 +check_device ${LPARAM_BLOCK_DEVICE}
  161 +echo "================================================"
  162 +read -p "Press Enter to continue"
  163 +
  164 +function delete_device
  165 +{
  166 + echo
  167 + echo "Deleting current partitions"
  168 + for ((i=0; i<10; i++))
  169 + do
  170 + if [ `ls ${LPARAM_BLOCK_DEVICE}${part}$i 2> /dev/null | grep -c ${LPARAM_BLOCK_DEVICE}${part}$i` -ne 0 ]; then
  171 + dd if=/dev/zero of=${LPARAM_BLOCK_DEVICE}${part}$i bs=512 count=1024
  172 + fi
  173 + done
  174 + sync
  175 +
  176 + ((echo d; echo 1; echo d; echo 2; echo d; echo 3; echo d; echo w) | fdisk ${LPARAM_BLOCK_DEVICE} &> /dev/null) || true
  177 + sync
  178 +
  179 + dd if=/dev/zero of=${LPARAM_BLOCK_DEVICE} bs=1M count=${BOOTLOAD_RESERVE_SIZE}
  180 + sync; sleep 1
  181 +}
  182 +
  183 +function ceildiv
  184 +{
  185 + local num=$1
  186 + local div=$2
  187 + echo $(( (num + div - 1) / div ))
  188 +}
  189 +
  190 +function create_parts
  191 +{
  192 + echo
  193 + echo "Creating new partitions"
  194 + # Get total card size
  195 + TOTAL_SIZE=`fdisk -s ${LPARAM_BLOCK_DEVICE}`
  196 + TOTAL_SIZE=`expr ${TOTAL_SIZE} / 1024`
  197 + ROOTFS_SIZE=`expr ${TOTAL_SIZE} - ${BOOTLOAD_RESERVE_SIZE} - ${PART1_SIZE} - ${SPARE_SIZE}`
  198 +
  199 + echo "ROOT SIZE=${ROOTFS_SIZE} TOTAl SIZE=${TOTAL_SIZE}"
  200 +
  201 + BLOCK=`echo ${LPARAM_BLOCK_DEVICE} | cut -d "/" -f 3`
  202 + SECT_SIZE_BYTES=`cat /sys/block/${BLOCK}/queue/physical_block_size`
  203 +
  204 + BOOTLOAD_RESERVE_SIZE_BYTES=$((BOOTLOAD_RESERVE_SIZE * 1024 * 1024))
  205 + PART1_SIZE_BYTES=$((PART1_SIZE * 1024 * 1024))
  206 + PART1_END_BYTES=`expr ${BOOTLOAD_RESERVE_SIZE_BYTES} + ${PART1_SIZE_BYTES}`
  207 + ROOTFS_SIZE_BYTES=$((ROOTFS_SIZE * 1024 * 1024))
  208 +
  209 + PART1_FIRST_SECT=`ceildiv ${BOOTLOAD_RESERVE_SIZE_BYTES} ${SECT_SIZE_BYTES}`
  210 + PART1_END_SECT=`ceildiv ${PART1_END_BYTES} ${SECT_SIZE_BYTES}`
  211 + PART2_FIRST_SECT=`expr ${PART1_END_SECT} + 1 `
  212 +
  213 + (echo n; echo p; echo $BOOTPART; echo $PART1_FIRST_SECT; \
  214 + echo $PART1_END_SECT; echo n; echo p; echo $ROOTFSPART; \
  215 + echo $PART2_FIRST_SECT; echo; echo p; echo w) | fdisk -u ${LPARAM_BLOCK_DEVICE} > /dev/null
  216 +
  217 + sleep 2; sync;
  218 + fdisk -l ${LPARAM_BLOCK_DEVICE}
  219 +
  220 + sleep 2; sync;
  221 +}
  222 +
  223 +function format_parts
  224 +{
  225 + echo
  226 + echo "Formatting partitions"
  227 + mkfs.vfat -F 16 ${LPARAM_BLOCK_DEVICE}${part}1 -n boot
  228 + mkfs.ext4 ${LPARAM_BLOCK_DEVICE}${part}2 -L rootfs
  229 + sync; sleep 1
  230 +}
  231 +
  232 +function install_bootloader
  233 +{
  234 + echo
  235 + echo "Installing U-Boot"
  236 + dd if=${YOCTO_IMGS_PATH}/imx-boot-${MACHINE}-sd.bin-flash_evk of=${LPARAM_BLOCK_DEVICE} bs=1K seek=${BOOTLOADER_OFFSET}; sync
  237 +}
  238 +
  239 +function mount_parts
  240 +{
  241 + mkdir -p ${P1_MOUNT_DIR}
  242 + mkdir -p ${P2_MOUNT_DIR}
  243 + sync
  244 +
  245 + mount ${LPARAM_BLOCK_DEVICE}${part}1 ${P1_MOUNT_DIR}
  246 + mount ${LPARAM_BLOCK_DEVICE}${part}2 ${P2_MOUNT_DIR}
  247 + sleep 2; sync;
  248 +}
  249 +
  250 +function unmount_parts
  251 +{
  252 + umount ${P1_MOUNT_DIR}
  253 + umount ${P2_MOUNT_DIR}
  254 +
  255 + rm -rf ${P1_MOUNT_DIR}
  256 + rm -rf ${P2_MOUNT_DIR}
  257 +}
  258 +
  259 +function install_yocto
  260 +{
  261 + echo
  262 + echo "Flashing \"Image, device tree and uEnv.txt\" partition"
  263 + cp -v ${YOCTO_IMGS_PATH}/Image ${P1_MOUNT_DIR}/
  264 + mkdir -p ${P1_MOUNT_DIR}/dtbs/
  265 + cp -v ${YOCTO_IMGS_PATH}/fsl-smarcimx8mq${DISPLAY}.dtb ${P1_MOUNT_DIR}/dtbs/fsl-smarcimx8mq.dtb
  266 + cp -v ${YOCTO_SCRIPTS_PATH}/uEnv.txt ${P1_MOUNT_DIR}/
  267 +
  268 + echo
  269 + echo "Installing Yocto Root File System"
  270 + tar jxvf ${YOCTO_IMGS_PATH}/${YOCTO_DEFAULT_IMAGE}-${MACHINE}.tar.bz2 -C ${P2_MOUNT_DIR}/
  271 + sync
  272 +}
  273 +
  274 +function copy_images
  275 +{
  276 + echo
  277 + echo "Copying Yocto images to /opt/images/"
  278 + mkdir -p ${P2_MOUNT_DIR}/opt/images/Yocto
  279 +
  280 + # Copy image for eMMC
  281 + if [ -f ${YOCTO_IMGS_PATH}/${YOCTO_DEFAULT_IMAGE}-${MACHINE}.tar.bz2 ]; then
  282 + pv ${YOCTO_IMGS_PATH}/${YOCTO_DEFAULT_IMAGE}-${MACHINE}.tar.bz2 > ${P2_MOUNT_DIR}/opt/images/Yocto/rootfs.tar.bz2
  283 + else
  284 + echo "rootfs.tar.gz file is not present. Installation on \"eMMC\" will not be supported."
  285 + fi
  286 +
  287 + echo
  288 + echo "Copying Kernel Images to /opt/images/"
  289 + cp ${YOCTO_IMGS_PATH}/Image ${P2_MOUNT_DIR}/opt/images/Yocto/Image
  290 +
  291 + echo
  292 + echo "Copying Kernel Device Tree Blob to /opt/images/"
  293 + cp -v ${YOCTO_IMGS_PATH}/*.dtb ${P2_MOUNT_DIR}/opt/images/Yocto/
  294 +
  295 + echo
  296 + echo "Copying Kernel Parameter uEnv.txt to /opt/images/"
  297 + cp -v ${YOCTO_SCRIPTS_PATH}/uEnv_emmc.txt ${P2_MOUNT_DIR}/opt/images/Yocto/uEnv.txt
  298 +
  299 + if [[ $MACHINE = "smarcimx8m2g" || ${MACHINE} = "smarcimx8m4g" ]]; then
  300 + cp ${YOCTO_IMGS_PATH}/imx-boot-${MACHINE}-sd.bin-* ${P2_MOUNT_DIR}/opt/images/Yocto
  301 + (cd ${P2_MOUNT_DIR}/opt/images/Yocto; ln -fs imx-boot-${MACHINE}-sd.bin-flash_evk imx-boot-sd.bin)
  302 + else
  303 + cp ${YOCTO_IMGS_PATH}/imx-boot-${MACHINE}-sd.bin ${P2_MOUNT_DIR}/opt/images/Yocto/imx-boot-sd.bin
  304 + fi
  305 +}
  306 +
  307 +function copy_scripts
  308 +{
  309 + echo
  310 + echo "Copying scripts"
  311 +
  312 + cp ${YOCTO_SCRIPTS_PATH}/emb-create-yocto-emmc.sh ${P2_MOUNT_DIR}/usr/bin/
  313 +}
  314 +
  315 +umount ${LPARAM_BLOCK_DEVICE}${part}* 2> /dev/null || true
  316 +
  317 +delete_device
  318 +create_parts
  319 +format_parts
  320 +
  321 +mount_parts
  322 +install_yocto
  323 +copy_images
  324 +copy_scripts
  325 +
  326 +echo
  327 +echo "Syncing"
  328 +sync | pv -t
  329 +
  330 +unmount_parts
  331 +
  332 +install_bootloader
  333 +
  334 +echo
  335 +echo "Done"
  336 +echo "========Flash to SD card Completed!========="
  337 +
  338 +exit 0
scripts/emb_mk_yocto_sdcard/uEnv.txt
  1 +optargs="video=HDMI-A-1:1920x1080-32@60 consoleblank=0"
  2 +#optargs="video=HDMI-A-1:3840x2160-32@30 consoleblank=0"
  3 +#optargs="video=HDMI-A-1:3840x2160-32@60 consoleblank=0"
  4 +#console port SER3
  5 +console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200
  6 +#console port SER2
  7 +#console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200
  8 +#console port SER1
  9 +#console=ttymxc2,115200 earlycon=ec_imx6q,0x30880000,115200
  10 +#console port SER0
  11 +#console=ttymxc3,115200 earlycon=ec_imx6q,0x30A60000,115200
  12 +mmcdev=1
  13 +mmcpart=1
  14 +image=Image
  15 +loadaddr=0x40480000
  16 +fdt_addr=0x43000000
  17 +mmcroot=/dev/mmcblk1p2 rw
  18 +usbroot=/dev/sda2 rw
  19 +mmcrootfstype=ext4 rootwait fixrtc
  20 +netdev=eth0
  21 +ethact=FEC0
  22 +ipaddr=192.168.1.150
  23 +serverip=192.168.1.53
  24 +gatewayip=192.168.1.254
  25 +mmcargs=setenv bootargs console=${console} root=${mmcroot} rootfstype=${mmcrootfstype} ${optargs}
  26 +uenvcmd=run loadimage; run loadfdt; run mmcboot
  27 +# USB Boot
  28 +#usbargs=setenv bootargs console=${console} root=${usbroot} rootfstype=${mmcrootfstype} ${optargs}
  29 +#uenvcmd=run loadusbimage; run loadusbfdt; run usbboot
scripts/emb_mk_yocto_sdcard/uEnv_emmc.txt
  1 +optargs="video=HDMI-A-1:1920x1080-32@60 consoleblank=0"
  2 +#optargs="video=HDMI-A-1:3840x2160-32@30 consoleblank=0"
  3 +#optargs="video=HDMI-A-1:3840x2160-32@60 consoleblank=0"
  4 +#console port SER3
  5 +console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200
  6 +#console port SER2
  7 +#console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200
  8 +#console port SER1
  9 +#console=ttymxc2,115200 earlycon=ec_imx6q,0x30880000,115200
  10 +#console port SER0
  11 +#console=ttymxc3,115200 earlycon=ec_imx6q,0x30A60000,115200
  12 +mmcdev=0
  13 +mmcpart=1
  14 +image=Image
  15 +loadaddr=0x40480000
  16 +fdt_addr=0x43000000
  17 +mmcroot=/dev/mmcblk0p2 rw
  18 +usbroot=/dev/sda2 rw
  19 +mmcrootfstype=ext4 rootwait fixrtc
  20 +netdev=eth0
  21 +ethact=FEC0
  22 +ipaddr=192.168.1.150
  23 +serverip=192.168.1.53
  24 +gatewayip=192.168.1.254
  25 +mmcargs=setenv bootargs console=${console} root=${mmcroot} rootfstype=${mmcrootfstype} ${optargs}
  26 +uenvcmd=run loadimage; run loadfdt; run mmcboot
  27 +# USB Boot
  28 +#usbargs=setenv bootargs console=${console} root=${usbroot} rootfstype=${mmcrootfstype} ${optargs}
  29 +#uenvcmd=run loadusbimage; run loadusbfdt; run usbboot