Commit 632c1e3a66efe949ed0978f80d2aebccd0b17c93
1 parent
42b7ca7de6
Exists in
8mq_5.10.9_1.0.0_gatesgarth
Yocto Gatesgarth meta layer support for SMARC-iMX8MQ, Initial Release
Showing 15 changed files with 443 additions and 34 deletions Inline Diff
- conf/layer.conf
- conf/machine/include/smarc-common.inc
- conf/machine/smarcimx8mq2g.conf
- conf/machine/smarcimx8mq4g.conf
- recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend
- recipes-bsp/imx-vpu-hantro-vc/imx-vpu-hantro-vc_1.3.0.bbappend
- recipes-bsp/u-boot/u-boot-smarcimx8mq_2020.04.bb
- recipes-core/base-files/base-files_%.bbappend
- recipes-core/udev/udev-rules-imx.bbappend
- recipes-kernel/linux/linux-smarcimx8mq_5.10.bb
- scripts/emb_mk_yocto_sdcard/README.txt
- scripts/emb_mk_yocto_sdcard/emb-create-yocto-emmc.sh
- scripts/emb_mk_yocto_sdcard/emb-create-yocto-sdcard.sh
- scripts/emb_mk_yocto_sdcard/uEnv.txt
- scripts/emb_mk_yocto_sdcard/uEnv_emmc.txt
conf/layer.conf
1 | # We have a conf and classes directory, add to BBPATH | 1 | # We have a conf and classes directory, add to BBPATH |
2 | BBPATH .= ":${LAYERDIR}" | 2 | BBPATH .= ":${LAYERDIR}" |
3 | 3 | ||
4 | # We have a packages directory, add to BBFILES | 4 | # We have a packages directory, add to BBFILES |
5 | BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ | 5 | BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ |
6 | ${LAYERDIR}/recipes-*/*/*.bbappend" | 6 | ${LAYERDIR}/recipes-*/*/*.bbappend" |
7 | 7 | ||
8 | BBFILE_COLLECTIONS += "smarcimx8mp" | 8 | BBFILE_COLLECTIONS += "smarcimx8mq" |
9 | BBFILE_PATTERN_smarcimx8mp := "^${LAYERDIR}/" | 9 | BBFILE_PATTERN_smarcimx8mq := "^${LAYERDIR}/" |
10 | BBFILE_PRIORITY_smarcimx8mp = "12" | 10 | BBFILE_PRIORITY_smarcimx8mq = "13" |
11 | LAYERSERIES_COMPAT_smarcimx8mp = "warrior zeus gatesgarth" | 11 | LAYERSERIES_COMPAT_smarcimx8mq = "warrior zeus gatesgarth" |
12 | 12 | ||
13 | # Define new EULAs and add them to the list defined in meta-freescale. | 13 | # Define new EULAs and add them to the list defined in meta-freescale. |
14 | # See fsl-eula-unpack.bbclass. | 14 | # See fsl-eula-unpack.bbclass. |
15 | FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V13 = "1b4db4b25c3a1e422c0c0ed64feb65d2" | 15 | FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V13 = "1b4db4b25c3a1e422c0c0ed64feb65d2" |
16 | FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V16 = "e9e880185bda059c90c541d40ceca922" | 16 | FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V16 = "e9e880185bda059c90c541d40ceca922" |
17 | FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V17 = "cf3f9b8d09bc3926b1004ea71f7a248a" | 17 | FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V17 = "cf3f9b8d09bc3926b1004ea71f7a248a" |
18 | FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V18 = "231e11849a4331fcbb19d7f4aab4a659" | 18 | FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V18 = "231e11849a4331fcbb19d7f4aab4a659" |
19 | FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V19 = "a632fefd1c359980434f9389833cab3a" | 19 | FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V19 = "a632fefd1c359980434f9389833cab3a" |
20 | 20 | ||
21 | FSL_EULA_FILE_MD5SUMS_append = " \ | 21 | FSL_EULA_FILE_MD5SUMS_append = " \ |
22 | ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V13} \ | 22 | ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V13} \ |
23 | ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V16} \ | 23 | ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V16} \ |
24 | ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V17} \ | 24 | ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V17} \ |
25 | ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V18} \ | 25 | ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V18} \ |
26 | ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V19} \ | 26 | ${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V19} \ |
27 | " | 27 | " |
28 | 28 | ||
29 | # Override the EULA defined in meta-freescale. | 29 | # Override the EULA defined in meta-freescale. |
30 | FSL_EULA_FILE = "${LAYERDIR}/../EULA.txt" | 30 | FSL_EULA_FILE = "${LAYERDIR}/../EULA.txt" |
31 | FSL_EULA_FILE_MD5SUM = "${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V19}" | 31 | FSL_EULA_FILE_MD5SUM = "${FSL_EULA_FILE_MD5SUM_LA_OPT_NXP_SOFTWARE_LICENSE_V19}" |
32 | 32 | ||
33 | HOSTTOOLS_NONFATAL_append = " bc rsync xxd" | 33 | HOSTTOOLS_NONFATAL_append = " bc rsync xxd" |
34 | 34 | ||
35 | EMB_UBOOT_MIRROR ?= "git://git@git.embedian.com/developer/smarc-t335x-uboot.git" | 35 | EMB_UBOOT_MIRROR ?= "git://git@git.embedian.com/developer/smarc-t335x-uboot.git" |
36 | EMB_KERNEL_MIRROR ?= "git://git@git.embedian.com/developer/smarc-fsl-linux-kernel.git" | 36 | EMB_KERNEL_MIRROR ?= "git://git@git.embedian.com/developer/smarc-fsl-linux-kernel.git" |
37 | 37 | ||
38 | MIRRORS += " \ | 38 | MIRRORS += " \ |
39 | ${EMB_UBOOT_MIRROR} git://github.com/embedian/smarc-uboot.git;protocol=git;branch=${SRCBRANCH} \n \ | 39 | ${EMB_UBOOT_MIRROR} git://github.com/embedian/smarc-uboot.git;protocol=git;branch=${SRCBRANCH} \n \ |
40 | ${EMB_KERNEL_MIRROR} git://github.com/embedian/smarc-fsl-linux-kernel.git;protocol=git;branch=${SRCBRANCH} \n \ | 40 | ${EMB_KERNEL_MIRROR} git://github.com/embedian/smarc-fsl-linux-kernel.git;protocol=git;branch=${SRCBRANCH} \n \ |
41 | " | 41 | " |
42 | 42 |
conf/machine/include/smarc-common.inc
1 | DISTRO_FEATURES_FILTER_NATIVESDK += "wayland" | 1 | DISTRO_FEATURES_FILTER_NATIVESDK += "wayland" |
2 | 2 | ||
3 | MACHINE_USES_VIVANTE_KERNEL_DRIVER_MODULE ?= "0" | 3 | MACHINE_USES_VIVANTE_KERNEL_DRIVER_MODULE ?= "0" |
4 | 4 | ||
5 | # Overrides for imx-base.inc | 5 | # Overrides for imx-base.inc |
6 | DEFAULTTUNE_mx8mp ?= "cortexa53-crypto" | 6 | DEFAULTTUNE_mx8mp ?= "cortexa53-crypto" |
7 | 7 | ||
8 | IMX_DEFAULT_BSP = "nxp" | 8 | IMX_DEFAULT_BSP = "nxp" |
9 | 9 | ||
10 | MACHINE_SOCARCH_FILTER_remove = "alsa-lib gstreamer1.0 imx-codec" | 10 | MACHINE_SOCARCH_FILTER_remove = "alsa-lib gstreamer1.0 imx-codec" |
11 | 11 | ||
12 | # Use latest SDMA firmware from firmware-imx instead of upstream linux-firmware | 12 | # Use latest SDMA firmware from firmware-imx instead of upstream linux-firmware |
13 | MACHINE_FIRMWARE_remove_mx8 = "linux-firmware-imx-sdma-imx7d" | 13 | MACHINE_FIRMWARE_remove_mx8 = "linux-firmware-imx-sdma-imx7d" |
14 | 14 | ||
15 | MACHINE_FIRMWARE_append_mx8 = " linux-firmware-ath10k firmware-imx-sdma firmware-imx-regulatory" | 15 | MACHINE_FIRMWARE_append_mx8 = " linux-firmware-ath10k firmware-imx-sdma firmware-imx-regulatory" |
16 | MACHINE_FIRMWARE_remove_mx8mp = "firmware-imx-easrc-imx8mn firmware-imx-xcvr-imx8mp firmware-sof-imx" | 16 | MACHINE_FIRMWARE_remove_mx8mp = "firmware-imx-easrc-imx8mn firmware-imx-xcvr-imx8mp firmware-sof-imx" |
17 | MACHINE_FIRMWARE_append_mx8mp = " firmware-imx-easrc firmware-imx-xcvr sof-imx" | 17 | MACHINE_FIRMWARE_append_mx8mp = " firmware-imx-easrc firmware-imx-xcvr sof-imx" |
18 | 18 | ||
19 | # NXP WiFi firmware & extra Wlan SDK | 19 | # NXP WiFi firmware & extra Wlan SDK |
20 | MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'nxp8987', 'linux-firmware-nxp89xx', '', d)}" | 20 | MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'nxp8987', 'linux-firmware-nxp89xx', '', d)}" |
21 | MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'nxp8997', 'linux-firmware-nxp89xx', '', d)}" | 21 | MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'nxp8997', 'linux-firmware-nxp89xx', '', d)}" |
22 | MACHINE_EXTRA_RRECOMMENDS_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'nxp8987', 'nxp-wlan-sdk kernel-module-nxp89xx', '', d)}" | 22 | MACHINE_EXTRA_RRECOMMENDS_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'nxp8987', 'nxp-wlan-sdk kernel-module-nxp89xx', '', d)}" |
23 | MACHINE_EXTRA_RRECOMMENDS_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'nxp8997', 'nxp-wlan-sdk kernel-module-nxp89xx', '', d)}" | 23 | MACHINE_EXTRA_RRECOMMENDS_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'nxp8997', 'nxp-wlan-sdk kernel-module-nxp89xx', '', d)}" |
24 | 24 | ||
25 | # MCore Demo apps to /lib/firmware | 25 | # MCore Demo apps to /lib/firmware |
26 | MACHINE_EXTRA_RRECOMMENDS_append_mx8mp = " imx-m7-demos" | 26 | MACHINE_EXTRA_RRECOMMENDS_append_mx8mp = " imx-m7-demos" |
27 | MACHINE_EXTRA_RRECOMMENDS_append_mx8mq = " imx-m4-demos" | ||
27 | 28 | ||
28 | MACHINE_GSTREAMER_1_0_PLUGIN_mx8 ?= "imx-gst1.0-plugin" | 29 | MACHINE_GSTREAMER_1_0_PLUGIN_mx8 ?= "imx-gst1.0-plugin" |
29 | 30 | ||
30 | PREFERRED_VERSION_weston_mx8 ?= "9.0.0.imx" | 31 | PREFERRED_VERSION_weston_mx8 ?= "9.0.0.imx" |
31 | 32 | ||
32 | PREFERRED_VERSION_wayland-protocols_mx8 = "1.20.imx" | 33 | PREFERRED_VERSION_wayland-protocols_mx8 = "1.20.imx" |
33 | 34 | ||
34 | PREFERRED_VERSION_libdrm_mx8 ?= "2.4.102.imx" | 35 | PREFERRED_VERSION_libdrm_mx8 ?= "2.4.102.imx" |
35 | 36 | ||
36 | PREFERRED_VERSION_isp-imx ?= "4.2.2.6.1" | 37 | PREFERRED_VERSION_isp-imx ?= "4.2.2.6.1" |
37 | PREFERRED_VERSION_basler-camera ?= "4.2.2.6.1" | 38 | PREFERRED_VERSION_basler-camera ?= "4.2.2.6.1" |
38 | 39 | ||
39 | PREFERRED_VERSION_optee-client_mx8 = "3.10.0.imx" | 40 | PREFERRED_VERSION_optee-client_mx8 = "3.10.0.imx" |
40 | PREFERRED_VERSION_optee-os_mx8 = "3.10.0.imx" | 41 | PREFERRED_VERSION_optee-os_mx8 = "3.10.0.imx" |
41 | PREFERRED_VERSION_optee-test_mx8 = "3.10.0.imx" | 42 | PREFERRED_VERSION_optee-test_mx8 = "3.10.0.imx" |
42 | 43 | ||
43 | SOC_DEFAULT_IMAGE_FSTYPES_remove = "wic.gz" | 44 | SOC_DEFAULT_IMAGE_FSTYPES_remove = "wic.gz" |
44 | SOC_DEFAULT_IMAGE_FSTYPES_append = " wic.bz2 tar.bz2" | 45 | SOC_DEFAULT_IMAGE_FSTYPES_append = " wic.bz2 tar.bz2" |
45 | 46 | ||
46 | OPTEE_BOOT_IMAGE_mx8 ?= "tee.bin" | 47 | OPTEE_BOOT_IMAGE_mx8 ?= "tee.bin" |
47 | 48 | ||
48 | IMAGE_BOOT_FILES_append = " \ | 49 | IMAGE_BOOT_FILES_append = " \ |
49 | ${@bb.utils.contains('COMBINED_FEATURES', 'xen', 'xen', '', d)} \ | 50 | ${@bb.utils.contains('COMBINED_FEATURES', 'xen', 'xen', '', d)} \ |
50 | " | 51 | " |
51 | 52 | ||
52 | IMAGE_INSTALL_append = " \ | 53 | IMAGE_INSTALL_append = " \ |
53 | ${@bb.utils.contains('COMBINED_FEATURES', 'jailhouse', 'jailhouse', '', d)} \ | 54 | ${@bb.utils.contains('COMBINED_FEATURES', 'jailhouse', 'jailhouse', '', d)} \ |
54 | ${@bb.utils.contains('MACHINE_FEATURES', 'optee', 'packagegroup-fsl-optee-imx', '', d)} \ | 55 | ${@bb.utils.contains('MACHINE_FEATURES', 'optee', 'packagegroup-fsl-optee-imx', '', d)} \ |
55 | ${@bb.utils.contains('COMBINED_FEATURES', 'xen', 'imx-xen xen-tools', '', d)} \ | 56 | ${@bb.utils.contains('COMBINED_FEATURES', 'xen', 'imx-xen xen-tools', '', d)} \ |
56 | " | 57 | " |
57 | 58 | ||
58 | MACHINE_FEATURES_append_imx = " nxp8987" | 59 | MACHINE_FEATURES_append_imx = " nxp8987" |
59 | 60 | ||
60 | # Overrides for all MACHINE.conf with optee support | 61 | # Overrides for all MACHINE.conf with optee support |
61 | UBOOT_CONFIG_OPTEE_CONFIG = "mx${OPTEE_BIN_EXT}_optee_config" | 62 | UBOOT_CONFIG_OPTEE_CONFIG = "mx${OPTEE_BIN_EXT}_optee_config" |
62 | UBOOT_CONFIG[sd-optee] = "${UBOOT_CONFIG_OPTEE_CONFIG},sdcard" | 63 | UBOOT_CONFIG[sd-optee] = "${UBOOT_CONFIG_OPTEE_CONFIG},sdcard" |
63 | 64 | ||
64 | 65 | ||
65 | # LF still doesn't support wireless now, need to remove it temporarily | 66 | # LF still doesn't support wireless now, need to remove it temporarily |
66 | # qca9377 is not ready for imx8mmevk | 67 | # qca9377 is not ready for imx8mmevk |
67 | MACHINE_FEATURES_remove = "qca9377 mrvl8997" | 68 | MACHINE_FEATURES_remove = "qca9377 mrvl8997" |
68 | 69 |
conf/machine/smarcimx8mq2g.conf
File was created | 1 | #@TYPE: Machine | |
2 | #@NAME: EMBEDIAN SMARC-iMX8MQ CPU Module with 2GB LPDDR4 | ||
3 | #@SOC: i.MX8MQ | ||
4 | #@DESCRIPTION: Machine configuration for Embedian SMARC-iMX8MQ | ||
5 | #@MAINTAINER: Eric Lee <eric.lee@embedian.com> | ||
6 | |||
7 | MACHINEOVERRIDES =. "mx8:mx8m:mx8mq:" | ||
8 | |||
9 | require conf/machine/include/imx-base.inc | ||
10 | require conf/machine/include/tune-cortexa53.inc | ||
11 | require conf/machine/include/smarc-common.inc | ||
12 | |||
13 | MACHINE_FEATURES += " usbgadget vfat ext2 alsa serial pci wifi bluetooth nxp8997" | ||
14 | |||
15 | IMAGE_FEATURES += "package-management" | ||
16 | |||
17 | # Embedian BSP default providers | ||
18 | PREFERRED_PROVIDER_virtual/kernel_smarcimx8mq2g ?= "linux-smarcimx8mq" | ||
19 | PREFERRED_VERSION_linux-smarcimx8mq2g_smarcimx8mq2g = "5.10" | ||
20 | |||
21 | KERNEL_DEVICETREE = " \ | ||
22 | embedian/imx8mq-smarc.dtb \ | ||
23 | embedian/imx8mq-smarc-dcss-lvds.dtb \ | ||
24 | embedian/imx8mq-smarc-lcdif-lvds.dtb \ | ||
25 | embedian/imx8mq-smarc-hdmi.dtb \ | ||
26 | embedian/imx8mq-smarc-dp.dtb \ | ||
27 | embedian/imx8mq-smarc-dual-display.dtb \ | ||
28 | embedian/imx8mq-smarc-m4.dtb \ | ||
29 | embedian/imx8mq-smarc-m4-dcss-lvds.dtb \ | ||
30 | embedian/imx8mq-smarc-m4-lcdif-lvds.dtb \ | ||
31 | embedian/imx8mq-smarc-m4-hdmi.dtb \ | ||
32 | embedian/imx8mq-smarc-m4-dp.dtb \ | ||
33 | embedian/imx8mq-smarc-m4-dual-display.dtb \ | ||
34 | " | ||
35 | |||
36 | MACHINE_FEATURES_remove_smarcimx8mq2g = "qca6174" | ||
37 | MACHINE_FEATURES_append_smarcimx8mq2g = " bcm43455 bcm4356 bcm4359 nxp8997" | ||
38 | WKS_FILE_DEPENDS_append_smarcimx8mq2g = " imx-m4-demos" | ||
39 | IMAGE_BOOT_FILES += " imx8mq_m4_TCM_hello_world.bin \ | ||
40 | imx8mq_m4_TCM_rpmsg_lite_pingpong_rtos_linux_remote.bin \ | ||
41 | imx8mq_m4_TCM_rpmsg_lite_str_echo_rtos.bin \ | ||
42 | " | ||
43 | |||
44 | PREFERRED_PROVIDER_u-boot_smarcimx8mq2g = "u-boot-smarcimx8mq" | ||
45 | PREFERRED_PROVIDER_virtual/bootloader_smarcimx8mq2g = "u-boot-smarcimx8mq" | ||
46 | |||
47 | UBOOT_CONFIG ??= "sd" | ||
48 | UBOOT_CONFIG[sd] = "smarcimx8mq_2g_ser3_defconfig,sdcard" | ||
49 | SPL_BINARY = "spl/u-boot-spl.bin" | ||
50 | |||
51 | # Set DDR FIRMWARE | ||
52 | 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" | ||
53 | |||
54 | # Set u-boot DTB | ||
55 | UBOOT_DTB_NAME = "imx8mq-smarc.dtb" | ||
56 | |||
57 | # Set imx-mkimage boot target | ||
58 | IMXBOOT_TARGETS = "flash_evk flash_evk_no_hdmi flash_dp_evk" | ||
59 | |||
60 | # Set Serial console | ||
61 | SERIAL_CONSOLES = "115200;ttymxc0" | ||
62 | |||
63 | IMAGE_BOOTLOADER = "imx-boot" | ||
64 | |||
65 | LOADADDR = "" | ||
66 | UBOOT_SUFFIX = "bin" | ||
67 | UBOOT_MAKE_TARGET = "" | ||
68 | IMX_BOOT_SEEK = "33" | ||
69 | |||
70 | OPTEE_BIN_EXT = "8mq" | ||
71 | |||
72 | MACHINE_EXTRA_RDEPENDS += " \ | ||
73 | imx-boot \ | ||
74 | packagegroup-tools-bluetooth \ | ||
75 | pm-utils \ | ||
76 | kmod \ | ||
77 | hdparm \ | ||
78 | gptfdisk \ | ||
79 | lftp \ | ||
80 | vim \ | ||
81 | ntp \ | ||
82 | boost \ | ||
83 | nodejs \ | ||
84 | networkmanager \ | ||
85 | imx-gpu-viv \ | ||
86 | android-tools \ | ||
87 | " | ||
88 | |||
89 | # eIQ Machine Learning. Note that many of the features require Qt 5. Disable | ||
90 | # this when you build image without QT 5. | ||
91 | IMAGE_INSTALL_append = " \ | ||
92 | packagegroup-imx-ml \ | ||
93 | firmware-imx-sdma \ | ||
94 | firmware-imx-regulatory \ | ||
95 | fsl-rc-local \ | ||
96 | " | ||
97 | #IMAGE_INSTALL_append = " \ | ||
98 | # firmware-imx-sdma \ | ||
99 | # firmware-imx-regulatory \ | ||
100 | # fsl-rc-local \ | ||
101 | # " | ||
102 | |||
103 | #TOOLCHAIN_TARGET_TASK_append += " tensorflow-lite-staticdev tensorflow-lite-dev armnn-dev onnxruntimedev" | ||
104 | |||
105 | IMAGE_FSTYPES = "tar.bz2" | ||
106 | |||
107 | # Ship all kernel modules by default | ||
108 | MACHINE_EXTRA_RRECOMMENDS = "kernel-modules" | ||
109 | |||
110 | # Add additional firmware | ||
111 | MACHINE_FIRMWARE_append = " linux-firmware-ath10k" | ||
112 |
conf/machine/smarcimx8mq4g.conf
File was created | 1 | #@TYPE: Machine | |
2 | #@NAME: EMBEDIAN SMARC-iMX8MQ CPU Module with 4GB LPDDR4 | ||
3 | #@SOC: i.MX8MQ | ||
4 | #@DESCRIPTION: Machine configuration for Embedian SMARC-iMX8MQ | ||
5 | #@MAINTAINER: Eric Lee <eric.lee@embedian.com> | ||
6 | |||
7 | MACHINEOVERRIDES =. "mx8:mx8m:mx8mq:" | ||
8 | |||
9 | require conf/machine/include/imx-base.inc | ||
10 | require conf/machine/include/tune-cortexa53.inc | ||
11 | require conf/machine/include/smarc-common.inc | ||
12 | |||
13 | MACHINE_FEATURES += " usbgadget vfat ext2 alsa serial pci wifi bluetooth nxp8997" | ||
14 | |||
15 | IMAGE_FEATURES += "package-management" | ||
16 | |||
17 | # Embedian BSP default providers | ||
18 | PREFERRED_PROVIDER_virtual/kernel_smarcimx8mq4g ?= "linux-smarcimx8mq" | ||
19 | PREFERRED_VERSION_linux-smarcimx8mq4g_smarcimx8mq4g = "5.10" | ||
20 | |||
21 | KERNEL_DEVICETREE = " \ | ||
22 | embedian/imx8mq-smarc.dtb \ | ||
23 | embedian/imx8mq-smarc-dcss-lvds.dtb \ | ||
24 | embedian/imx8mq-smarc-lcdif-lvds.dtb \ | ||
25 | embedian/imx8mq-smarc-hdmi.dtb \ | ||
26 | embedian/imx8mq-smarc-dp.dtb \ | ||
27 | embedian/imx8mq-smarc-dual-display.dtb \ | ||
28 | embedian/imx8mq-smarc-m4.dtb \ | ||
29 | embedian/imx8mq-smarc-m4-dcss-lvds.dtb \ | ||
30 | embedian/imx8mq-smarc-m4-lcdif-lvds.dtb \ | ||
31 | embedian/imx8mq-smarc-m4-hdmi.dtb \ | ||
32 | embedian/imx8mq-smarc-m4-dp.dtb \ | ||
33 | embedian/imx8mq-smarc-m4-dual-display.dtb \ | ||
34 | " | ||
35 | |||
36 | MACHINE_FEATURES_remove_smarcimx8mq4g = "qca6174" | ||
37 | MACHINE_FEATURES_append_smarcimx8mq4g = " bcm43455 bcm4356 bcm4359 nxp8997" | ||
38 | WKS_FILE_DEPENDS_append_smarcimx8mq4g = " imx-m4-demos" | ||
39 | IMAGE_BOOT_FILES += " imx8mq_m4_TCM_hello_world.bin \ | ||
40 | imx8mq_m4_TCM_rpmsg_lite_pingpong_rtos_linux_remote.bin \ | ||
41 | imx8mq_m4_TCM_rpmsg_lite_str_echo_rtos.bin \ | ||
42 | " | ||
43 | |||
44 | PREFERRED_PROVIDER_u-boot_smarcimx8mq4g = "u-boot-smarcimx8mq" | ||
45 | PREFERRED_PROVIDER_virtual/bootloader_smarcimx8mq4g = "u-boot-smarcimx8mq" | ||
46 | |||
47 | UBOOT_CONFIG ??= "sd" | ||
48 | UBOOT_CONFIG[sd] = "smarcimx8mq_4g_ser3_defconfig,sdcard" | ||
49 | SPL_BINARY = "spl/u-boot-spl.bin" | ||
50 | |||
51 | # Set DDR FIRMWARE | ||
52 | 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" | ||
53 | |||
54 | # Set u-boot DTB | ||
55 | UBOOT_DTB_NAME = "imx8mq-smarc.dtb" | ||
56 | |||
57 | # Set imx-mkimage boot target | ||
58 | IMXBOOT_TARGETS = "flash_evk flash_evk_no_hdmi flash_dp_evk" | ||
59 | |||
60 | # Set Serial console | ||
61 | SERIAL_CONSOLES = "115200;ttymxc0" | ||
62 | |||
63 | IMAGE_BOOTLOADER = "imx-boot" | ||
64 | |||
65 | LOADADDR = "" | ||
66 | UBOOT_SUFFIX = "bin" | ||
67 | UBOOT_MAKE_TARGET = "" | ||
68 | IMX_BOOT_SEEK = "33" | ||
69 | |||
70 | OPTEE_BIN_EXT = "8mq" | ||
71 | |||
72 | MACHINE_EXTRA_RDEPENDS += " \ | ||
73 | imx-boot \ | ||
74 | packagegroup-tools-bluetooth \ | ||
75 | pm-utils \ | ||
76 | kmod \ | ||
77 | hdparm \ | ||
78 | gptfdisk \ | ||
79 | lftp \ | ||
80 | vim \ | ||
81 | ntp \ | ||
82 | boost \ | ||
83 | nodejs \ | ||
84 | networkmanager \ | ||
85 | imx-gpu-viv \ | ||
86 | android-tools \ | ||
87 | " | ||
88 | |||
89 | # eIQ Machine Learning. Note that many of the features require Qt 5. Disable | ||
90 | # this when you build image without QT 5. | ||
91 | IMAGE_INSTALL_append = " \ | ||
92 | packagegroup-imx-ml \ | ||
93 | firmware-imx-sdma \ | ||
94 | firmware-imx-regulatory \ | ||
95 | fsl-rc-local \ | ||
96 | " | ||
97 | #IMAGE_INSTALL_append = " \ | ||
98 | # firmware-imx-sdma \ | ||
99 | # firmware-imx-regulatory \ | ||
100 | # fsl-rc-local \ | ||
101 | # " | ||
102 | |||
103 | #TOOLCHAIN_TARGET_TASK_append += " tensorflow-lite-staticdev tensorflow-lite-dev armnn-dev onnxruntimedev" | ||
104 | |||
105 | IMAGE_FSTYPES = "tar.bz2" | ||
106 | |||
107 | # Ship all kernel modules by default | ||
108 | MACHINE_EXTRA_RRECOMMENDS = "kernel-modules" | ||
109 | |||
110 | # Add additional firmware | ||
111 | MACHINE_FIRMWARE_append = " linux-firmware-ath10k" | ||
112 |
recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend
1 | # Workaround to fix do_compile() failure due to missing imx8mp-smarc.dtb | 1 | # Workaround to fix do_compile() failure due to missing imx8mp-smarc.dtb |
2 | do_compile_prepend() { | 2 | do_compile_prepend() { |
3 | echo "Copying DTB" | 3 | echo "Copying DTB" |
4 | if [ -f ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/imx8mp-smarc.dtb ]; then | 4 | if [ -f ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/imx8mq-smarc.dtb ]; then |
5 | cp ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/imx8mp-smarc.dtb ${S}/iMX8M/imx8mp-evk.dtb | 5 | cp ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/imx8mq-smarc.dtb ${S}/iMX8M/imx8mq-evk.dtb |
6 | fi | 6 | fi |
7 | } | 7 | } |
8 | 8 |
recipes-bsp/imx-vpu-hantro-vc/imx-vpu-hantro-vc_1.3.0.bbappend
1 | COMPATIBLE_MACHINE = "(imx8mp)" | File was deleted | |
2 | 1 | COMPATIBLE_MACHINE = "(imx8mp)" |
recipes-bsp/u-boot/u-boot-smarcimx8mq_2020.04.bb
File was created | 1 | # Copyright (C) 2013-2016 Freescale Semiconductor | |
2 | # Copyright 2017-2021 NXP | ||
3 | |||
4 | DESCRIPTION = "i.MX U-Boot suppporting i.MX reference boards." | ||
5 | require recipes-bsp/u-boot/u-boot-common.inc | ||
6 | require recipes-bsp/u-boot/u-boot.inc | ||
7 | inherit pythonnative | ||
8 | |||
9 | FILESEXTRAPATHS_prepend := "${THISDIR}/files:" | ||
10 | |||
11 | PROVIDES += "u-boot" | ||
12 | DEPENDS_append = " dtc-native" | ||
13 | |||
14 | LICENSE = "GPLv2+" | ||
15 | LIC_FILES_CHKSUM = "file://Licenses/gpl-2.0.txt;md5=b234ee4d69f5fce4486a80fdaf4a4263" | ||
16 | |||
17 | UBOOT_SRC ?= "${EMB_UBOOT_MIRROR};protocol=ssh" | ||
18 | SRCBRANCH = "smarc_8mq_lf_v2020.04" | ||
19 | SRC_URI = "${UBOOT_SRC};branch=${SRCBRANCH}" | ||
20 | SRCREV = "312ec620f3557f27301ec51dec03d4c4154d161e" | ||
21 | |||
22 | S = "${WORKDIR}/git" | ||
23 | |||
24 | inherit fsl-u-boot-localversion | ||
25 | |||
26 | LOCALVERSION ?= "-5.10.9-1.0.0" | ||
27 | |||
28 | BOOT_TOOLS = "imx-boot-tools" | ||
29 | |||
30 | do_deploy_append_mx8m () { | ||
31 | # Deploy u-boot-nodtb.bin and fsl-imx8mq-XX.dtb, to be packaged in boot binary by imx-boot | ||
32 | if [ -n "${UBOOT_CONFIG}" ] | ||
33 | then | ||
34 | for config in ${UBOOT_MACHINE}; do | ||
35 | i=$(expr $i + 1); | ||
36 | for type in ${UBOOT_CONFIG}; do | ||
37 | j=$(expr $j + 1); | ||
38 | if [ $j -eq $i ] | ||
39 | then | ||
40 | install -d ${DEPLOYDIR}/${BOOT_TOOLS} | ||
41 | install -m 0777 ${B}/${config}/arch/arm/dts/${UBOOT_DTB_NAME} ${DEPLOYDIR}/${BOOT_TOOLS} | ||
42 | install -m 0777 ${B}/${config}/u-boot-nodtb.bin ${DEPLOYDIR}/${BOOT_TOOLS}/u-boot-nodtb.bin-${MACHINE}-${type} | ||
43 | fi | ||
44 | done | ||
45 | unset j | ||
46 | done | ||
47 | unset i | ||
48 | fi | ||
49 | |||
50 | } | ||
51 | |||
52 | PACKAGE_ARCH = "${MACHINE_ARCH}" | ||
53 | COMPATIBLE_MACHINE = "(mx6|mx7|mx8)" | ||
54 | |||
55 | UBOOT_NAME_mx6 = "u-boot-${MACHINE}.bin-${UBOOT_CONFIG}" | ||
56 | UBOOT_NAME_mx7 = "u-boot-${MACHINE}.bin-${UBOOT_CONFIG}" | ||
57 | UBOOT_NAME_mx8 = "u-boot-${MACHINE}.bin-${UBOOT_CONFIG}" | ||
58 |
recipes-core/base-files/base-files_%.bbappend
1 | FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" | 1 | FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" |
2 | 2 | ||
3 | SRC_URI_append_smarcimx8mq2g = " \ | ||
4 | file://embedian-hdmi-audio.conf \ | ||
5 | " | ||
6 | |||
7 | SRC_URI_append_smarcimx8mq4g = " \ | ||
8 | file://embedian-hdmi-audio.conf \ | ||
9 | " | ||
10 | |||
3 | SRC_URI_append_smarcimx8mp4g = " \ | 11 | SRC_URI_append_smarcimx8mp4g = " \ |
4 | file://embedian-hdmi-audio.conf \ | 12 | file://embedian-hdmi-audio.conf \ |
5 | " | 13 | " |
6 | 14 | ||
7 | SRC_URI_append_smarcimx8mp6g = " \ | 15 | SRC_URI_append_smarcimx8mp6g = " \ |
8 | file://embedian-hdmi-audio.conf \ | 16 | file://embedian-hdmi-audio.conf \ |
9 | " | 17 | " |
18 | do_install_append_smarcimx8mq2g() { | ||
19 | install -m 0644 ${WORKDIR}/embedian-hdmi-audio.conf ${D}${sysconfdir}/modprobe.d | ||
20 | } | ||
21 | |||
22 | do_install_append_smarcimx8mq4g() { | ||
23 | install -m 0644 ${WORKDIR}/embedian-hdmi-audio.conf ${D}${sysconfdir}/modprobe.d | ||
24 | } | ||
10 | 25 | ||
11 | do_install_append_smarcimx8mp4g() { | 26 | do_install_append_smarcimx8mp4g() { |
12 | install -m 0644 ${WORKDIR}/embedian-hdmi-audio.conf ${D}${sysconfdir}/modprobe.d | 27 | install -m 0644 ${WORKDIR}/embedian-hdmi-audio.conf ${D}${sysconfdir}/modprobe.d |
13 | } | 28 | } |
14 | 29 | ||
15 | do_install_append_smarcimx8mp6g() { | 30 | do_install_append_smarcimx8mp6g() { |
16 | install -m 0644 ${WORKDIR}/embedian-hdmi-audio.conf ${D}${sysconfdir}/modprobe.d | 31 | install -m 0644 ${WORKDIR}/embedian-hdmi-audio.conf ${D}${sysconfdir}/modprobe.d |
17 | } | 32 | } |
18 | 33 |
recipes-core/udev/udev-rules-imx.bbappend
1 | FILESEXTRAPATHS_prepend := "${THISDIR}/files:" | 1 | FILESEXTRAPATHS_prepend := "${THISDIR}/files:" |
2 | 2 | ||
3 | SRC_URI_append_smarcimx8mq2g = " file://usb-power.rules" | ||
4 | SRC_URI_append_smarcimx8mq4g = " file://usb-power.rules" | ||
3 | SRC_URI_append_smarcimx8mp4g = " file://usb-power.rules" | 5 | SRC_URI_append_smarcimx8mp4g = " file://usb-power.rules" |
4 | SRC_URI_append_smarcimx8mp6g = " file://usb-power.rules" | 6 | SRC_URI_append_smarcimx8mp6g = " file://usb-power.rules" |
7 | |||
8 | do_install_append_smarcimx8mq2g () { | ||
9 | install -d ${D}${sysconfdir}/udev/rules.d | ||
10 | install -m 0644 ${WORKDIR}/usb-power.rules ${D}${sysconfdir}/udev/rules.d/ | ||
11 | } | ||
12 | |||
13 | do_install_append_smarcimx8mq4g () { | ||
14 | install -d ${D}${sysconfdir}/udev/rules.d | ||
15 | install -m 0644 ${WORKDIR}/usb-power.rules ${D}${sysconfdir}/udev/rules.d/ | ||
16 | } | ||
5 | 17 | ||
6 | do_install_append_smarcimx8mp4g () { | 18 | do_install_append_smarcimx8mp4g () { |
7 | install -d ${D}${sysconfdir}/udev/rules.d | 19 | install -d ${D}${sysconfdir}/udev/rules.d |
8 | install -m 0644 ${WORKDIR}/usb-power.rules ${D}${sysconfdir}/udev/rules.d/ | 20 | install -m 0644 ${WORKDIR}/usb-power.rules ${D}${sysconfdir}/udev/rules.d/ |
9 | } | 21 | } |
10 | 22 | ||
11 | do_install_append_smarcimx8mp6g () { | 23 | do_install_append_smarcimx8mp6g () { |
12 | install -d ${D}${sysconfdir}/udev/rules.d | 24 | install -d ${D}${sysconfdir}/udev/rules.d |
13 | install -m 0644 ${WORKDIR}/usb-power.rules ${D}${sysconfdir}/udev/rules.d/ | 25 | install -m 0644 ${WORKDIR}/usb-power.rules ${D}${sysconfdir}/udev/rules.d/ |
14 | } | 26 | } |
15 | 27 |
recipes-kernel/linux/linux-smarcimx8mq_5.10.bb
File was created | 1 | # Copyright (C) 2013-2016 Freescale Semiconductor | |
2 | # Copyright 2017-2021 NXP | ||
3 | # Released under the MIT license (see COPYING.MIT for the terms) | ||
4 | |||
5 | SUMMARY = "Linux Kernel provided and supported by NXP" | ||
6 | DESCRIPTION = "Linux Kernel provided and supported by NXP with focus on \ | ||
7 | i.MX Family Reference Boards. It includes support for many IPs such as GPU, VPU and IPU." | ||
8 | |||
9 | require recipes-kernel/linux/linux-imx.inc | ||
10 | |||
11 | LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46" | ||
12 | |||
13 | DEPENDS += "lzop-native bc-native" | ||
14 | |||
15 | SRCBRANCH = "smarc_8mq_lf-5.10.y" | ||
16 | LOCALVERSION = "-1.0.0" | ||
17 | KERNEL_DEFCONFIG = "${S}/arch/arm64/configs/smarcimx8mq_defconfig" | ||
18 | |||
19 | KERNEL_SRC ?= "git@git.embedian.com:developer/smarc-fsl-linux-kernel.git;protocol=git" | ||
20 | SRC_URI = "${EMB_KERNEL_MIRROR};protocol=ssh;branch=${SRCBRANCH}" | ||
21 | SRCREV = "a2b178e1baa15b60f1547421ef6753a76b7059e4" | ||
22 | |||
23 | LINUX_VERSION = "5.10.9" | ||
24 | |||
25 | FILES_${KERNEL_PACKAGE_NAME}-base += "${nonarch_base_libdir}/modules/${KERNEL_VERSION}/modules.builtin.modinfo " | ||
26 | |||
27 | KERNEL_CONFIG_COMMAND = "oe_runmake_call -C ${S} CC="${KERNEL_CC}" O=${B} olddefconfig" | ||
28 | |||
29 | FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" | ||
30 | |||
31 | DEFAULT_PREFERENCE = "1" | ||
32 | |||
33 | DO_CONFIG_V7_COPY = "no" | ||
34 | DO_CONFIG_V7_COPY_mx6 = "yes" | ||
35 | DO_CONFIG_V7_COPY_mx7 = "yes" | ||
36 | DO_CONFIG_V7_COPY_mx8 = "no" | ||
37 | |||
38 | # Add setting for LF Mainline build | ||
39 | IMX_KERNEL_CONFIG_AARCH32 = "imx_v7_defconfig" | ||
40 | IMX_KERNEL_CONFIG_AARCH64 = "smarcimx8mq_defconfig" | ||
41 | KBUILD_DEFCONFIG ?= "" | ||
42 | KBUILD_DEFCONFIG_mx6= "${IMX_KERNEL_CONFIG_AARCH32}" | ||
43 | KBUILD_DEFCONFIG_mx7= "${IMX_KERNEL_CONFIG_AARCH32}" | ||
44 | KBUILD_DEFCONFIG_mx8= "${IMX_KERNEL_CONFIG_AARCH64}" | ||
45 | |||
46 | |||
47 | # Use a verbatim copy of the defconfig from the linux-imx repo. | ||
48 | # IMPORTANT: This task effectively disables kernel config fragments | ||
49 | # since the config fragments applied in do_kernel_configme are replaced. | ||
50 | addtask copy_defconfig after do_kernel_configme before do_preconfigure | ||
51 | do_copy_defconfig () { | ||
52 | install -d ${B} | ||
53 | if [ ${DO_CONFIG_V7_COPY} = "yes" ]; then | ||
54 | # copy latest IMX_KERNEL_CONFIG_AARCH32 to use for mx6, mx6ul and mx7 | ||
55 | mkdir -p ${B} | ||
56 | cp ${S}/arch/arm/configs/${IMX_KERNEL_CONFIG_AARCH32} ${B}/.config | ||
57 | else | ||
58 | # copy latest IMX_KERNEL_CONFIG_AARCH64 to use for mx8 | ||
59 | mkdir -p ${B} | ||
60 | cp ${S}/arch/arm64/configs/${IMX_KERNEL_CONFIG_AARCH64} ${B}/.config | ||
61 | fi | ||
62 | } | ||
63 | |||
64 | DELTA_KERNEL_DEFCONFIG ?= "" | ||
65 | #DELTA_KERNEL_DEFCONFIG_mx8 = "imx.config" | ||
66 | |||
67 | do_merge_delta_config[dirs] = "${B}" | ||
68 | do_merge_delta_config[depends] += " \ | ||
69 | flex-native:do_populate_sysroot \ | ||
70 | bison-native:do_populate_sysroot \ | ||
71 | " | ||
72 | do_merge_delta_config() { | ||
73 | for deltacfg in ${DELTA_KERNEL_DEFCONFIG}; do | ||
74 | if [ -f ${S}/arch/${ARCH}/configs/${deltacfg} ]; then | ||
75 | ${KERNEL_CONFIG_COMMAND} | ||
76 | oe_runmake_call -C ${S} CC="${KERNEL_CC}" O=${B} ${deltacfg} | ||
77 | elif [ -f "${WORKDIR}/${deltacfg}" ]; then | ||
78 | ${S}/scripts/kconfig/merge_config.sh -m .config ${WORKDIR}/${deltacfg} | ||
79 | elif [ -f "${deltacfg}" ]; then | ||
80 | ${S}/scripts/kconfig/merge_config.sh -m .config ${deltacfg} | ||
81 | fi | ||
82 | done | ||
83 | cp .config ${WORKDIR}/defconfig | ||
84 | } | ||
85 | addtask merge_delta_config before do_preconfigure after do_copy_defconfig | ||
86 | |||
87 | COMPATIBLE_MACHINE = "(mx6|mx7|mx8)" | ||
88 |
scripts/emb_mk_yocto_sdcard/README.txt
1 | How to use the Embedian SD card creation script: | 1 | How to use the Embedian SD card creation script: |
2 | ================================================= | 2 | ================================================= |
3 | 3 | ||
4 | This utility is provided on an "AS IS" basis. | 4 | This utility is provided on an "AS IS" basis. |
5 | This is the script we use to create our recovery SD card. | 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. | 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. | 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 | 8 | ||
9 | Note: | 9 | Note: |
10 | Before running this script you need to bitbake fsl-image-gui. | 10 | Before running this script you need to bitbake fsl-image-gui. |
11 | 11 | ||
12 | 12 | ||
13 | Usage: | 13 | Usage: |
14 | sudo MACHINE=<smarcimx8mp4g|smarcimx8mp6g> ./emb-create-yocto-sdcard.sh [options] /dev/sdX | 14 | sudo MACHINE=<smarcimx8mq2g|smarcimx8mq4g|smarcimx8mp4g|smarcimx8mp6g> ./emb-create-yocto-sdcard.sh [options] /dev/sdX |
15 | (Change /dev/sdX to your device name) | 15 | (Change /dev/sdX to your device name) |
16 | 16 | ||
17 | options: | 17 | options: |
18 | -h Display help message | 18 | -h Display help message |
19 | -s Only show partition sizes to be written, without actually write them | 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 | 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) | 21 | -r Select alternative rootfs for recovery images (default: build_x11/tmp/deploy/images/<machine name>/fsl-image-validation-imx.tar.bz2) |
22 | 22 | ||
23 | If you don't use the '-a' option, a default rootfs size of 3700MiB will be used. | 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. | 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 | 25 | Example: "-r tmp/deploy/images/<machine name>/fsl-image-qt5-validation-imx" -- selects the "Qt5 image with X11" recovery image |
26 | 26 | ||
27 | 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, | 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: | 29 | or the following linux shell script: |
30 | install_yocto.sh | 30 | install_yocto.sh |
31 | 31 |
scripts/emb_mk_yocto_sdcard/emb-create-yocto-emmc.sh
1 | #!/bin/bash -e | 1 | #!/bin/bash -e |
2 | 2 | ||
3 | blue_underlined_bold_echo() | 3 | blue_underlined_bold_echo() |
4 | { | 4 | { |
5 | echo -e "\e[34m\e[4m\e[1m$@\e[0m" | 5 | echo -e "\e[34m\e[4m\e[1m$@\e[0m" |
6 | } | 6 | } |
7 | 7 | ||
8 | blue_bold_echo() | 8 | blue_bold_echo() |
9 | { | 9 | { |
10 | echo -e "\e[34m\e[1m$@\e[0m" | 10 | echo -e "\e[34m\e[1m$@\e[0m" |
11 | } | 11 | } |
12 | 12 | ||
13 | red_bold_echo() | 13 | red_bold_echo() |
14 | { | 14 | { |
15 | echo -e "\e[31m\e[1m$@\e[0m" | 15 | echo -e "\e[31m\e[1m$@\e[0m" |
16 | } | 16 | } |
17 | 17 | ||
18 | IMGS_PATH=/opt/images/Yocto | 18 | IMGS_PATH=/opt/images/Yocto |
19 | UBOOT_IMAGE=imx-boot-sd.bin | 19 | UBOOT_IMAGE=imx-boot-sd.bin |
20 | KERNEL_IMAGE=Image | 20 | KERNEL_IMAGE=Image |
21 | ROOTFS_IMAGE=rootfs.tar.bz2 | 21 | ROOTFS_IMAGE=rootfs.tar.bz2 |
22 | BOOTLOADER_RESERVED_SIZE=4 | 22 | BOOTLOADER_RESERVED_SIZE=4 |
23 | PART1_SIZE=48 | 23 | PART1_SIZE=48 |
24 | BOOTLOADER_OFFSET=33 | 24 | BOOTLOADER_OFFSET=33 |
25 | DISPLAY=-hdmi | 25 | DISPLAY=-hdmi |
26 | PART=p | 26 | PART=p |
27 | BOOTPART=1 | 27 | BOOTPART=1 |
28 | ROOTFSPART=2 | 28 | ROOTFSPART=2 |
29 | BOOTDIR=/boot | 29 | BOOTDIR=/boot |
30 | 30 | ||
31 | check_board() | 31 | check_board() |
32 | { | 32 | { |
33 | if grep -q "i.MX8MP" /sys/devices/soc0/soc_id; then | 33 | if grep -q "i.MX8MQ" /sys/devices/soc0/soc_id; then |
34 | BOARD=smarc-imx8mp | 34 | BOARD=smarc-imx8mq |
35 | DTB_PREFIX=imx8mp-smarc | 35 | DTB_PREFIX=imx8mq-smarc |
36 | BLOCK=mmcblk2 | 36 | BLOCK=mmcblk0 |
37 | 37 | ||
38 | if [[ $DISPLAY != "-lvds" && $DISPLAY != "-hdmi" && \ | 38 | if [[ $DISPLAY != "-dcss-lvds" && $DISPLAY != "-hdmi" && \ |
39 | $DISPLAY != "-edp" && $DISPLAY != "" ]]; then | 39 | $DISPLAY != "-lcdif-lvds" && $DISPLAY != "-dp" && \ |
40 | red_bold_echo "ERROR: invalid display, should be lvds, hdmi, dual-display or empty" | 40 | $DISPLAY != "-dual-display" && $DISPLAY != "" ]]; then |
41 | red_bold_echo "ERROR: invalid display, should be dcss-lvds, hdmi, lcdif-lvds, dual-display or empty" | ||
41 | exit 1 | 42 | exit 1 |
42 | fi | 43 | fi |
43 | else | 44 | else |
44 | red_bold_echo "ERROR: Unsupported board" | 45 | red_bold_echo "ERROR: Unsupported board" |
45 | exit 1 | 46 | exit 1 |
46 | fi | 47 | fi |
47 | 48 | ||
48 | 49 | ||
49 | if [[ ! -b /dev/${BLOCK} ]] ; then | 50 | if [[ ! -b /dev/${BLOCK} ]] ; then |
50 | red_bold_echo "ERROR: Can't find eMMC device (/dev/${BLOCK})." | 51 | 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 | red_bold_echo "Please verify you are using the correct options for your SMARC Module." |
52 | exit 1 | 53 | exit 1 |
53 | fi | 54 | fi |
54 | } | 55 | } |
55 | 56 | ||
56 | check_images() | 57 | check_images() |
57 | { | 58 | { |
58 | if [[ ! -f $IMGS_PATH/$UBOOT_IMAGE ]] ; then | 59 | if [[ ! -f $IMGS_PATH/$UBOOT_IMAGE ]] ; then |
59 | red_bold_echo "ERROR: \"$IMGS_PATH/$UBOOT_IMAGE\" does not exist" | 60 | red_bold_echo "ERROR: \"$IMGS_PATH/$UBOOT_IMAGE\" does not exist" |
60 | exit 1 | 61 | exit 1 |
61 | fi | 62 | fi |
62 | 63 | ||
63 | if [[ ! -f $IMGS_PATH/$KERNEL_IMAGE ]] ; then | 64 | if [[ ! -f $IMGS_PATH/$KERNEL_IMAGE ]] ; then |
64 | red_bold_echo "ERROR: \"$IMGS_PATH/$KERNEL_IMAGE\" does not exist" | 65 | red_bold_echo "ERROR: \"$IMGS_PATH/$KERNEL_IMAGE\" does not exist" |
65 | exit 1 | 66 | exit 1 |
66 | fi | 67 | fi |
67 | 68 | ||
68 | if [[ ! -f $IMGS_PATH/${DTB_PREFIX}${DISPLAY}.dtb ]] ; then | 69 | if [[ ! -f $IMGS_PATH/${DTB_PREFIX}${DISPLAY}.dtb ]] ; then |
69 | red_bold_echo "ERROR: \"$IMGS_PATH/${DTB_PREFIX}${DISPLAY}.dtb\" does not exist" | 70 | red_bold_echo "ERROR: \"$IMGS_PATH/${DTB_PREFIX}${DISPLAY}.dtb\" does not exist" |
70 | exit 1 | 71 | exit 1 |
71 | fi | 72 | fi |
72 | 73 | ||
73 | if [[ ! -f $IMGS_PATH/uEnv.txt ]] ; then | 74 | if [[ ! -f $IMGS_PATH/uEnv.txt ]] ; then |
74 | red_bold_echo "ERROR: \"$IMGS_PATH/uEnv.txt\" does not exist" | 75 | red_bold_echo "ERROR: \"$IMGS_PATH/uEnv.txt\" does not exist" |
75 | exit 1 | 76 | exit 1 |
76 | fi | 77 | fi |
77 | 78 | ||
78 | if [[ ! -f $IMGS_PATH/$ROOTFS_IMAGE ]] ; then | 79 | if [[ ! -f $IMGS_PATH/$ROOTFS_IMAGE ]] ; then |
79 | red_bold_echo "ERROR: \"$IMGS_PATH/$ROOTFS_IMAGE\" does not exist" | 80 | red_bold_echo "ERROR: \"$IMGS_PATH/$ROOTFS_IMAGE\" does not exist" |
80 | exit 1 | 81 | exit 1 |
81 | fi | 82 | fi |
82 | } | 83 | } |
83 | 84 | ||
84 | delete_emmc() | 85 | delete_emmc() |
85 | { | 86 | { |
86 | echo | 87 | echo |
87 | blue_underlined_bold_echo "Deleting current partitions" | 88 | blue_underlined_bold_echo "Deleting current partitions" |
88 | 89 | ||
89 | umount /dev/${BLOCK}${PART}* 2>/dev/null || true | 90 | umount /dev/${BLOCK}${PART}* 2>/dev/null || true |
90 | 91 | ||
91 | for ((i=1; i<=16; i++)); do | 92 | for ((i=1; i<=16; i++)); do |
92 | if [[ -e /dev/${BLOCK}${PART}${i} ]]; then | 93 | 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 | dd if=/dev/zero of=/dev/${BLOCK}${PART}${i} bs=1M count=1 2>/dev/null || true |
94 | fi | 95 | fi |
95 | done | 96 | done |
96 | sync | 97 | sync |
97 | 98 | ||
98 | dd if=/dev/zero of=/dev/${BLOCK} bs=1M count=${BOOTLOADER_RESERVED_SIZE} | 99 | dd if=/dev/zero of=/dev/${BLOCK} bs=1M count=${BOOTLOADER_RESERVED_SIZE} |
99 | 100 | ||
100 | sync; sleep 1 | 101 | sync; sleep 1 |
101 | } | 102 | } |
102 | 103 | ||
103 | create_emmc_parts() | 104 | create_emmc_parts() |
104 | { | 105 | { |
105 | echo | 106 | echo |
106 | blue_underlined_bold_echo "Creating new partitions" | 107 | blue_underlined_bold_echo "Creating new partitions" |
107 | 108 | ||
108 | SECT_SIZE_BYTES=`cat /sys/block/${BLOCK}/queue/hw_sector_size` | 109 | 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_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 | PART1_END_SECT=$((($BOOTLOADER_RESERVED_SIZE + $PART1_SIZE) * 1024 * 1024 / $SECT_SIZE_BYTES)) |
111 | PART2_FIRST_SECT=`expr ${PART1_END_SECT} + 1` | 112 | PART2_FIRST_SECT=`expr ${PART1_END_SECT} + 1` |
112 | 113 | ||
113 | (echo n; echo p; echo $BOOTPART; echo $PART1_FIRST_SECT; \ | 114 | (echo n; echo p; echo $BOOTPART; echo $PART1_FIRST_SECT; \ |
114 | echo $PART1_END_SECT; echo n; echo p; echo $ROOTFSPART; \ | 115 | echo $PART1_END_SECT; echo n; echo p; echo $ROOTFSPART; \ |
115 | echo $PART2_FIRST_SECT; echo; \ | 116 | echo $PART2_FIRST_SECT; echo; \ |
116 | echo p; echo w) | fdisk -u /dev/${BLOCK} > /dev/null | 117 | echo p; echo w) | fdisk -u /dev/${BLOCK} > /dev/null |
117 | 118 | ||
118 | sync; sleep 1 | 119 | sync; sleep 1 |
119 | fdisk -u -l /dev/${BLOCK} | 120 | fdisk -u -l /dev/${BLOCK} |
120 | } | 121 | } |
121 | 122 | ||
122 | format_emmc_parts() | 123 | format_emmc_parts() |
123 | { | 124 | { |
124 | echo | 125 | echo |
125 | blue_underlined_bold_echo "Formatting partitions" | 126 | blue_underlined_bold_echo "Formatting partitions" |
126 | 127 | ||
127 | mkfs.vfat -F 16 /dev/${BLOCK}${PART}${BOOTPART} -n boot | 128 | mkfs.vfat -F 16 /dev/${BLOCK}${PART}${BOOTPART} -n boot |
128 | mkfs.ext4 /dev/${BLOCK}${PART}${ROOTFSPART} -L rootfs | 129 | mkfs.ext4 /dev/${BLOCK}${PART}${ROOTFSPART} -L rootfs |
129 | 130 | ||
130 | sync; sleep 1 | 131 | sync; sleep 1 |
131 | } | 132 | } |
132 | 133 | ||
133 | install_bootloader_to_emmc() | 134 | install_bootloader_to_emmc() |
134 | { | 135 | { |
135 | echo | 136 | echo |
136 | blue_underlined_bold_echo "Installing booloader" | 137 | blue_underlined_bold_echo "Installing booloader" |
137 | 138 | ||
138 | dd if=${IMGS_PATH}/${UBOOT_IMAGE} of=/dev/${BLOCK} bs=1K seek=${BOOTLOADER_OFFSET} | 139 | dd if=${IMGS_PATH}/${UBOOT_IMAGE} of=/dev/${BLOCK} bs=1K seek=${BOOTLOADER_OFFSET} |
139 | sync | 140 | sync |
140 | } | 141 | } |
141 | 142 | ||
142 | install_kernel_to_emmc() | 143 | install_kernel_to_emmc() |
143 | { | 144 | { |
144 | echo | 145 | echo |
145 | blue_underlined_bold_echo "Installing kernel" | 146 | blue_underlined_bold_echo "Installing kernel" |
146 | 147 | ||
147 | MOUNTDIR=/run/media/${BLOCK}${PART}${BOOTPART} | 148 | MOUNTDIR=/run/media/${BLOCK}${PART}${BOOTPART} |
148 | mkdir -p ${MOUNTDIR} | 149 | mkdir -p ${MOUNTDIR} |
149 | mount /dev/${BLOCK}${PART}${BOOTPART} ${MOUNTDIR} | 150 | mount /dev/${BLOCK}${PART}${BOOTPART} ${MOUNTDIR} |
150 | mkdir -p ${MOUNTDIR}/dtbs/ | 151 | mkdir -p ${MOUNTDIR}/dtbs/ |
151 | cp -v ${IMGS_PATH}/${KERNEL_IMAGE} ${MOUNTDIR} | 152 | cp -v ${IMGS_PATH}/${KERNEL_IMAGE} ${MOUNTDIR} |
152 | cp -v ${IMGS_PATH}/${DTB_PREFIX}${DISPLAY}.dtb ${MOUNTDIR}/dtbs/imx8mp-smarc.dtb | 153 | cp -v ${IMGS_PATH}/${DTB_PREFIX}${DISPLAY}.dtb ${MOUNTDIR}/dtbs/imx8mq-smarc.dtb |
153 | cp -v ${IMGS_PATH}/uEnv.txt ${MOUNTDIR} | 154 | cp -v ${IMGS_PATH}/uEnv.txt ${MOUNTDIR} |
154 | 155 | ||
155 | echo | 156 | echo |
156 | sync | 157 | sync |
157 | 158 | ||
158 | umount ${MOUNTDIR} | 159 | umount ${MOUNTDIR} |
159 | } | 160 | } |
160 | 161 | ||
161 | install_rootfs_to_emmc() | 162 | install_rootfs_to_emmc() |
162 | { | 163 | { |
163 | echo | 164 | echo |
164 | blue_underlined_bold_echo "Installing rootfs" | 165 | blue_underlined_bold_echo "Installing rootfs" |
165 | 166 | ||
166 | MOUNTDIR=/run/media/${BLOCK}${PART}${ROOTFSPART} | 167 | MOUNTDIR=/run/media/${BLOCK}${PART}${ROOTFSPART} |
167 | mkdir -p ${MOUNTDIR} | 168 | mkdir -p ${MOUNTDIR} |
168 | mount /dev/${BLOCK}${PART}${ROOTFSPART} ${MOUNTDIR} | 169 | mount /dev/${BLOCK}${PART}${ROOTFSPART} ${MOUNTDIR} |
169 | 170 | ||
170 | printf "Extracting files" | 171 | printf "Extracting files" |
171 | tar --warning=no-timestamp -jxvf ${IMGS_PATH}/${ROOTFS_IMAGE} -C ${MOUNTDIR} --checkpoint=.1200 | 172 | tar --warning=no-timestamp -jxvf ${IMGS_PATH}/${ROOTFS_IMAGE} -C ${MOUNTDIR} --checkpoint=.1200 |
172 | 173 | ||
173 | # Create DTB symlink | 174 | # Create DTB symlink |
174 | (cd ${MOUNTDIR}/${BOOTDIR}; ln -fs ${DTB_PREFIX}${DISPLAY}.dtb ${DTB_PREFIX}.dtb) | 175 | (cd ${MOUNTDIR}/${BOOTDIR}; ln -fs ${DTB_PREFIX}${DISPLAY}.dtb ${DTB_PREFIX}.dtb) |
175 | 176 | ||
176 | echo | 177 | echo |
177 | sync | 178 | sync |
178 | 179 | ||
179 | umount ${MOUNTDIR} | 180 | umount ${MOUNTDIR} |
180 | } | 181 | } |
181 | 182 | ||
182 | stop_udev() | 183 | stop_udev() |
183 | { | 184 | { |
184 | if [ -f /lib/systemd/system/systemd-udevd.service ]; then | 185 | if [ -f /lib/systemd/system/systemd-udevd.service ]; then |
185 | systemctl -q mask --runtime systemd-udevd | 186 | systemctl -q mask --runtime systemd-udevd |
186 | systemctl -q stop systemd-udevd | 187 | systemctl -q stop systemd-udevd |
187 | fi | 188 | fi |
188 | } | 189 | } |
189 | 190 | ||
190 | start_udev() | 191 | start_udev() |
191 | { | 192 | { |
192 | if [ -f /lib/systemd/system/systemd-udevd.service ]; then | 193 | if [ -f /lib/systemd/system/systemd-udevd.service ]; then |
193 | systemctl -q unmask --runtime systemd-udevd | 194 | systemctl -q unmask --runtime systemd-udevd |
194 | systemctl -q start systemd-udevd | 195 | systemctl -q start systemd-udevd |
195 | fi | 196 | fi |
196 | } | 197 | } |
197 | 198 | ||
198 | usage() | 199 | usage() |
199 | { | 200 | { |
200 | echo | 201 | echo |
201 | echo "This script installs Yocto Rootfs on the SMARC-iMX8MP's internal eMMC storage device" | 202 | echo "This script installs Yocto Rootfs on the SMARC-iMX8MQ's internal eMMC storage device" |
202 | echo | 203 | echo |
203 | echo " Usage: $(basename $0) <option>" | 204 | echo " Usage: $(basename $0) <option>" |
204 | echo | 205 | echo |
205 | echo " options:" | 206 | echo " options:" |
206 | echo " -h show help message" | 207 | echo " -h show help message" |
207 | echo " -d <lvds|hdmi|dual-display> set display type, default is lvds" | 208 | echo " -d <lvds|hdmi|dual-display> set display type, default is lvds" |
208 | echo | 209 | echo |
209 | } | 210 | } |
210 | 211 | ||
211 | finish() | 212 | finish() |
212 | { | 213 | { |
213 | echo | 214 | echo |
214 | blue_bold_echo "Yocto Sumo installed successfully" | 215 | blue_bold_echo "Yocto Sumo installed successfully" |
215 | exit 0 | 216 | exit 0 |
216 | } | 217 | } |
217 | 218 | ||
218 | ################################################# | 219 | ################################################# |
219 | # Execution starts here # | 220 | # Execution starts here # |
220 | ################################################# | 221 | ################################################# |
221 | 222 | ||
222 | if [[ $EUID != 0 ]] ; then | 223 | if [[ $EUID != 0 ]] ; then |
223 | red_bold_echo "This script must be run with super-user privileges" | 224 | red_bold_echo "This script must be run with super-user privileges" |
224 | exit 1 | 225 | exit 1 |
225 | fi | 226 | fi |
226 | 227 | ||
227 | blue_underlined_bold_echo "*** Embedian SMARC-iMX8MP on-module eMMC Recovery ***" | 228 | blue_underlined_bold_echo "*** Embedian SMARC-iMX8MQ on-module eMMC Recovery ***" |
228 | echo | 229 | echo |
229 | 230 | ||
230 | while getopts d:h OPTION; | 231 | while getopts d:h OPTION; |
231 | do | 232 | do |
232 | case $OPTION in | 233 | case $OPTION in |
233 | d) | 234 | d) |
234 | DISPLAY=$OPTARG | 235 | DISPLAY=$OPTARG |
235 | ;; | 236 | ;; |
236 | h) | 237 | h) |
237 | usage | 238 | usage |
238 | exit 0 | 239 | exit 0 |
239 | ;; | 240 | ;; |
240 | *) | 241 | *) |
241 | usage | 242 | usage |
242 | exit 1 | 243 | exit 1 |
243 | ;; | 244 | ;; |
244 | esac | 245 | esac |
245 | done | 246 | done |
246 | 247 | ||
247 | printf "Board: " | 248 | printf "Board: " |
248 | blue_bold_echo $BOARD | 249 | blue_bold_echo $BOARD |
249 | 250 | ||
250 | printf "Installing to internal storage device: " | 251 | printf "Installing to internal storage device: " |
251 | blue_bold_echo eMMC | 252 | blue_bold_echo eMMC |
252 | 253 | ||
253 | check_board | 254 | check_board |
254 | check_images | 255 | check_images |
255 | stop_udev | 256 | stop_udev |
256 | delete_emmc | 257 | delete_emmc |
257 | create_emmc_parts | 258 | create_emmc_parts |
258 | format_emmc_parts | 259 | format_emmc_parts |
259 | install_bootloader_to_emmc | 260 | install_bootloader_to_emmc |
260 | install_kernel_to_emmc | 261 | install_kernel_to_emmc |
261 | install_rootfs_to_emmc | 262 | install_rootfs_to_emmc |
262 | start_udev | 263 | start_udev |
263 | finish | 264 | finish |
264 | 265 |
scripts/emb_mk_yocto_sdcard/emb-create-yocto-sdcard.sh
1 | #!/bin/bash | 1 | #!/bin/bash |
2 | set -e | 2 | set -e |
3 | 3 | ||
4 | #### Script version #### | 4 | #### Script version #### |
5 | SCRIPT_NAME=${0##*/} | 5 | SCRIPT_NAME=${0##*/} |
6 | readonly SCRIPT_VERSION="0.7" | 6 | readonly SCRIPT_VERSION="0.7" |
7 | 7 | ||
8 | #### Exports Variables #### | 8 | #### Exports Variables #### |
9 | #### global variables #### | 9 | #### global variables #### |
10 | readonly ABSOLUTE_FILENAME=`readlink -e "$0"` | 10 | readonly ABSOLUTE_FILENAME=`readlink -e "$0"` |
11 | readonly ABSOLUTE_DIRECTORY=`dirname ${ABSOLUTE_FILENAME}` | 11 | readonly ABSOLUTE_DIRECTORY=`dirname ${ABSOLUTE_FILENAME}` |
12 | readonly SCRIPT_POINT=${ABSOLUTE_DIRECTORY} | 12 | readonly SCRIPT_POINT=${ABSOLUTE_DIRECTORY} |
13 | readonly SCRIPT_START_DATE=`date +%Y%m%d` | 13 | readonly SCRIPT_START_DATE=`date +%Y%m%d` |
14 | 14 | ||
15 | readonly YOCTO_ROOT="${SCRIPT_POINT}/../../../../" | 15 | readonly YOCTO_ROOT="${SCRIPT_POINT}/../../../../" |
16 | 16 | ||
17 | readonly BSP_TYPE="YOCTO" | 17 | readonly BSP_TYPE="YOCTO" |
18 | readonly YOCTO_BUILD=${YOCTO_ROOT}/build-wayland | 18 | readonly YOCTO_BUILD=${YOCTO_ROOT}/build-wayland |
19 | readonly YOCTO_DEFAULT_IMAGE=fsl-image-qt5-validation-imx | 19 | readonly YOCTO_DEFAULT_IMAGE=fsl-image-qt5-validation-imx |
20 | 20 | ||
21 | readonly YOCTO_SCRIPTS_PATH=${SCRIPT_POINT} | 21 | readonly YOCTO_SCRIPTS_PATH=${SCRIPT_POINT} |
22 | readonly YOCTO_IMGS_PATH=${YOCTO_BUILD}/tmp/deploy/images/${MACHINE} | 22 | readonly YOCTO_IMGS_PATH=${YOCTO_BUILD}/tmp/deploy/images/${MACHINE} |
23 | 23 | ||
24 | ## display (one of "-hdmi", "-lvds", "-dp", "") | 24 | ## display (one of "-hdmi", "-lvds", "-dp", "") |
25 | readonly DISPLAY="-hdmi" | 25 | readonly DISPLAY="-hdmi" |
26 | 26 | ||
27 | # $1 -- block device | 27 | # $1 -- block device |
28 | # $2 -- output images dir | 28 | # $2 -- output images dir |
29 | readonly LPARAM_BLOCK_DEVICE=${1} | 29 | readonly LPARAM_BLOCK_DEVICE=${1} |
30 | readonly LPARAM_OUTPUT_DIR=${2} | 30 | readonly LPARAM_OUTPUT_DIR=${2} |
31 | readonly P1_MOUNT_DIR="${G_TMP_DIR}/p1" | 31 | readonly P1_MOUNT_DIR="${G_TMP_DIR}/p1" |
32 | readonly P2_MOUNT_DIR="${G_TMP_DIR}/p2" | 32 | readonly P2_MOUNT_DIR="${G_TMP_DIR}/p2" |
33 | 33 | ||
34 | readonly BOOTLOAD_RESERVE_SIZE=4 | 34 | readonly BOOTLOAD_RESERVE_SIZE=4 |
35 | readonly PART1_SIZE=48 | 35 | readonly PART1_SIZE=48 |
36 | readonly BOOTPART=1 | 36 | readonly BOOTPART=1 |
37 | readonly ROOTFSPART=2 | 37 | readonly ROOTFSPART=2 |
38 | readonly SPARE_SIZE=4 | 38 | readonly SPARE_SIZE=4 |
39 | 39 | ||
40 | # Sizes are in MiB | 40 | # Sizes are in MiB |
41 | if [ "${MACHINE}" = "smarcimx8mq2g" ] || | ||
42 | [ "${MACHINE}" = "smarcimx8mq4g" ]; then | ||
43 | BOOTLOADER_OFFSET=33 | ||
44 | fi | ||
45 | if [ "${MACHINE}" = "smarcimx8mp4g" ] || | ||
46 | [ "${MACHINE}" = "smarcimx8mp6g" ]; then | ||
41 | BOOTLOADER_OFFSET=32 | 47 | BOOTLOADER_OFFSET=32 |
48 | fi | ||
42 | 49 | ||
50 | |||
43 | AUTO_FILL_SD=0 | 51 | AUTO_FILL_SD=0 |
44 | LOOP_MAJOR=7 | 52 | LOOP_MAJOR=7 |
45 | 53 | ||
46 | # This function performs sanity check to verify that the target device is removable devise of proper size | 54 | # This function performs sanity check to verify that the target device is removable devise of proper size |
47 | function check_device() | 55 | function check_device() |
48 | { | 56 | { |
49 | # Check that parameter is a valid block device | 57 | # Check that parameter is a valid block device |
50 | if [ ! -b "$1" ]; then | 58 | if [ ! -b "$1" ]; then |
51 | echo "$1 is not a valid block device, exiting" | 59 | echo "$1 is not a valid block device, exiting" |
52 | exit 1 | 60 | exit 1 |
53 | fi | 61 | fi |
54 | 62 | ||
55 | local dev=$(basename $1) | 63 | local dev=$(basename $1) |
56 | 64 | ||
57 | # Check that /sys/block/$dev exists | 65 | # Check that /sys/block/$dev exists |
58 | if [ ! -d /sys/block/$dev ]; then | 66 | if [ ! -d /sys/block/$dev ]; then |
59 | echo "Directory /sys/block/${dev} missing, exiting" | 67 | echo "Directory /sys/block/${dev} missing, exiting" |
60 | exit 1 | 68 | exit 1 |
61 | fi | 69 | fi |
62 | 70 | ||
63 | # Get device parameters | 71 | # Get device parameters |
64 | local removable=$(cat /sys/block/${dev}/removable) | 72 | local removable=$(cat /sys/block/${dev}/removable) |
65 | local size_bytes=$((512*$(cat /sys/class/block/${dev}/size))) | 73 | local size_bytes=$((512*$(cat /sys/class/block/${dev}/size))) |
66 | local size_gb=$((size_bytes/1000000000)) | 74 | local size_gb=$((size_bytes/1000000000)) |
67 | 75 | ||
68 | # Non-removable SD card readers require additional check | 76 | # Non-removable SD card readers require additional check |
69 | if [ "${removable}" != "1" ]; then | 77 | if [ "${removable}" != "1" ]; then |
70 | local drive=$(udisksctl info -b /dev/${dev}|grep "Drive:"|cut -d"'" -f 2) | 78 | local drive=$(udisksctl info -b /dev/${dev}|grep "Drive:"|cut -d"'" -f 2) |
71 | local mediaremovable=$(gdbus call --system --dest org.freedesktop.UDisks2 \ | 79 | local mediaremovable=$(gdbus call --system --dest org.freedesktop.UDisks2 \ |
72 | --object-path ${drive} --method org.freedesktop.DBus.Properties.Get \ | 80 | --object-path ${drive} --method org.freedesktop.DBus.Properties.Get \ |
73 | org.freedesktop.UDisks2.Drive MediaRemovable) | 81 | org.freedesktop.UDisks2.Drive MediaRemovable) |
74 | if [[ "${mediaremovable}" = *"true"* ]]; then | 82 | if [[ "${mediaremovable}" = *"true"* ]]; then |
75 | removable=1 | 83 | removable=1 |
76 | fi | 84 | fi |
77 | fi | 85 | fi |
78 | 86 | ||
79 | # Check that device is either removable or loop | 87 | # Check that device is either removable or loop |
80 | if [ "$removable" != "1" -a $(stat -c '%t' /dev/$dev) != ${LOOP_MAJOR} ]; then | 88 | if [ "$removable" != "1" -a $(stat -c '%t' /dev/$dev) != ${LOOP_MAJOR} ]; then |
81 | echo "$1 is not a removable device, exiting" | 89 | echo "$1 is not a removable device, exiting" |
82 | exit 1 | 90 | exit 1 |
83 | fi | 91 | fi |
84 | 92 | ||
85 | # Check that device is attached | 93 | # Check that device is attached |
86 | if [ ${size_bytes} -eq 0 ]; then | 94 | if [ ${size_bytes} -eq 0 ]; then |
87 | echo "$1 is not attached, exiting" | 95 | echo "$1 is not attached, exiting" |
88 | exit 1 | 96 | exit 1 |
89 | fi | 97 | fi |
90 | 98 | ||
91 | # Check that device has a valid size | 99 | # Check that device has a valid size |
92 | echo "Detected removable device $1, size=${size_gb}GB" | 100 | echo "Detected removable device $1, size=${size_gb}GB" |
93 | } | 101 | } |
94 | 102 | ||
95 | YOCTO_RECOVERY_ROOTFS_PATH=${YOCTO_IMGS_PATH} | 103 | YOCTO_RECOVERY_ROOTFS_PATH=${YOCTO_IMGS_PATH} |
96 | 104 | ||
97 | echo "================================================" | 105 | echo "================================================" |
98 | echo "= Embedian recovery SD card creation script =" | 106 | echo "= Embedian recovery SD card creation script =" |
99 | echo "================================================" | 107 | echo "================================================" |
100 | 108 | ||
101 | help() { | 109 | help() { |
102 | bn=`basename $0` | 110 | bn=`basename $0` |
103 | echo " Usage: MACHINE=<smarcimx8mp4g|smarcimx8mp6g> $bn <options> device_node" | 111 | echo " Usage: MACHINE=<smarcimx8mq2g|smarcimx8mq4g|smarcimx8mp4g|smarcimx8mp6g> $bn <options> device_node" |
104 | echo | 112 | echo |
105 | echo " options:" | 113 | echo " options:" |
106 | echo " -h display this Help message" | 114 | echo " -h display this Help message" |
107 | echo " -s only Show partition sizes to be written, without actually write them" | 115 | 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)" | 116 | 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" | 117 | echo " -r ROOTFS_NAME select an alternative Rootfs for recovery images" |
110 | echo " (default: \"${YOCTO_RECOVERY_ROOTFS_PATH}/${YOCTO_DEFAULT_IMAGE}\")" | 118 | echo " (default: \"${YOCTO_RECOVERY_ROOTFS_PATH}/${YOCTO_DEFAULT_IMAGE}\")" |
111 | echo " -n TEXT_FILE add a release Notes text file" | 119 | echo " -n TEXT_FILE add a release Notes text file" |
112 | echo | 120 | echo |
113 | } | 121 | } |
114 | 122 | ||
115 | if [[ $EUID -ne 0 ]] ; then | 123 | if [[ $EUID -ne 0 ]] ; then |
116 | echo "This script must be run with super-user privileges" | 124 | echo "This script must be run with super-user privileges" |
117 | exit 1 | 125 | exit 1 |
118 | fi | 126 | fi |
119 | 127 | ||
120 | if [[ $MACHINE != "smarcimx8mp4g" && $MACHINE != "smarcimx8mp6g" ]] ; then | 128 | if [[ $MACHINE != "smarcimx8mq2g" && $MACHINE != "smarcimx8mq4g" && $MACHINE != "smarcimx8mp4g" && $MACHINE != "smarcimx8mp6g" ]] ; then |
121 | help | 129 | help |
122 | exit 1 | 130 | exit 1 |
123 | fi | 131 | fi |
124 | 132 | ||
125 | 133 | ||
126 | # Parse command line | 134 | # Parse command line |
127 | moreoptions=1 | 135 | moreoptions=1 |
128 | node="na" | 136 | node="na" |
129 | cal_only=0 | 137 | cal_only=0 |
130 | 138 | ||
131 | while [ "$moreoptions" = 1 -a $# -gt 0 ]; do | 139 | while [ "$moreoptions" = 1 -a $# -gt 0 ]; do |
132 | case $1 in | 140 | case $1 in |
133 | -h) help; exit 3 ;; | 141 | -h) help; exit 3 ;; |
134 | -s) cal_only=1 ;; | 142 | -s) cal_only=1 ;; |
135 | -a) AUTO_FILL_SD=1 ;; | 143 | -a) AUTO_FILL_SD=1 ;; |
136 | -r) shift; | 144 | -r) shift; |
137 | YOCTO_RECOVERY_ROOTFS_MASK_PATH=`readlink -e "${1}.tar.bz2"`; | 145 | YOCTO_RECOVERY_ROOTFS_MASK_PATH=`readlink -e "${1}.tar.bz2"`; |
138 | YOCTO_RECOVERY_ROOTFS_PATH=`dirname ${YOCTO_RECOVERY_ROOTFS_MASK_PATH}` | 146 | YOCTO_RECOVERY_ROOTFS_PATH=`dirname ${YOCTO_RECOVERY_ROOTFS_MASK_PATH}` |
139 | YOCTO_RECOVERY_ROOTFS_BASE_IN_NAME=`basename ${1}` | 147 | YOCTO_RECOVERY_ROOTFS_BASE_IN_NAME=`basename ${1}` |
140 | ;; | 148 | ;; |
141 | -n) shift; | 149 | -n) shift; |
142 | RELEASE_NOTES_FILE=${1} | 150 | RELEASE_NOTES_FILE=${1} |
143 | ;; | 151 | ;; |
144 | *) moreoptions=0;; | 152 | *) moreoptions=0;; |
145 | esac | 153 | esac |
146 | [ "$moreoptions" = 0 ] && [ $# -gt 1 ] && help && exit 1 | 154 | [ "$moreoptions" = 0 ] && [ $# -gt 1 ] && help && exit 1 |
147 | [ "$moreoptions" = 1 ] && shift | 155 | [ "$moreoptions" = 1 ] && shift |
148 | done | 156 | done |
149 | 157 | ||
150 | part="" | 158 | part="" |
151 | if [ `echo ${LPARAM_BLOCK_DEVICE} | grep -c mmcblk` -ne 0 ]; then | 159 | if [ `echo ${LPARAM_BLOCK_DEVICE} | grep -c mmcblk` -ne 0 ]; then |
152 | part="p" | 160 | part="p" |
153 | fi | 161 | fi |
154 | 162 | ||
155 | # allow only removable/loopback devices, to protect host PC | 163 | # allow only removable/loopback devices, to protect host PC |
156 | echo "MACHINE=${MACHINE}" | 164 | echo "MACHINE=${MACHINE}" |
157 | echo "SD card rootfs: ${YOCTO_DEFAULT_IMAGE}" | 165 | echo "SD card rootfs: ${YOCTO_DEFAULT_IMAGE}" |
158 | echo "Recovery rootfs: ${YOCTO_DEFAULT_IMAGE}" | 166 | echo "Recovery rootfs: ${YOCTO_DEFAULT_IMAGE}" |
159 | echo "================================================" | 167 | echo "================================================" |
160 | check_device ${LPARAM_BLOCK_DEVICE} | 168 | check_device ${LPARAM_BLOCK_DEVICE} |
161 | echo "================================================" | 169 | echo "================================================" |
162 | read -p "Press Enter to continue" | 170 | read -p "Press Enter to continue" |
163 | 171 | ||
164 | function delete_device | 172 | function delete_device |
165 | { | 173 | { |
166 | echo | 174 | echo |
167 | echo "Deleting current partitions" | 175 | echo "Deleting current partitions" |
168 | for ((i=0; i<10; i++)) | 176 | for ((i=0; i<10; i++)) |
169 | do | 177 | do |
170 | if [ `ls ${LPARAM_BLOCK_DEVICE}${part}$i 2> /dev/null | grep -c ${LPARAM_BLOCK_DEVICE}${part}$i` -ne 0 ]; then | 178 | 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 | 179 | dd if=/dev/zero of=${LPARAM_BLOCK_DEVICE}${part}$i bs=512 count=1024 |
172 | fi | 180 | fi |
173 | done | 181 | done |
174 | sync | 182 | sync |
175 | 183 | ||
176 | ((echo d; echo 1; echo d; echo 2; echo d; echo 3; echo d; echo w) | fdisk ${LPARAM_BLOCK_DEVICE} &> /dev/null) || true | 184 | ((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 | 185 | sync |
178 | 186 | ||
179 | dd if=/dev/zero of=${LPARAM_BLOCK_DEVICE} bs=1M count=160 | 187 | dd if=/dev/zero of=${LPARAM_BLOCK_DEVICE} bs=1M count=160 |
180 | sync; sleep 1 | 188 | sync; sleep 1 |
181 | } | 189 | } |
182 | 190 | ||
183 | function ceildiv | 191 | function ceildiv |
184 | { | 192 | { |
185 | local num=$1 | 193 | local num=$1 |
186 | local div=$2 | 194 | local div=$2 |
187 | echo $(( (num + div - 1) / div )) | 195 | echo $(( (num + div - 1) / div )) |
188 | } | 196 | } |
189 | 197 | ||
190 | function create_parts | 198 | function create_parts |
191 | { | 199 | { |
192 | echo | 200 | echo |
193 | echo "Creating new partitions" | 201 | echo "Creating new partitions" |
194 | # Get total card size | 202 | # Get total card size |
195 | TOTAL_SIZE=`fdisk -s ${LPARAM_BLOCK_DEVICE}` | 203 | TOTAL_SIZE=`fdisk -s ${LPARAM_BLOCK_DEVICE}` |
196 | TOTAL_SIZE=`expr ${TOTAL_SIZE} / 1024` | 204 | TOTAL_SIZE=`expr ${TOTAL_SIZE} / 1024` |
197 | ROOTFS_SIZE=`expr ${TOTAL_SIZE} - ${BOOTLOAD_RESERVE_SIZE} - ${PART1_SIZE} - ${SPARE_SIZE}` | 205 | ROOTFS_SIZE=`expr ${TOTAL_SIZE} - ${BOOTLOAD_RESERVE_SIZE} - ${PART1_SIZE} - ${SPARE_SIZE}` |
198 | 206 | ||
199 | echo "ROOT SIZE=${ROOTFS_SIZE} TOTAl SIZE=${TOTAL_SIZE}" | 207 | echo "ROOT SIZE=${ROOTFS_SIZE} TOTAl SIZE=${TOTAL_SIZE}" |
200 | 208 | ||
201 | BLOCK=`echo ${LPARAM_BLOCK_DEVICE} | cut -d "/" -f 3` | 209 | BLOCK=`echo ${LPARAM_BLOCK_DEVICE} | cut -d "/" -f 3` |
202 | SECT_SIZE_BYTES=`cat /sys/block/${BLOCK}/queue/physical_block_size` | 210 | SECT_SIZE_BYTES=`cat /sys/block/${BLOCK}/queue/physical_block_size` |
203 | 211 | ||
204 | BOOTLOAD_RESERVE_SIZE_BYTES=$((BOOTLOAD_RESERVE_SIZE * 1024 * 1024)) | 212 | BOOTLOAD_RESERVE_SIZE_BYTES=$((BOOTLOAD_RESERVE_SIZE * 1024 * 1024)) |
205 | PART1_SIZE_BYTES=$((PART1_SIZE * 1024 * 1024)) | 213 | PART1_SIZE_BYTES=$((PART1_SIZE * 1024 * 1024)) |
206 | PART1_END_BYTES=`expr ${BOOTLOAD_RESERVE_SIZE_BYTES} + ${PART1_SIZE_BYTES}` | 214 | PART1_END_BYTES=`expr ${BOOTLOAD_RESERVE_SIZE_BYTES} + ${PART1_SIZE_BYTES}` |
207 | ROOTFS_SIZE_BYTES=$((ROOTFS_SIZE * 1024 * 1024)) | 215 | ROOTFS_SIZE_BYTES=$((ROOTFS_SIZE * 1024 * 1024)) |
208 | 216 | ||
209 | PART1_FIRST_SECT=`ceildiv ${BOOTLOAD_RESERVE_SIZE_BYTES} ${SECT_SIZE_BYTES}` | 217 | PART1_FIRST_SECT=`ceildiv ${BOOTLOAD_RESERVE_SIZE_BYTES} ${SECT_SIZE_BYTES}` |
210 | PART1_END_SECT=`ceildiv ${PART1_END_BYTES} ${SECT_SIZE_BYTES}` | 218 | PART1_END_SECT=`ceildiv ${PART1_END_BYTES} ${SECT_SIZE_BYTES}` |
211 | PART2_FIRST_SECT=`expr ${PART1_END_SECT} + 1 ` | 219 | PART2_FIRST_SECT=`expr ${PART1_END_SECT} + 1 ` |
212 | 220 | ||
213 | (echo n; echo p; echo $BOOTPART; echo $PART1_FIRST_SECT; \ | 221 | (echo n; echo p; echo $BOOTPART; echo $PART1_FIRST_SECT; \ |
214 | echo $PART1_END_SECT; echo n; echo p; echo $ROOTFSPART; \ | 222 | 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 | 223 | echo $PART2_FIRST_SECT; echo; echo p; echo w) | fdisk -u ${LPARAM_BLOCK_DEVICE} > /dev/null |
216 | 224 | ||
217 | sleep 2; sync; | 225 | sleep 2; sync; |
218 | fdisk -l ${LPARAM_BLOCK_DEVICE} | 226 | fdisk -l ${LPARAM_BLOCK_DEVICE} |
219 | 227 | ||
220 | sleep 2; sync; | 228 | sleep 2; sync; |
221 | } | 229 | } |
222 | 230 | ||
223 | function format_parts | 231 | function format_parts |
224 | { | 232 | { |
225 | echo | 233 | echo |
226 | echo "Formatting partitions" | 234 | echo "Formatting partitions" |
227 | mkfs.vfat -F 16 ${LPARAM_BLOCK_DEVICE}${part}1 -n boot | 235 | mkfs.vfat -F 16 ${LPARAM_BLOCK_DEVICE}${part}1 -n boot |
228 | mkfs.ext4 ${LPARAM_BLOCK_DEVICE}${part}2 -L rootfs | 236 | mkfs.ext4 ${LPARAM_BLOCK_DEVICE}${part}2 -L rootfs |
229 | sync; sleep 1 | 237 | sync; sleep 1 |
230 | } | 238 | } |
231 | 239 | ||
232 | function install_bootloader | 240 | function install_bootloader |
233 | { | 241 | { |
234 | echo | 242 | echo |
235 | echo "Installing U-Boot" | 243 | 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 | 244 | dd if=${YOCTO_IMGS_PATH}/imx-boot-${MACHINE}-sd.bin-flash_evk of=${LPARAM_BLOCK_DEVICE} bs=1K seek=${BOOTLOADER_OFFSET}; sync |
237 | } | 245 | } |
238 | 246 | ||
239 | function mount_parts | 247 | function mount_parts |
240 | { | 248 | { |
241 | mkdir -p ${P1_MOUNT_DIR} | 249 | mkdir -p ${P1_MOUNT_DIR} |
242 | mkdir -p ${P2_MOUNT_DIR} | 250 | mkdir -p ${P2_MOUNT_DIR} |
243 | sync | 251 | sync |
244 | 252 | ||
245 | mount ${LPARAM_BLOCK_DEVICE}${part}1 ${P1_MOUNT_DIR} | 253 | mount ${LPARAM_BLOCK_DEVICE}${part}1 ${P1_MOUNT_DIR} |
246 | mount ${LPARAM_BLOCK_DEVICE}${part}2 ${P2_MOUNT_DIR} | 254 | mount ${LPARAM_BLOCK_DEVICE}${part}2 ${P2_MOUNT_DIR} |
247 | sleep 2; sync; | 255 | sleep 2; sync; |
248 | } | 256 | } |
249 | 257 | ||
250 | function unmount_parts | 258 | function unmount_parts |
251 | { | 259 | { |
252 | umount ${P1_MOUNT_DIR} | 260 | umount ${P1_MOUNT_DIR} |
253 | umount ${P2_MOUNT_DIR} | 261 | umount ${P2_MOUNT_DIR} |
254 | 262 | ||
255 | rm -rf ${P1_MOUNT_DIR} | 263 | rm -rf ${P1_MOUNT_DIR} |
256 | rm -rf ${P2_MOUNT_DIR} | 264 | rm -rf ${P2_MOUNT_DIR} |
257 | } | 265 | } |
258 | 266 | ||
259 | function install_yocto | 267 | function install_yocto |
260 | { | 268 | { |
261 | echo | 269 | echo |
262 | echo "Flashing \"Image, device tree and uEnv.txt\" partition" | 270 | echo "Flashing \"Image, device tree and uEnv.txt\" partition" |
263 | cp -v ${YOCTO_IMGS_PATH}/Image ${P1_MOUNT_DIR}/ | 271 | cp -v ${YOCTO_IMGS_PATH}/Image ${P1_MOUNT_DIR}/ |
264 | mkdir -p ${P1_MOUNT_DIR}/dtbs/ | 272 | mkdir -p ${P1_MOUNT_DIR}/dtbs/ |
273 | if [ "${MACHINE}" = "smarcimx8mq2g" ] || | ||
274 | [ "${MACHINE}" = "smarcimx8mq4g" ]; then | ||
275 | cp -v ${YOCTO_IMGS_PATH}/imx8mq-smarc${DISPLAY}.dtb ${P1_MOUNT_DIR}/dtbs/imx8mq-smarc.dtb | ||
276 | fi | ||
277 | if [ "${MACHINE}" = "smarcimx8mp4g" ] || | ||
278 | [ "${MACHINE}" = "smarcimx8mp6g" ]; then | ||
265 | cp -v ${YOCTO_IMGS_PATH}/imx8mp-smarc${DISPLAY}.dtb ${P1_MOUNT_DIR}/dtbs/imx8mp-smarc.dtb | 279 | cp -v ${YOCTO_IMGS_PATH}/imx8mp-smarc${DISPLAY}.dtb ${P1_MOUNT_DIR}/dtbs/imx8mp-smarc.dtb |
280 | fi | ||
266 | cp -v ${YOCTO_SCRIPTS_PATH}/uEnv.txt ${P1_MOUNT_DIR}/ | 281 | cp -v ${YOCTO_SCRIPTS_PATH}/uEnv.txt ${P1_MOUNT_DIR}/ |
267 | 282 | ||
268 | echo | 283 | echo |
269 | echo "Installing Yocto Root File System" | 284 | echo "Installing Yocto Root File System" |
270 | tar jxvf ${YOCTO_IMGS_PATH}/${YOCTO_DEFAULT_IMAGE}-${MACHINE}.tar.bz2 -C ${P2_MOUNT_DIR}/ | 285 | tar jxvf ${YOCTO_IMGS_PATH}/${YOCTO_DEFAULT_IMAGE}-${MACHINE}.tar.bz2 -C ${P2_MOUNT_DIR}/ |
271 | sync | 286 | sync |
272 | } | 287 | } |
273 | 288 | ||
274 | function copy_images | 289 | function copy_images |
275 | { | 290 | { |
276 | echo | 291 | echo |
277 | echo "Copying Yocto images to /opt/images/" | 292 | echo "Copying Yocto images to /opt/images/" |
278 | mkdir -p ${P2_MOUNT_DIR}/opt/images/Yocto | 293 | mkdir -p ${P2_MOUNT_DIR}/opt/images/Yocto |
279 | 294 | ||
280 | # Copy image for eMMC | 295 | # Copy image for eMMC |
281 | if [ -f ${YOCTO_IMGS_PATH}/${YOCTO_DEFAULT_IMAGE}-${MACHINE}.tar.bz2 ]; then | 296 | 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 | 297 | pv ${YOCTO_IMGS_PATH}/${YOCTO_DEFAULT_IMAGE}-${MACHINE}.tar.bz2 > ${P2_MOUNT_DIR}/opt/images/Yocto/rootfs.tar.bz2 |
283 | else | 298 | else |
284 | echo "rootfs.tar.gz file is not present. Installation on \"eMMC\" will not be supported." | 299 | echo "rootfs.tar.gz file is not present. Installation on \"eMMC\" will not be supported." |
285 | fi | 300 | fi |
286 | 301 | ||
287 | echo | 302 | echo |
288 | echo "Copying Kernel Images to /opt/images/" | 303 | echo "Copying Kernel Images to /opt/images/" |
289 | cp ${YOCTO_IMGS_PATH}/Image ${P2_MOUNT_DIR}/opt/images/Yocto/Image | 304 | cp ${YOCTO_IMGS_PATH}/Image ${P2_MOUNT_DIR}/opt/images/Yocto/Image |
290 | 305 | ||
291 | echo | 306 | echo |
292 | echo "Copying Kernel Device Tree Blob to /opt/images/" | 307 | echo "Copying Kernel Device Tree Blob to /opt/images/" |
293 | cp -v ${YOCTO_IMGS_PATH}/*.dtb ${P2_MOUNT_DIR}/opt/images/Yocto/ | 308 | cp -v ${YOCTO_IMGS_PATH}/*.dtb ${P2_MOUNT_DIR}/opt/images/Yocto/ |
294 | 309 | ||
295 | echo | 310 | echo |
296 | echo "Copying Kernel Parameter uEnv.txt to /opt/images/" | 311 | 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 | 312 | cp -v ${YOCTO_SCRIPTS_PATH}/uEnv_emmc.txt ${P2_MOUNT_DIR}/opt/images/Yocto/uEnv.txt |
298 | 313 | ||
299 | if [[ $MACHINE = "smarcimx8mp4g" || ${MACHINE} = "smarcimx8mp6g" ]]; then | 314 | if [[ $MACHINE = "smarcimx8mq2g" || ${MACHINE} = "smarcimx8mq4g" || $MACHINE = "smarcimx8mp4g" || ${MACHINE} = "smarcimx8mp6g" ]]; then |
300 | cp ${YOCTO_IMGS_PATH}/imx-boot-${MACHINE}-sd.bin-* ${P2_MOUNT_DIR}/opt/images/Yocto | 315 | 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) | 316 | (cd ${P2_MOUNT_DIR}/opt/images/Yocto; ln -fs imx-boot-${MACHINE}-sd.bin-flash_evk imx-boot-sd.bin) |
302 | else | 317 | else |
303 | cp ${YOCTO_IMGS_PATH}/imx-boot-${MACHINE}-sd.bin ${P2_MOUNT_DIR}/opt/images/Yocto/imx-boot-sd.bin | 318 | cp ${YOCTO_IMGS_PATH}/imx-boot-${MACHINE}-sd.bin ${P2_MOUNT_DIR}/opt/images/Yocto/imx-boot-sd.bin |
304 | fi | 319 | fi |
305 | } | 320 | } |
306 | 321 | ||
307 | function copy_scripts | 322 | function copy_scripts |
308 | { | 323 | { |
309 | echo | 324 | echo |
310 | echo "Copying scripts" | 325 | echo "Copying scripts" |
311 | 326 | ||
312 | cp ${YOCTO_SCRIPTS_PATH}/emb-create-yocto-emmc.sh ${P2_MOUNT_DIR}/usr/bin/ | 327 | cp ${YOCTO_SCRIPTS_PATH}/emb-create-yocto-emmc.sh ${P2_MOUNT_DIR}/usr/bin/ |
313 | } | 328 | } |
314 | 329 | ||
315 | umount ${LPARAM_BLOCK_DEVICE}${part}* 2> /dev/null || true | 330 | umount ${LPARAM_BLOCK_DEVICE}${part}* 2> /dev/null || true |
316 | 331 | ||
317 | delete_device | 332 | delete_device |
318 | create_parts | 333 | create_parts |
319 | format_parts | 334 | format_parts |
320 | 335 | ||
321 | mount_parts | 336 | mount_parts |
322 | install_yocto | 337 | install_yocto |
323 | copy_images | 338 | copy_images |
324 | copy_scripts | 339 | copy_scripts |
325 | 340 | ||
326 | echo | 341 | echo |
327 | echo "Syncing" | 342 | echo "Syncing" |
328 | sync | pv -t | 343 | sync | pv -t |
329 | 344 | ||
330 | unmount_parts | 345 | unmount_parts |
331 | 346 | ||
332 | install_bootloader | 347 | install_bootloader |
333 | 348 | ||
334 | echo | 349 | echo |
335 | echo "Done" | 350 | echo "Done" |
336 | echo "========Flash to SD card Completed!=========" | 351 | echo "========Flash to SD card Completed!=========" |
337 | 352 | ||
338 | exit 0 | 353 | exit 0 |
339 | 354 |
scripts/emb_mk_yocto_sdcard/uEnv.txt
1 | optargs="video=HDMI-A-1:1920x1080-32@60 consoleblank=0" | 1 | optargs="video=HDMI-A-1:1920x1080-32@60 consoleblank=0" |
2 | #optargs="video=HDMI-A-1:3840x2160-32@30 consoleblank=0" | 2 | #optargs="video=HDMI-A-1:3840x2160-32@30 consoleblank=0" |
3 | #optargs="video=HDMI-A-1:3840x2160-32@60 consoleblank=0" | 3 | #optargs="video=HDMI-A-1:3840x2160-32@60 consoleblank=0" |
4 | #console port SER3 | 4 | #console port SER3 |
5 | console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200 | 5 | console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200 |
6 | #console port SER2 | 6 | #console port SER2 |
7 | #console=ttymxc2,115200 earlycon=ec_imx6q,0x30880000,115200 | 7 | #console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200 |
8 | #console port SER1 | 8 | #console port SER1 |
9 | #console=ttymxc3,115200 earlycon=ec_imx6q,0x30a60000,115200 | 9 | #console=ttymxc2,115200 earlycon=ec_imx6q,0x30880000,115200 |
10 | #console port SER0 | 10 | #console port SER0 |
11 | #console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200 | 11 | #console=ttymxc3,115200 earlycon=ec_imx6q,0x30A60000,115200 |
12 | mmcdev=1 | 12 | mmcdev=1 |
13 | mmcpart=1 | 13 | mmcpart=1 |
14 | image=Image | 14 | image=Image |
15 | loadaddr=0x40480000 | 15 | loadaddr=0x40480000 |
16 | fdt_addr=0x43000000 | 16 | fdt_addr=0x43000000 |
17 | mmcroot=/dev/mmcblk1p2 rw | 17 | mmcroot=/dev/mmcblk1p2 rw |
18 | usbroot=/dev/sda2 rw | 18 | usbroot=/dev/sda2 rw |
19 | mmcrootfstype=ext4 rootwait fixrtc | 19 | mmcrootfstype=ext4 rootwait fixrtc |
20 | netdev=eth0 | 20 | netdev=eth0 |
21 | ethact=FEC0 | 21 | ethact=FEC0 |
22 | ipaddr=192.168.1.150 | 22 | ipaddr=192.168.1.150 |
23 | serverip=192.168.1.53 | 23 | serverip=192.168.1.53 |
24 | gatewayip=192.168.1.254 | 24 | gatewayip=192.168.1.254 |
25 | mmcargs=setenv bootargs console=${console} root=${mmcroot} rootfstype=${mmcrootfstype} ${optargs} | 25 | mmcargs=setenv bootargs cma=1280M console=${console} root=${mmcroot} rootfstype=${mmcrootfstype} ${optargs} |
26 | uenvcmd=run loadimage; run loadfdt; run mmcboot | 26 | uenvcmd=run loadimage; run loadfdt; run mmcboot |
27 | # USB Boot | 27 | # USB Boot |
28 | #usbargs=setenv bootargs console=${console} root=${usbroot} rootfstype=${mmcrootfstype} ${optargs} | 28 | #usbargs=setenv bootargs console=${console} root=${usbroot} rootfstype=${mmcrootfstype} ${optargs} |
29 | #uenvcmd=run loadusbimage; run loadusbfdt; run usbboot | 29 | #uenvcmd=run loadusbimage; run loadusbfdt; run usbboot |
30 | 30 |
scripts/emb_mk_yocto_sdcard/uEnv_emmc.txt
1 | optargs="video=HDMI-A-1:1920x1080-32@60 consoleblank=0" | 1 | optargs="video=HDMI-A-1:1920x1080-32@60 consoleblank=0" |
2 | #optargs="video=HDMI-A-1:3840x2160-32@30 consoleblank=0" | 2 | #optargs="video=HDMI-A-1:3840x2160-32@30 consoleblank=0" |
3 | #optargs="video=HDMI-A-1:3840x2160-32@60 consoleblank=0" | 3 | #optargs="video=HDMI-A-1:3840x2160-32@60 consoleblank=0" |
4 | #console port SER3 | 4 | #console port SER3 |
5 | console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200 | 5 | console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200 |
6 | #console port SER2 | 6 | #console port SER2 |
7 | #console=ttymxc2,115200 earlycon=ec_imx6q,0x30880000,115200 | 7 | #console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200 |
8 | #console port SER1 | 8 | #console port SER1 |
9 | #console=ttymxc3,115200 earlycon=ec_imx6q,0x30a60000,115200 | 9 | #console=ttymxc2,115200 earlycon=ec_imx6q,0x30880000,115200 |
10 | #console port SER0 | 10 | #console port SER0 |
11 | #console=ttymxc0,115200 earlycon=ec_imx6q,0x30860000,115200 | 11 | #console=ttymxc3,115200 earlycon=ec_imx6q,0x30A60000,115200 |
12 | mmcdev=2 | 12 | mmcdev=0 |
13 | mmcpart=1 | 13 | mmcpart=1 |
14 | image=Image | 14 | image=Image |
15 | loadaddr=0x40480000 | 15 | loadaddr=0x40480000 |
16 | fdt_addr=0x43000000 | 16 | fdt_addr=0x43000000 |
17 | mmcroot=/dev/mmcblk2p2 rw | 17 | mmcroot=/dev/mmcblk0p2 rw |
18 | usbroot=/dev/sda2 rw | 18 | usbroot=/dev/sda2 rw |
19 | mmcrootfstype=ext4 rootwait fixrtc | 19 | mmcrootfstype=ext4 rootwait fixrtc |
20 | netdev=eth0 | 20 | netdev=eth0 |
21 | ethact=FEC0 | 21 | ethact=FEC0 |
22 | ipaddr=192.168.1.150 | 22 | ipaddr=192.168.1.150 |
23 | serverip=192.168.1.53 | 23 | serverip=192.168.1.53 |
24 | gatewayip=192.168.1.254 | 24 | gatewayip=192.168.1.254 |
25 | mmcargs=setenv bootargs console=${console} root=${mmcroot} rootfstype=${mmcrootfstype} ${optargs} | 25 | mmcargs=setenv bootargs cma=1280M console=${console} root=${mmcroot} rootfstype=${mmcrootfstype} ${optargs} |
26 | uenvcmd=run loadimage; run loadfdt; run mmcboot | 26 | uenvcmd=run loadimage; run loadfdt; run mmcboot |
27 | # USB Boot | 27 | # USB Boot |
28 | #usbargs=setenv bootargs console=${console} root=${usbroot} rootfstype=${mmcrootfstype} ${optargs} | 28 | #usbargs=setenv bootargs console=${console} root=${usbroot} rootfstype=${mmcrootfstype} ${optargs} |
29 | #uenvcmd=run loadusbimage; run loadusbfdt; run usbboot | 29 | #uenvcmd=run loadusbimage; run loadusbfdt; run usbboot |
30 | 30 |