board: toradex: add Toradex SMARC iMX8MP

Add support for the Toradex SMARC iMX8MP.

Link: https://www.toradex.com/computer-on-modules/smarc-arm-family/nxp-imx-8m-plus
Link: https://www.toradex.com/products/carrier-board/smarc-development-board-kit
Signed-off-by: Vitor Soares <vitor.soares@toradex.com>
This commit is contained in:
Vitor Soares 2025-04-07 14:04:36 +01:00 committed by Fabio Estevam
parent be0f578439
commit dde53eae88
19 changed files with 4210 additions and 0 deletions

View File

@ -0,0 +1,80 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/* Copyright (C) 2024 Toradex */
#include "imx8mp-u-boot.dtsi"
/ {
sysinfo {
compatible = "toradex,sysinfo";
};
};
&gpio1 {
bootph-pre-ram;
};
&gpio2 {
bt_uart_gpio {
gpio-hog;
gpios = <9 GPIO_ACTIVE_HIGH>;
input;
line-name = "BT_UART_RXD_GPIO";
};
};
&gpio3 {
wifi_en_gpio {
gpio-hog;
gpios = <14 GPIO_ACTIVE_HIGH>;
output-high;
line-name = "CTRL_EN_WIFI";
};
};
&gpio5 {
bootph-pre-ram;
};
&i2c1 {
bootph-pre-ram;
};
&pca9450 {
bootph-pre-ram;
regulators {
bootph-pre-ram;
};
};
&pinctrl_i2c1 {
bootph-pre-ram;
};
&pinctrl_i2c1_gpio {
bootph-pre-ram;
};
&pinctrl_pmic {
bootph-pre-ram;
};
&pinctrl_uart4 {
bootph-pre-ram;
};
&uart3 {
status = "disabled";
};
&uart4 {
bootph-pre-ram;
};
&usdhc1 {
status = "disabled";
};
&usdhc3 {
bootph-pre-ram;
};

View File

@ -0,0 +1,297 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/* Copyright (C) 2025 Toradex */
/dts-v1/;
#include "imx8mp-toradex-smarc.dtsi"
/ {
model = "Toradex SMARC iMX8M Plus on Toradex SMARC Development Board";
compatible = "toradex,smarc-imx8mp-dev",
"toradex,smarc-imx8mp",
"fsl,imx8mp";
hdmi-connector {
compatible = "hdmi-connector";
label = "J64";
type = "a";
port {
native_hdmi_connector_in: endpoint {
remote-endpoint = <&hdmi_tx_out>;
};
};
};
reg_carrier_1p8v: regulator-carrier-1p8v {
compatible = "regulator-fixed";
regulator-max-microvolt = <1800000>;
regulator-min-microvolt = <1800000>;
regulator-name = "On-carrier 1V8";
};
sound {
compatible = "simple-audio-card";
simple-audio-card,bitclock-master = <&codec_dai>;
simple-audio-card,format = "i2s";
simple-audio-card,frame-master = <&codec_dai>;
simple-audio-card,mclk-fs = <256>;
simple-audio-card,name = "tdx-smarc-wm8904";
simple-audio-card,routing =
"Headphone Jack", "HPOUTL",
"Headphone Jack", "HPOUTR",
"IN2L", "Line In Jack",
"IN2R", "Line In Jack",
"Microphone Jack", "MICBIAS",
"IN1L", "Microphone Jack";
simple-audio-card,widgets =
"Microphone", "Microphone Jack",
"Headphone", "Headphone Jack",
"Line", "Line In Jack";
codec_dai: simple-audio-card,codec {
clocks = <&audio_blk_ctrl IMX8MP_CLK_AUDIOMIX_SAI1_MCLK1>;
sound-dai = <&wm8904_1a>;
};
simple-audio-card,cpu {
sound-dai = <&sai1>;
};
};
};
&aud2htx {
status = "okay";
};
/* SMARC SPI0 */
&ecspi1 {
status = "okay";
};
/* SMARC GBE0 */
&eqos {
status = "okay";
};
/* SMARC GBE1 */
&fec {
status = "okay";
};
/* SMARC CAN1 */
&flexcan1 {
status = "okay";
};
/* SMARC CAN0 */
&flexcan2 {
status = "okay";
};
&gpio1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio7>,
<&pinctrl_gpio8>,
<&pinctrl_gpio9>,
<&pinctrl_gpio10>,
<&pinctrl_gpio11>,
<&pinctrl_gpio12>,
<&pinctrl_gpio13>;
};
&gpio3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lvds_dsi_sel>;
};
&gpio4 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio4>, <&pinctrl_gpio6>;
};
&hdmi_pvi {
status = "okay";
};
/* SMARC HDMI */
&hdmi_tx {
status = "okay";
ports {
port@1 {
hdmi_tx_out: endpoint {
remote-endpoint = <&native_hdmi_connector_in>;
};
};
};
};
&hdmi_tx_phy {
status = "okay";
};
/* SMARC I2C_LCD */
&i2c2 {
status = "okay";
i2c-mux@70 {
compatible = "nxp,pca9543";
reg = <0x70>;
#address-cells = <1>;
#size-cells = <0>;
/* I2C on DSI Connector Pins 4/6 */
i2c_dsi_0: i2c@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
};
/* I2C on DSI Connector Pins 52/54 */
i2c_dsi_1: i2c@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
};
};
};
/* SMARC I2C_CAM0 */
&i2c3 {
status = "okay";
};
/* SMARC I2C_GP */
&i2c4 {
/* Audio Codec */
wm8904_1a: audio-codec@1a {
compatible = "wlf,wm8904";
reg = <0x1a>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sai1>, <&pinctrl_sai1_mclk>;
#sound-dai-cells = <0>;
clocks = <&audio_blk_ctrl IMX8MP_CLK_AUDIOMIX_SAI1_MCLK1>;
clock-names = "mclk";
AVDD-supply = <&reg_carrier_1p8v>;
CPVDD-supply = <&reg_carrier_1p8v>;
DBVDD-supply = <&reg_carrier_1p8v>;
DCVDD-supply = <&reg_carrier_1p8v>;
MICVDD-supply = <&reg_carrier_1p8v>;
};
/* On-Carrier Temperature Sensor */
temperature-sensor@4f {
compatible = "ti,tmp1075";
reg = <0x4f>;
};
/* On-Carrier EEPROM */
eeprom@57 {
compatible = "st,24c02", "atmel,24c02";
reg = <0x57>;
pagesize = <16>;
};
};
/* SMARC I2C_CAM1 */
&i2c5 {
status = "okay";
};
/* SMARC I2C_PM */
&i2c6 {
clock-frequency = <100000>;
status = "okay";
/* Fan controller */
fan@18 {
compatible = "ti,amc6821";
reg = <0x18>;
};
/* Current measurement into module VDD */
hwmon@40 {
compatible = "ti,ina226";
reg = <0x40>;
shunt-resistor = <5000>;
};
};
&lcdif3 {
status = "okay";
};
/* SMARC PCIE_A, M2 Key B */
&pcie {
status = "okay";
};
&pcie_phy {
status = "okay";
};
/* SMARC LCD1_BKLT_PWM */
&pwm1 {
status = "okay";
};
/* SMARC LCD0_BKLT_PWM */
&pwm2 {
status = "okay";
};
/* SMARC I2S0 */
&sai1 {
assigned-clocks = <&clk IMX8MP_CLK_SAI1>;
assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL1_OUT>;
assigned-clock-rates = <24576000>;
fsl,sai-mclk-direction-output;
status = "okay";
};
/* SMARC HDMI Audio */
&sound_hdmi {
status = "okay";
};
/* SMARC SER0, RS485. Optional M.2 KEY E */
&uart1 {
linux,rs485-enabled-at-boot-time;
rs485-rts-active-low;
rs485-rx-during-tx;
status = "okay";
};
/* SMARC SER2 */
&uart2 {
status = "okay";
};
/* SMARC SER1, used as the Linux Console */
&uart4 {
status = "okay";
};
/* SMARC USB0 */
&usb3_0 {
status = "okay";
};
/* SMARC USB1..4 */
&usb3_1 {
status = "okay";
};
&usb3_phy0 {
status = "okay";
};
&usb3_phy1 {
status = "okay";
};
/* SMARC SDIO */
&usdhc2 {
status = "okay";
};

File diff suppressed because it is too large Load Diff

View File

@ -291,6 +291,12 @@ config TARGET_KONTRON_PITX_IMX8M
select IMX8MQ
select IMX8M_LPDDR4
config TARGET_TORADEX_SMARC_IMX8MP
bool "Support Toradex SMARC iMX8M Plus module"
select IMX8MP
select SUPPORT_SPL
select IMX8M_LPDDR4
config TARGET_VERDIN_IMX8MM
bool "Support Toradex Verdin iMX8M Mini module"
select IMX8MM
@ -410,6 +416,7 @@ source "board/purism/librem5/Kconfig"
source "board/ronetix/imx8mq-cm/Kconfig"
source "board/technexion/pico-imx8mq/Kconfig"
source "board/variscite/imx8mn_var_som/Kconfig"
source "board/toradex/smarc-imx8mp/Kconfig"
source "board/toradex/verdin-imx8mm/Kconfig"
source "board/toradex/verdin-imx8mp/Kconfig"

View File

@ -165,6 +165,7 @@ const struct toradex_som toradex_modules[] = {
{ APALIS_IMX8QP_1300MHZ, "Apalis iMX8QP 2GB", TARGET_IS_ENABLED(APALIS_IMX8) },
{ APALIS_IMX8QM_8GB_WIFI_BT_IT_1300MHZ, "Apalis iMX8QM 8GB WB IT", TARGET_IS_ENABLED(APALIS_IMX8) },
{ SMARC_IMX95_HEXA_8GB_WB_IT, "SMARC iMX95 Hexa 8GB WB IT", TARGET_IS_ENABLED(TORADEX_SMARC_IMX95) },
{ SMARC_IMX8MPQ_4GB_WB_IT, "SMARC iMX8M Plus Quad 4GB WB IT", TARGET_IS_ENABLED(TORADEX_SMARC_IMX8MP) },
};
struct pid4list {

View File

@ -123,6 +123,7 @@ enum {
APALIS_IMX8QP_1300MHZ,
APALIS_IMX8QM_8GB_WIFI_BT_IT_1300MHZ, /* 95 */
SMARC_IMX95_HEXA_8GB_WB_IT,
SMARC_IMX8MPQ_4GB_WB_IT,
};
enum {

View File

@ -0,0 +1,39 @@
if TARGET_TORADEX_SMARC_IMX8MP
config IMX_CONFIG
default "board/toradex/smarc-imx8mp/imximage.cfg"
config SYS_BOARD
default "smarc-imx8mp"
config SYS_CONFIG_NAME
default "toradex-smarc-imx8mp"
config SYS_VENDOR
default "toradex"
config TDX_CFG_BLOCK
default y
config TDX_CFG_BLOCK_2ND_ETHADDR
default y
config TDX_CFG_BLOCK_DEV
default "0"
# Toradex config block in eMMC, at the end of 1st "boot sector"
config TDX_CFG_BLOCK_OFFSET
default "-512"
config TDX_CFG_BLOCK_PART
default "1"
config TDX_HAVE_EEPROM_EXTRA
default y
config TDX_HAVE_MMC
default y
source "board/toradex/common/Kconfig"
endif

View File

@ -0,0 +1,10 @@
Toradex Smarc iMX8M Plus
F: arch/arm/dts/imx8mp-toradex-smarc-dev-u-boot.dtsi
F: board/toradex/smarc-imx8mp/
F: board/toradex/common/
F: configs/toradex-smarc-imx8mp_defconfig
F: doc/board/toradex/toradex-smarc-imx8mp.rst
F: include/configs/toradex-smarc-imx8mp.h
M: Francesco Dolcini <francesco.dolcini@toradex.com>
S: Maintained
W: https://www.toradex.com/computer-on-modules/smarc-arm-family/nxp-imx-8m-plus

View File

@ -0,0 +1,9 @@
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2024 Toradex
obj-y += smarc-imx8mp.o
ifdef CONFIG_SPL_BUILD
obj-y += spl.o
obj-$(CONFIG_IMX8M_LPDDR4) += lpddr4_timing.o
endif

View File

@ -0,0 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Copyright (C) 2024 Toradex */
ROM_VERSION v2
BOOT_FROM emmc_fastboot
LOADER u-boot-spl-ddr.bin 0x920000

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Copyright (C) 2024 Toradex */
#ifndef __LPDDR4_TIMING_H__
#define __LPDDR4_TIMING_H__
void lpddr4_single_rank_training_patch(void);
#endif /* __LPDDR4_TIMING_H__ */

View File

@ -0,0 +1,85 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/* Copyright (C) 2024 Toradex */
#include <init.h>
#include <asm/global_data.h>
#include <asm-generic/gpio.h>
#include <linux/errno.h>
#include "../common/tdx-cfg-block.h"
DECLARE_GLOBAL_DATA_PTR;
int board_init(void)
{
return 0;
}
int board_phys_sdram_size(phys_size_t *size)
{
if (!size)
return -EINVAL;
*size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE + PHYS_SDRAM_2_SIZE);
return 0;
}
#if IS_ENABLED(CONFIG_OF_LIBFDT) && IS_ENABLED(CONFIG_OF_BOARD_SETUP)
static bool board_has_wifi(void)
{
struct gpio_desc *desc;
if (!gpio_hog_lookup_name("BT_UART_RXD_GPIO", &desc))
return !!dm_gpio_get_value(desc);
return true;
}
/*
* Module variants with a Wi-Fi/Bluetooth module use UART3 for Bluetooth,
* those without use UART3 as the SMARC SER3 UART.
* Test for a Wi-Fi module and if none found reassign UART3 interface to
* the SMARC SER3 pins.
*/
static void ft_board_assign_uart(void *blob)
{
const char *uart_path = "/soc@0/bus@30800000/spba-bus@30800000/serial@30880000";
const char *pinctrl_path = "/soc@0/bus@30000000/pinctrl@30330000/uart3grp";
int pinctrl_offset;
int uart_offset;
int bt_offset;
u32 phandle;
if (board_has_wifi())
return;
uart_offset = fdt_path_offset(blob, uart_path);
if (uart_offset < 0)
return;
fdt_delprop(blob, uart_offset, "uart-has-rtscts");
bt_offset = fdt_subnode_offset(blob, uart_offset, "bluetooth");
if (bt_offset < 0)
return;
fdt_del_node(blob, bt_offset);
pinctrl_offset = fdt_path_offset(blob, pinctrl_path);
if (pinctrl_offset < 0)
return;
phandle = fdt_get_phandle(blob, pinctrl_offset);
if (phandle < 0)
return;
fdt_setprop_u32(blob, uart_offset, "pinctrl-0", phandle);
}
int ft_board_setup(void *blob, struct bd_info *bd)
{
ft_board_assign_uart(blob);
return ft_common_board_setup(blob, bd);
}
#endif

View File

@ -0,0 +1,20 @@
boot_script_dhcp=boot.scr
boot_targets=mmc1 mmc0 dhcp
console=ttymxc1
fdt_addr_r=0x50200000
fdt_board=dev
initrd_addr=0x43800000
initrd_high=0xffffffffffffffff
kernel_addr_r=CONFIG_SYS_LOAD_ADDR
kernel_comp_addr_r=0x40200000
kernel_comp_size=0x08000000
ramdisk_addr_r=0x50300000
scriptaddr=0x50280000
update_uboot=
askenv confirm Did you load flash.bin (y/N)?;
if test $confirm = y; then
setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt
${blkcnt} / 0x200; mmc dev 0 1; mmc write ${loadaddr} 0x0
${blkcnt};
fi

View File

@ -0,0 +1,130 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/* Copyright (C) 2024 Toradex */
#include <hang.h>
#include <init.h>
#include <log.h>
#include <spl.h>
#include <asm/arch/clock.h>
#include <asm/arch/ddr.h>
#include <asm/arch/sys_proto.h>
#include <asm/global_data.h>
#include <asm/mach-imx/boot_mode.h>
#include <dm/device.h>
#include <power/pmic.h>
#include <power/pca9450.h>
#include "lpddr4_timing.h"
DECLARE_GLOBAL_DATA_PTR;
int spl_board_boot_device(enum boot_device boot_dev_spl)
{
return BOOT_DEVICE_BOOTROM;
}
void spl_dram_init(void)
{
/*
* Try configuring for dual rank memory falling back to single rank
*/
if (!ddr_init(&dram_timing)) {
puts("DDR configured as dual rank\n");
return;
}
lpddr4_single_rank_training_patch();
if (!ddr_init(&dram_timing)) {
puts("DDR configured as single rank\n");
return;
}
puts("DDR configuration failed\n");
}
void spl_board_init(void)
{
arch_misc_init();
/*
* Set GIC clock to 500Mhz for OD VDD_SOC. Kernel driver does
* not allow to change it. Should set the clock after PMIC
* setting done. Default is 400Mhz (system_pll1_800m with div = 2)
* set by ROM for ND VDD_SOC
*/
clock_enable(CCGR_GIC, 0);
clock_set_target_val(GIC_CLK_ROOT, CLK_ROOT_ON | CLK_ROOT_SOURCE_SEL(5));
clock_enable(CCGR_GIC, 1);
puts("Normal Boot\n");
}
int power_init_board(void)
{
struct udevice *dev;
int ret;
ret = pmic_get("pmic@25", &dev);
if (ret == -ENODEV) {
puts("No pmic@25\n");
return 0;
}
if (ret < 0)
return ret;
/* BUCKxOUT_DVS0/1 control BUCK123 output */
pmic_reg_write(dev, PCA9450_BUCK123_DVS, 0x29);
/*
* Increase VDD_SOC to typical value 0.95V before first
* DRAM access, set DVS1 to 0.85V for suspend.
* Enable DVS control through PMIC_STBY_REQ and
* set B1_ENMODE=1 (ON by PMIC_ON_REQ=H)
*/
if (IS_ENABLED(CONFIG_IMX8M_VDD_SOC_850MV))
/* set DVS0 to 0.85v for special case */
pmic_reg_write(dev, PCA9450_BUCK1OUT_DVS0, 0x14);
else
pmic_reg_write(dev, PCA9450_BUCK1OUT_DVS0, 0x1c);
pmic_reg_write(dev, PCA9450_BUCK1OUT_DVS1, 0x14);
pmic_reg_write(dev, PCA9450_BUCK1CTRL, 0x59);
/*
* Kernel uses OD/OD freq for SOC.
* To avoid timing risk from SOC to ARM,increase VDD_ARM to OD
* voltage 0.95V.
*/
pmic_reg_write(dev, PCA9450_BUCK2OUT_DVS0, 0x1c);
/* set LDO4 and CONFIG2 to enable the I2C level translator */
pmic_reg_write(dev, PCA9450_LDO4CTRL, 0x59);
pmic_reg_write(dev, PCA9450_CONFIG2, 0x1);
return 0;
}
/* Do not use BSS area in this phase */
void board_init_f(ulong dummy)
{
int ret;
arch_cpu_init();
init_uart_clk(3);
ret = spl_early_init();
if (ret) {
debug("spl_init() failed: %d\n", ret);
hang();
}
preloader_console_init();
enable_tzc380();
/* PMIC initialization */
power_init_board();
/* DDR initialization */
spl_dram_init();
}

View File

@ -0,0 +1,184 @@
CONFIG_ARM=y
CONFIG_ARCH_IMX8M=y
CONFIG_TEXT_BASE=0x40200000
CONFIG_SPL_GPIO=y
CONFIG_SPL_LIBCOMMON_SUPPORT=y
CONFIG_SPL_LIBGENERIC_SUPPORT=y
CONFIG_NR_DRAM_BANKS=2
CONFIG_ENV_SIZE=0x2000
CONFIG_ENV_OFFSET=0xFFFFDE00
CONFIG_DM_GPIO=y
CONFIG_DEFAULT_DEVICE_TREE="imx8mp-toradex-smarc-dev"
CONFIG_SPL_TEXT_BASE=0x920000
CONFIG_TARGET_TORADEX_SMARC_IMX8MP=y
CONFIG_OF_LIBFDT_OVERLAY=y
CONFIG_DM_RESET=y
CONFIG_SYS_MONITOR_LEN=524288
CONFIG_SPL_MMC=y
CONFIG_SPL_SERIAL=y
CONFIG_SPL_DRIVERS_MISC=y
CONFIG_SPL_STACK=0x960000
CONFIG_SPL_SYS_MALLOC_F_LEN=0x4000
CONFIG_SPL_HAS_BSS_LINKER_SECTION=y
CONFIG_SPL_BSS_START_ADDR=0x98fc00
CONFIG_SPL_BSS_MAX_SIZE=0x400
CONFIG_SPL=y
CONFIG_IMX_BOOTAUX=y
CONFIG_SPL_IMX_ROMAPI_LOADADDR=0x48000000
CONFIG_SYS_LOAD_ADDR=0x48200000
CONFIG_PCI=y
CONFIG_SYS_MEMTEST_START=0x40000000
CONFIG_SYS_MEMTEST_END=0x80000000
CONFIG_REMAKE_ELF=y
CONFIG_FIT=y
CONFIG_FIT_EXTERNAL_OFFSET=0x3000
CONFIG_FIT_VERBOSE=y
CONFIG_SPL_LOAD_FIT=y
CONFIG_BOOTSTD_FULL=y
# CONFIG_BOOTSTD_BOOTCOMMAND is not set
CONFIG_BOOTDELAY=1
CONFIG_OF_SYSTEM_SETUP=y
CONFIG_BOOTCOMMAND="bootflow scan -b"
CONFIG_USE_PREBOOT=y
CONFIG_PREBOOT="test -n ${fdtfile} || setenv fdtfile imx8mp-toradex-smarc-dev.dtb"
CONFIG_SYS_CBSIZE=2048
CONFIG_SYS_PBSIZE=2081
CONFIG_LOG=y
# CONFIG_DISPLAY_BOARDINFO is not set
CONFIG_DISPLAY_BOARDINFO_LATE=y
CONFIG_ARCH_MISC_INIT=y
CONFIG_SPL_MAX_SIZE=0x26000
CONFIG_SPL_BOARD_INIT=y
CONFIG_SPL_BOOTROM_SUPPORT=y
CONFIG_SPL_SYS_MALLOC_SIMPLE=y
# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
CONFIG_SPL_SYS_MALLOC=y
CONFIG_SPL_HAS_CUSTOM_MALLOC_START=y
CONFIG_SPL_CUSTOM_SYS_MALLOC_ADDR=0x42200000
CONFIG_SPL_SYS_MALLOC_SIZE=0x80000
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x300
CONFIG_SPL_I2C=y
CONFIG_SPL_POWER=y
CONFIG_SPL_WATCHDOG=y
CONFIG_SYS_PROMPT="SMARC iMX8MP # "
# CONFIG_BOOTM_NETBSD is not set
CONFIG_CMD_ASKENV=y
# CONFIG_CMD_EXPORTENV is not set
CONFIG_CRC32_VERIFY=y
CONFIG_CMD_MD5SUM=y
CONFIG_MD5SUM_VERIFY=y
CONFIG_CMD_MEMTEST=y
CONFIG_CMD_CLK=y
CONFIG_CMD_FUSE=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_I2C=y
CONFIG_CMD_MMC=y
CONFIG_CMD_PCI=y
CONFIG_CMD_READ=y
CONFIG_CMD_USB=y
CONFIG_CMD_USB_MASS_STORAGE=y
CONFIG_CMD_BOOTCOUNT=y
CONFIG_CMD_CACHE=y
CONFIG_CMD_TIME=y
CONFIG_CMD_SYSBOOT=y
CONFIG_CMD_UUID=y
CONFIG_CMD_REGULATOR=y
CONFIG_CMD_EXT4_WRITE=y
# CONFIG_ISO_PARTITION is not set
# CONFIG_SPL_EFI_PARTITION is not set
CONFIG_OF_CONTROL=y
CONFIG_SPL_OF_CONTROL=y
CONFIG_ENV_OVERWRITE=y
CONFIG_ENV_IS_IN_MMC=y
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
CONFIG_SYS_MMC_ENV_DEV=0
CONFIG_SYS_MMC_ENV_PART=1
CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
CONFIG_USE_ETHPRIME=y
CONFIG_ETHPRIME="eth0"
CONFIG_VERSION_VARIABLE=y
CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_IP_DEFRAG=y
CONFIG_TFTP_BLOCKSIZE=4096
CONFIG_SPL_DM=y
CONFIG_BOOTCOUNT_LIMIT=y
CONFIG_BOOTCOUNT_ENV=y
CONFIG_CLK_COMPOSITE_CCF=y
CONFIG_CLK_IMX8MP=y
CONFIG_FSL_CAAM=y
CONFIG_USB_FUNCTION_FASTBOOT=y
CONFIG_FASTBOOT_BUF_ADDR=0x44200000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_UUU_SUPPORT=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
CONFIG_GPIO_HOG=y
CONFIG_SPL_GPIO_HOG=y
CONFIG_MXC_GPIO=y
CONFIG_DM_PCA953X=y
CONFIG_DM_I2C=y
CONFIG_LED=y
CONFIG_LED_GPIO=y
CONFIG_I2C_EEPROM=y
CONFIG_SUPPORT_EMMC_BOOT=y
CONFIG_MMC_IO_VOLTAGE=y
CONFIG_SPL_MMC_IO_VOLTAGE=y
CONFIG_MMC_UHS_SUPPORT=y
CONFIG_SPL_MMC_UHS_SUPPORT=y
CONFIG_MMC_HS400_ES_SUPPORT=y
CONFIG_MMC_HS400_SUPPORT=y
CONFIG_SPL_MMC_HS400_SUPPORT=y
CONFIG_FSL_USDHC=y
CONFIG_PHY_ADDR_ENABLE=y
CONFIG_PHY_TI_DP83867=y
CONFIG_DM_MDIO=y
CONFIG_DM_ETH_PHY=y
CONFIG_DWC_ETH_QOS=y
CONFIG_DWC_ETH_QOS_IMX=y
CONFIG_FEC_MXC=y
CONFIG_RGMII=y
CONFIG_MII=y
CONFIG_NVME_PCI=y
CONFIG_PCIE_DW_IMX=y
CONFIG_PHY=y
CONFIG_PHY_IMX8MQ_USB=y
CONFIG_PHY_IMX8M_PCIE=y
CONFIG_PINCTRL=y
CONFIG_SPL_PINCTRL=y
CONFIG_PINCTRL_IMX8M=y
CONFIG_POWER_DOMAIN=y
CONFIG_IMX8M_POWER_DOMAIN=y
CONFIG_IMX8MP_HSIOMIX_BLKCTRL=y
CONFIG_DM_PMIC=y
CONFIG_DM_PMIC_PCA9450=y
CONFIG_SPL_DM_PMIC_PCA9450=y
CONFIG_DM_REGULATOR_PCA9450=y
CONFIG_SPL_DM_REGULATOR_PCA9450=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_REGULATOR_GPIO=y
CONFIG_DM_SERIAL=y
CONFIG_MXC_UART=y
CONFIG_SYSRESET=y
CONFIG_SPL_SYSRESET=y
CONFIG_SYSRESET_PSCI=y
CONFIG_SYSRESET_WATCHDOG=y
CONFIG_DM_THERMAL=y
CONFIG_IMX_TMU=y
CONFIG_USB=y
# CONFIG_SPL_DM_USB is not set
CONFIG_DM_USB_GADGET=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_DWC3=y
CONFIG_USB_XHCI_DWC3_OF_SIMPLE=y
CONFIG_USB_EHCI_HCD=y
# CONFIG_USB_EHCI_MX7 is not set
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GENERIC=y
CONFIG_USB_KEYBOARD=y
CONFIG_USB_HOST_ETHER=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_MANUFACTURER="Toradex"
CONFIG_USB_GADGET_VENDOR_NUM=0x1b67
CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
CONFIG_IMX_WATCHDOG=y
CONFIG_HEXDUMP=y

View File

@ -9,6 +9,7 @@ Toradex
apalis-imx8
colibri_imx7
colibri-imx8x
smarc-imx8mp
verdin-am62
verdin-imx8mm
verdin-imx8mp

View File

@ -0,0 +1,116 @@
.. SPDX-License-Identifier: GPL-2.0-or-later
Toradex SMARC iMX8M Plus Module
===============================
- SoM: https://www.toradex.com/computer-on-modules/smarc-arm-family/nxp-imx-8m-plus
- Carrier board: https://www.toradex.com/products/carrier-board/smarc-development-board-kit
Quick Start
-----------
- Build the ARM trusted firmware binary
- Get the DDR firmware
- Build U-Boot
- Flash to eMMC
- Boot
Get and Build the ARM Trusted Firmware (Trusted Firmware A)
-----------------------------------------------------------
.. code-block:: bash
$ echo "Downloading and building TF-A..."
$ git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
$ cd trusted-firmware-a
Then build ATF (TF-A):
.. code-block:: bash
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make PLAT=imx8mp IMX_BOOT_UART_BASE=0x30a60000 bl31
$ cp build/imx8mp/release/bl31.bin ../
Get the DDR Firmware
--------------------
.. code-block:: bash
$ cd ..
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.10.1.bin
$ chmod +x firmware-imx-8.10.1.bin
$ ./firmware-imx-8.10.1.bin
$ cp firmware-imx-8.10.1/firmware/ddr/synopsys/lpddr4*_202006.bin ./
Build U-Boot
------------
.. code-block:: bash
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make toradex-smarc-imx8mp_defconfig
$ make
Flash to eMMC
-------------
.. code-block:: bash
> tftpboot ${loadaddr} flash.bin
> setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200
> mmc dev 0 1 && mmc write ${loadaddr} 0x0 ${blkcnt}
As a convenience, instead of the last two commands, one may also use the update
U-Boot wrapper:
.. code-block:: bash
> run update_uboot
Boot
----
ATF, U-Boot proper and u-boot.dtb images are packed into a FIT image,
which is loaded and parsed by SPL.
Boot sequence is:
* SPL ---> ATF (TF-A) ---> U-Boot proper
Output::
U-Boot SPL 2025.04-rc5-00023-g34c31be81211 (Apr 04 2025 - 15:36:23 +0100)
Training FAILED
DDR configured as single rank
SEC0: RNG instantiated
Normal Boot
Trying to boot from BOOTROM
Boot Stage: Primary boot
Find img info 0x4802f200, size 1100
Need continue download 1024
NOTICE: Do not release JR0 to NS as it can be used by HAB
NOTICE: BL31: v2.11.0(release):v2.11.0-723-gbd298f5c30ac
NOTICE: BL31: Built : 14:18:43, Apr 4 2025
U-Boot 2025.04-rc5-00023-g34c31be81211 (Apr 04 2025 - 15:36:23 +0100)
CPU: Freescale i.MX8MP[8] rev1.1 1600 MHz (running at 1200 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 72C
Reset cause: POR
DRAM: 4 GiB
Core: 312 devices, 32 uclasses, devicetree: separate
WDT: Started watchdog@30280000 with servicing every 1000ms (60s timeout)
MMC: FSL_SDHC: 1, FSL_SDHC: 0
Loading Environment from MMC... Reading from MMC(0)... OK
In: serial@30a60000
Out: serial@30a60000
Err: serial@30a60000
Model: Toradex 0097 SMARC iMX8M Plus Quad 4GB WB IT V1.0A
Serial#: 15603364
SEC0: RNG instantiated
Net: Get shared mii bus on ethernet@30be0000
eth1: ethernet@30be0000, eth0: ethernet@30bf0000 [PRIME]
Hit any key to stop autoboot: 0
SMARC iMX8MP #

View File

@ -0,0 +1,28 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Copyright (C) 2024 Toradex */
#ifndef __TORADEX_SMARC_IMX8MP_H
#define __TORADEX_SMARC_IMX8MP_H
#include <asm/arch/imx-regs.h>
#include <linux/sizes.h>
#define CFG_SYS_UBOOT_BASE \
(QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
#ifdef CONFIG_SPL_BUILD
/* malloc f used before GD_FLG_FULL_MALLOC_INIT set */
#define CFG_MALLOC_F_ADDR 0x184000
#endif /* CONFIG_SPL_BUILD */
#define CFG_SYS_INIT_RAM_ADDR 0x40000000
#define CFG_SYS_INIT_RAM_SIZE SZ_512K
/* i.MX 8M Plus supports max. 8GB memory in two albeit consecutive banks */
#define CFG_SYS_SDRAM_BASE 0x40000000
#define PHYS_SDRAM 0x40000000
#define PHYS_SDRAM_SIZE (SZ_2G + SZ_1G)
#define PHYS_SDRAM_2 0x100000000
#define PHYS_SDRAM_2_SIZE (SZ_4G + SZ_1G)
#endif /* __TORADEX_SMARC_IMX8MP_H */