mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-12-19 16:31:27 +01:00
board: toradex: add Toradex SMARC iMX95
Add support for the Toradex SMARC iMX95. Link: https://www.toradex.com/computer-on-modules/smarc-arm-family/nxp-imx95 Link: https://www.toradex.com/products/carrier-board/smarc-development-board-kit Signed-off-by: João Paulo Gonçalves <joao.goncalves@toradex.com> Co-developed-by: Emanuele Ghidoli <emanuele.ghidoli@toradex.com> Signed-off-by: Emanuele Ghidoli <emanuele.ghidoli@toradex.com> Co-developed-by: Max Krummenacher <max.krummenacher@toradex.com> Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com> Co-developed-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com> Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
This commit is contained in:
parent
f6f319f035
commit
ff0540fcfe
110
arch/arm/dts/imx95-toradex-smarc-dev-u-boot.dtsi
Normal file
110
arch/arm/dts/imx95-toradex-smarc-dev-u-boot.dtsi
Normal file
@ -0,0 +1,110 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/* Copyright (C) 2025 Toradex */
|
||||
|
||||
#include "imx95-u-boot.dtsi"
|
||||
|
||||
/ {
|
||||
sysinfo {
|
||||
compatible = "toradex,sysinfo";
|
||||
};
|
||||
};
|
||||
|
||||
&gpio1 {
|
||||
reg = <0 0x47400000 0 0x1000>, <0 0x47400040 0 0x40>;
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&lpi2c4 {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&lpuart1 {
|
||||
clocks = <&scmi_clk IMX95_CLK_LPUART1>, <&scmi_clk IMX95_CLK_LPUART1>;
|
||||
clock-names = "ipg", "per";
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
/* Conflict with JTAG interface */
|
||||
&lpuart5 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&pinctrl_lpi2c4 {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&pinctrl_lpi2c4_gpio {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&pinctrl_uart1 {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&pinctrl_usdhc1 {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&pinctrl_usdhc1_200mhz {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&pinctrl_usdhc2 {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&pinctrl_usdhc2_200mhz {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&pinctrl_usdhc2_cd {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&pinctrl_usdhc2_pwr_en {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&pinctrl_usdhc2_vsel {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
®_usdhc2_vmmc {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
®_usdhc2_vqmmc {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&som_gpio_expander_0 {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&som_gpio_expander_1 {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&usb2 {
|
||||
/delete-property/power-domains;
|
||||
};
|
||||
|
||||
&usb3 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&usb3_dwc3 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&usdhc1 {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&usdhc2 {
|
||||
bootph-pre-ram;
|
||||
};
|
||||
|
||||
&wdog3 {
|
||||
status = "disabled";
|
||||
};
|
||||
277
arch/arm/dts/imx95-toradex-smarc-dev.dts
Normal file
277
arch/arm/dts/imx95-toradex-smarc-dev.dts
Normal file
@ -0,0 +1,277 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/*
|
||||
* Copyright (C) 2025 Toradex
|
||||
*
|
||||
* https://www.toradex.com/computer-on-modules/smarc-arm-family/nxp-imx95
|
||||
* https://www.toradex.com/products/carrier-board/smarc-development-board-kit
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include <dt-bindings/pwm/pwm.h>
|
||||
#include "imx95-toradex-smarc.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Toradex SMARC iMX95 on Toradex SMARC Development Board";
|
||||
compatible = "toradex,smarc-imx95-dev",
|
||||
"toradex,smarc-imx95",
|
||||
"fsl,imx95";
|
||||
|
||||
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 = <&scmi_clk IMX95_CLK_SAI3>;
|
||||
sound-dai = <&wm8904_1a>;
|
||||
};
|
||||
|
||||
simple-audio-card,cpu {
|
||||
sound-dai = <&sai3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/* SMARC GBE0 */
|
||||
&enetc_port0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC GBE1 */
|
||||
&enetc_port1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC CAN0 */
|
||||
&flexcan1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC CAN1 */
|
||||
&flexcan2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&gpio2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gpio12>, <&pinctrl_gpio13>;
|
||||
};
|
||||
|
||||
&gpio4 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gpio10>, <&pinctrl_gpio11>;
|
||||
};
|
||||
|
||||
&gpio5 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gpio2>,
|
||||
<&pinctrl_gpio3>,
|
||||
<&pinctrl_gpio4>,
|
||||
<&pinctrl_gpio6>,
|
||||
<&pinctrl_gpio8>,
|
||||
<&pinctrl_gpio9>;
|
||||
};
|
||||
|
||||
/* SMARC I2C_CAM0 */
|
||||
&i2c_cam0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC I2C_CAM1 */
|
||||
&i2c_cam1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC I2C_GP */
|
||||
&lpi2c2 {
|
||||
status = "okay";
|
||||
|
||||
wm8904_1a: audio-codec@1a {
|
||||
compatible = "wlf,wm8904";
|
||||
reg = <0x1a>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sai3>, <&pinctrl_sai3_mclk>;
|
||||
#sound-dai-cells = <0>;
|
||||
clocks = <&scmi_clk IMX95_CLK_SAI3>;
|
||||
clock-names = "mclk";
|
||||
AVDD-supply = <®_carrier_1p8v>;
|
||||
CPVDD-supply = <®_carrier_1p8v>;
|
||||
DBVDD-supply = <®_carrier_1p8v>;
|
||||
DCVDD-supply = <®_carrier_1p8v>;
|
||||
MICVDD-supply = <®_carrier_1p8v>;
|
||||
};
|
||||
|
||||
temperature-sensor@4f {
|
||||
compatible = "ti,tmp1075";
|
||||
reg = <0x4f>;
|
||||
};
|
||||
|
||||
eeprom@57 {
|
||||
compatible = "st,24c02", "atmel,24c02";
|
||||
reg = <0x57>;
|
||||
pagesize = <16>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
/* SMARC I2C_PM */
|
||||
&lpi2c3 {
|
||||
clock-frequency = <100000>;
|
||||
status = "okay";
|
||||
|
||||
fan_controller: fan@18 {
|
||||
compatible = "ti,amc6821";
|
||||
reg = <0x18>;
|
||||
#pwm-cells = <2>;
|
||||
|
||||
fan {
|
||||
cooling-levels = <255>;
|
||||
pwms = <&fan_controller 40000 PWM_POLARITY_INVERTED>;
|
||||
};
|
||||
};
|
||||
|
||||
/* Current measurement into module VCC */
|
||||
hwmon@40 {
|
||||
compatible = "ti,ina226";
|
||||
reg = <0x40>;
|
||||
shunt-resistor = <5000>;
|
||||
};
|
||||
};
|
||||
|
||||
/* SMARC I2C_LCD */
|
||||
&lpi2c5 {
|
||||
status = "okay";
|
||||
|
||||
i2c-mux@70 {
|
||||
compatible = "nxp,pca9543";
|
||||
reg = <0x70>;
|
||||
i2c-mux-idle-disconnect;
|
||||
#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 SPI0 */
|
||||
&lpspi6 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC SER1, used as the Linux Console */
|
||||
&lpuart1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC SER0, RS485 */
|
||||
&lpuart2 {
|
||||
linux,rs485-enabled-at-boot-time;
|
||||
rs485-rts-active-low;
|
||||
rs485-rx-during-tx;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC SER3, RS232 */
|
||||
&lpuart3 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC MDIO, shared between all ethernet ports */
|
||||
&netc_emdio {
|
||||
status = "okay";
|
||||
|
||||
ethphy3: ethernet-phy@4 {
|
||||
reg = <4>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gpio7>;
|
||||
interrupt-parent = <&gpio5>;
|
||||
interrupts = <9 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
/* SMARC PCIE_A / M2 Key B */
|
||||
&pcie0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC PCIE_B / M2 Key E */
|
||||
&pcie1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC I2S0 */
|
||||
&sai3 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC LCD0_BKLT_PWM */
|
||||
&tpm3 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC LCD1_BKLT_PWM */
|
||||
&tpm4 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC GPIO5 as PWM */
|
||||
&tpm5 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC USB0 */
|
||||
&usb2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC USB1..4 */
|
||||
&usb3 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb3_dwc3 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb3_phy {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* SMARC SDIO */
|
||||
&usdhc2 {
|
||||
status = "okay";
|
||||
};
|
||||
1153
arch/arm/dts/imx95-toradex-smarc.dtsi
Normal file
1153
arch/arm/dts/imx95-toradex-smarc.dtsi
Normal file
File diff suppressed because it is too large
Load Diff
@ -113,6 +113,10 @@ config TARGET_IMX943_EVK
|
||||
imply BOOTSTD_FULL
|
||||
imply OF_UPSTREAM
|
||||
|
||||
config TARGET_TORADEX_SMARC_IMX95
|
||||
bool "Support Toradex SMARC iMX95"
|
||||
select IMX95
|
||||
|
||||
endchoice
|
||||
|
||||
source "board/freescale/imx91_evk/Kconfig"
|
||||
@ -123,6 +127,7 @@ source "board/phytec/phycore_imx93/Kconfig"
|
||||
source "board/variscite/imx93_var_som/Kconfig"
|
||||
source "board/freescale/imx94_evk/Kconfig"
|
||||
source "board/freescale/imx95_evk/Kconfig"
|
||||
source "board/toradex/smarc-imx95/Kconfig"
|
||||
|
||||
endif
|
||||
|
||||
|
||||
36
board/toradex/smarc-imx95/Kconfig
Normal file
36
board/toradex/smarc-imx95/Kconfig
Normal file
@ -0,0 +1,36 @@
|
||||
if TARGET_TORADEX_SMARC_IMX95
|
||||
|
||||
config SYS_BOARD
|
||||
default "smarc-imx95"
|
||||
|
||||
config SYS_VENDOR
|
||||
default "toradex"
|
||||
|
||||
config SYS_CONFIG_NAME
|
||||
default "toradex-smarc-imx95"
|
||||
|
||||
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
|
||||
11
board/toradex/smarc-imx95/MAINTAINERS
Normal file
11
board/toradex/smarc-imx95/MAINTAINERS
Normal file
@ -0,0 +1,11 @@
|
||||
Toradex SMARC iMX95
|
||||
F: arch/arm/dts/imx95-toradex-smarc.dtsi
|
||||
F: arch/arm/dts/imx95-toradex-smarc-dev.dts
|
||||
F: arch/arm/dts/imx95-toradex-smarc-dev-u-boot.dtsi
|
||||
F: board/toradex/smarc-imx95/
|
||||
F: configs/toradex-smarc-imx95_defconfig
|
||||
F: doc/board/toradex/smarc-imx95.rst
|
||||
F: include/configs/toradex-smarc-imx95.h
|
||||
M: Francesco Dolcini <francesco.dolcini@toradex.com>
|
||||
S: Maintained
|
||||
W: https://www.toradex.com/computer-on-modules/smarc-arm-family/nxp-imx95
|
||||
8
board/toradex/smarc-imx95/Makefile
Normal file
8
board/toradex/smarc-imx95/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
# Copyright (C) 2025 Toradex
|
||||
|
||||
obj-y += smarc-imx95.o
|
||||
|
||||
ifdef CONFIG_SPL_BUILD
|
||||
obj-y += spl.o
|
||||
endif
|
||||
31
board/toradex/smarc-imx95/smarc-imx95.c
Normal file
31
board/toradex/smarc-imx95/smarc-imx95.c
Normal file
@ -0,0 +1,31 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/* Copyright (C) 2025 Toradex */
|
||||
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/sys_proto.h>
|
||||
#include <fdt_support.h>
|
||||
#include <init.h>
|
||||
|
||||
#include "../common/tdx-cfg-block.h"
|
||||
|
||||
int board_early_init_f(void)
|
||||
{
|
||||
/* UART1: A55 */
|
||||
init_uart_clk(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int board_phys_sdram_size(phys_size_t *size)
|
||||
{
|
||||
*size = PHYS_SDRAM_SIZE + PHYS_SDRAM_2_SIZE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_OF_LIBFDT) && IS_ENABLED(CONFIG_OF_BOARD_SETUP)
|
||||
int ft_board_setup(void *blob, struct bd_info *bd)
|
||||
{
|
||||
return ft_common_board_setup(blob, bd);
|
||||
}
|
||||
#endif
|
||||
20
board/toradex/smarc-imx95/smarc-imx95.env
Normal file
20
board/toradex/smarc-imx95/smarc-imx95.env
Normal file
@ -0,0 +1,20 @@
|
||||
boot_scripts=boot.scr
|
||||
boot_script_dhcp=boot.scr
|
||||
boot_targets=mmc1 mmc0 dhcp
|
||||
console=ttyLP1
|
||||
fdt_board=dev
|
||||
fdt_addr=0x9c400000
|
||||
fdt_addr_r=0x9c400000
|
||||
kernel_addr_r=CONFIG_SYS_LOAD_ADDR
|
||||
kernel_comp_addr_r=0x94400000
|
||||
kernel_comp_size=0x8000000
|
||||
ramdisk_addr_r=0x9c800000
|
||||
scriptaddr=0x9c600000
|
||||
|
||||
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
|
||||
119
board/toradex/smarc-imx95/spl.c
Normal file
119
board/toradex/smarc-imx95/spl.c
Normal file
@ -0,0 +1,119 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/* Copyright (C) 2025 Toradex */
|
||||
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/mu.h>
|
||||
#include <asm/arch/sys_proto.h>
|
||||
#include <asm/mach-imx/boot_mode.h>
|
||||
#include <asm/mach-imx/ele_api.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/global_data.h>
|
||||
#include <clk.h>
|
||||
#include <dm/ofnode.h>
|
||||
#include <dm/uclass.h>
|
||||
#include <hang.h>
|
||||
#include <i2c.h>
|
||||
#include <init.h>
|
||||
#include <spl.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#define EC_I2C_BUS_NODE_PATH "/soc/bus@42000000/i2c@42540000"
|
||||
|
||||
int spl_board_boot_device(enum boot_device boot_dev_spl)
|
||||
{
|
||||
switch (boot_dev_spl) {
|
||||
case SD1_BOOT:
|
||||
case MMC1_BOOT:
|
||||
return BOOT_DEVICE_MMC1;
|
||||
case SD2_BOOT:
|
||||
case MMC2_BOOT:
|
||||
return BOOT_DEVICE_MMC2;
|
||||
case USB_BOOT:
|
||||
return BOOT_DEVICE_BOARD;
|
||||
default:
|
||||
return BOOT_DEVICE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
static void ec_boot_notify(void)
|
||||
{
|
||||
struct udevice *bus;
|
||||
struct udevice *i2c_dev;
|
||||
ofnode node;
|
||||
int ret;
|
||||
u8 val = 0x03;
|
||||
|
||||
node = ofnode_path(EC_I2C_BUS_NODE_PATH);
|
||||
if (!ofnode_valid(node)) {
|
||||
puts("Failed to find Toradex EC I2C BUS node\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = uclass_get_device_by_ofnode(UCLASS_I2C, node, &bus);
|
||||
if (ret) {
|
||||
puts("Failed to get Toradex EC I2C BUS\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = dm_i2c_probe(bus, 0x28, 0, &i2c_dev);
|
||||
if (ret) {
|
||||
puts("Toradex EC not found\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* USB configuration before this command (when SoC starts in recovery):
|
||||
* - SoC USB1 -> Smarc USB0
|
||||
* - SoC USB2 -> NC
|
||||
* After the command:
|
||||
* - SoC USB1 -> SoM hub -> Smarc USB1, USB2, USB3 and USB4
|
||||
* - SoC USB2 -> Smarc USB0
|
||||
*/
|
||||
ret = dm_i2c_write(i2c_dev, 0xD0, &val, 1);
|
||||
if (ret)
|
||||
puts("Cannot send command to Toradex EC\n");
|
||||
}
|
||||
|
||||
void spl_board_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = ele_start_rng();
|
||||
if (ret)
|
||||
printf("Fail to start RNG: %d\n", ret);
|
||||
}
|
||||
|
||||
void board_init_f(ulong dummy)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Clear the BSS. */
|
||||
memset(__bss_start, 0, __bss_end - __bss_start);
|
||||
|
||||
if (IS_ENABLED(CONFIG_SPL_RECOVER_DATA_SECTION))
|
||||
spl_save_restore_data();
|
||||
|
||||
timer_init();
|
||||
|
||||
/* Need dm_init() to run before any SCMI calls */
|
||||
spl_early_init();
|
||||
|
||||
/* Need to enable SCMI drivers and ELE driver before console */
|
||||
ret = imx9_probe_mu();
|
||||
if (ret)
|
||||
hang(); /* MU not probed, nothing can be outputed, hang */
|
||||
|
||||
arch_cpu_init();
|
||||
|
||||
board_early_init_f();
|
||||
|
||||
preloader_console_init();
|
||||
|
||||
debug("SOC: 0x%x\n", gd->arch.soc_rev);
|
||||
debug("LC: 0x%x\n", gd->arch.lifecycle);
|
||||
|
||||
ec_boot_notify();
|
||||
get_reset_reason(true, false);
|
||||
|
||||
board_init_r(NULL, 0);
|
||||
}
|
||||
172
configs/toradex-smarc-imx95_defconfig
Normal file
172
configs/toradex-smarc-imx95_defconfig
Normal file
@ -0,0 +1,172 @@
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARCH_IMX9=y
|
||||
CONFIG_TEXT_BASE=0x90200000
|
||||
CONFIG_SYS_MALLOC_LEN=0x2000000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x10000
|
||||
CONFIG_SPL_GPIO=y
|
||||
CONFIG_SPL_LIBCOMMON_SUPPORT=y
|
||||
CONFIG_SPL_LIBGENERIC_SUPPORT=y
|
||||
CONFIG_NR_DRAM_BANKS=3
|
||||
CONFIG_ENV_SIZE=0x2000
|
||||
CONFIG_ENV_OFFSET=0xFFFFDE00
|
||||
CONFIG_DM_GPIO=y
|
||||
CONFIG_DEFAULT_DEVICE_TREE="imx95-toradex-smarc-dev"
|
||||
CONFIG_TARGET_TORADEX_SMARC_IMX95=y
|
||||
CONFIG_OF_LIBFDT_OVERLAY=y
|
||||
CONFIG_SYS_MONITOR_LEN=524288
|
||||
CONFIG_SPL_MMC=y
|
||||
CONFIG_SPL_SERIAL=y
|
||||
CONFIG_SPL_DRIVERS_MISC=y
|
||||
CONFIG_SPL_TEXT_BASE=0x20480000
|
||||
CONFIG_SPL_HAS_BSS_LINKER_SECTION=y
|
||||
CONFIG_SPL_BSS_START_ADDR=0x204d6000
|
||||
CONFIG_SPL_BSS_MAX_SIZE=0x2000
|
||||
CONFIG_SYS_LOAD_ADDR=0x90400000
|
||||
CONFIG_WATCHDOG_TIMEOUT_MSECS=30000
|
||||
CONFIG_SPL=y
|
||||
CONFIG_SPL_RECOVER_DATA_SECTION=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_SYS_MEMTEST_START=0x90000000
|
||||
CONFIG_SYS_MEMTEST_END=0xA0000000
|
||||
CONFIG_REMAKE_ELF=y
|
||||
CONFIG_FIT=y
|
||||
CONFIG_FIT_VERBOSE=y
|
||||
CONFIG_BOOTSTD_FULL=y
|
||||
CONFIG_BOOTDELAY=1
|
||||
CONFIG_OF_SYSTEM_SETUP=y
|
||||
CONFIG_BOOTCOMMAND="bootflow scan -b"
|
||||
CONFIG_USE_PREBOOT=y
|
||||
CONFIG_PREBOOT="test -n ${fdtfile} || setenv fdtfile imx95-toradex-smarc-${fdt_board}.dtb"
|
||||
CONFIG_SYS_CBSIZE=2048
|
||||
CONFIG_SYS_PBSIZE=2074
|
||||
CONFIG_LOG=y
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
CONFIG_DISPLAY_BOARDINFO_LATE=y
|
||||
CONFIG_BOARD_EARLY_INIT_F=y
|
||||
# CONFIG_BOARD_INIT is not set
|
||||
CONFIG_SPL_MAX_SIZE=0x30000
|
||||
CONFIG_SPL_BOARD_INIT=y
|
||||
CONFIG_SPL_LOAD_IMX_CONTAINER=y
|
||||
CONFIG_IMX_CONTAINER_CFG="arch/arm/mach-imx/imx9/scmi/container.cfg"
|
||||
# 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=0x93200000
|
||||
CONFIG_SPL_SYS_MALLOC_SIZE=0x80000
|
||||
CONFIG_SPL_SYS_MMCSD_RAW_MODE=y
|
||||
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x1040
|
||||
CONFIG_SPL_I2C=y
|
||||
CONFIG_SPL_DM_MAILBOX=y
|
||||
CONFIG_SPL_POWER_DOMAIN=y
|
||||
CONFIG_SPL_THERMAL=y
|
||||
CONFIG_SPL_WATCHDOG=y
|
||||
CONFIG_SYS_PROMPT="SMARC iMX95 # "
|
||||
CONFIG_CMD_ASKENV=y
|
||||
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_SDP=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_HASH=y
|
||||
CONFIG_CMD_SCMI=y
|
||||
CONFIG_CMD_EXT4_WRITE=y
|
||||
CONFIG_OF_CONTROL=y
|
||||
CONFIG_SPL_OF_CONTROL=y
|
||||
CONFIG_ENV_OVERWRITE=y
|
||||
CONFIG_ENV_IS_IN_MMC=y
|
||||
CONFIG_ENV_RELOC_GD_ENV_ADDR=y
|
||||
CONFIG_ENV_MMC_EMMC_HW_PARTITION=1
|
||||
CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
|
||||
CONFIG_USE_ETHPRIME=y
|
||||
CONFIG_ETHPRIME="eth0"
|
||||
CONFIG_VERSION_VARIABLE=y
|
||||
CONFIG_PROT_UDP=y
|
||||
CONFIG_IP_DEFRAG=y
|
||||
CONFIG_NET_RANDOM_ETHADDR=y
|
||||
CONFIG_TFTP_BLOCKSIZE=4096
|
||||
CONFIG_SYS_RX_ETH_BUFFER=8
|
||||
CONFIG_SPL_DM=y
|
||||
CONFIG_SPL_DM_SEQ_ALIAS=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_SYSCON=y
|
||||
CONFIG_SPL_OF_TRANSLATE=y
|
||||
CONFIG_BOOTCOUNT_LIMIT=y
|
||||
CONFIG_BOOTCOUNT_ENV=y
|
||||
CONFIG_CLK=y
|
||||
CONFIG_SPL_CLK=y
|
||||
CONFIG_SPL_CLK_CCF=y
|
||||
CONFIG_CLK_CCF=y
|
||||
CONFIG_CLK_SCMI=y
|
||||
CONFIG_SPL_CLK_SCMI=y
|
||||
CONFIG_USB_FUNCTION_FASTBOOT=y
|
||||
CONFIG_FASTBOOT_BUF_ADDR=0x90400000
|
||||
CONFIG_FASTBOOT_BUF_SIZE=0x20000000
|
||||
CONFIG_FASTBOOT_FLASH=y
|
||||
CONFIG_FASTBOOT_UUU_SUPPORT=y
|
||||
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
|
||||
CONFIG_SPL_FIRMWARE=y
|
||||
# CONFIG_SCMI_AGENT_SMCCC is not set
|
||||
CONFIG_IMX_RGPIO2P=y
|
||||
CONFIG_DM_PCA953X=y
|
||||
CONFIG_SPL_DM_PCA953X=y
|
||||
CONFIG_DM_I2C=y
|
||||
CONFIG_SYS_I2C_IMX_LPI2C=y
|
||||
CONFIG_IMX_MU_MBOX=y
|
||||
CONFIG_I2C_EEPROM=y
|
||||
CONFIG_SUPPORT_EMMC_BOOT=y
|
||||
CONFIG_MMC_IO_VOLTAGE=y
|
||||
CONFIG_MMC_UHS_SUPPORT=y
|
||||
CONFIG_MMC_HS400_ES_SUPPORT=y
|
||||
CONFIG_MMC_HS400_SUPPORT=y
|
||||
CONFIG_FSL_USDHC=y
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHY_TI_DP83867=y
|
||||
CONFIG_DM_MDIO=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_FSL_ENETC=y
|
||||
CONFIG_PCIE_ECAM_GENERIC=y
|
||||
CONFIG_PHY_IMX8MQ_USB=y
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_SPL_PINCTRL=y
|
||||
CONFIG_PINCTRL_IMX_SCMI=y
|
||||
CONFIG_POWER_DOMAIN=y
|
||||
CONFIG_SCMI_POWER_DOMAIN=y
|
||||
CONFIG_DM_REGULATOR=y
|
||||
CONFIG_SPL_DM_REGULATOR=y
|
||||
CONFIG_DM_REGULATOR_FIXED=y
|
||||
CONFIG_SPL_DM_REGULATOR_FIXED=y
|
||||
CONFIG_DM_REGULATOR_GPIO=y
|
||||
CONFIG_DM_RNG=y
|
||||
CONFIG_DM_SERIAL=y
|
||||
CONFIG_FSL_LPUART=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_DM_THERMAL=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_EHCI_HCD=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_CI_UDC=y
|
||||
CONFIG_SDP_LOADADDR=0x90400000
|
||||
CONFIG_ULP_WATCHDOG=y
|
||||
# CONFIG_SPL_SHA1 is not set
|
||||
CONFIG_LZO=y
|
||||
CONFIG_HEXDUMP=y
|
||||
@ -10,6 +10,7 @@ Toradex
|
||||
colibri_imx7
|
||||
colibri-imx8x
|
||||
smarc-imx8mp
|
||||
smarc-imx95
|
||||
verdin-am62
|
||||
verdin-am62p
|
||||
verdin-imx8mm
|
||||
|
||||
172
doc/board/toradex/smarc-imx95.rst
Normal file
172
doc/board/toradex/smarc-imx95.rst
Normal file
@ -0,0 +1,172 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
Toradex SMARC iMX95 Module
|
||||
==========================
|
||||
|
||||
- SoM: https://www.toradex.com/computer-on-modules/smarc-arm-family/nxp-imx95
|
||||
- Carrier board: https://www.toradex.com/products/carrier-board/smarc-development-board-kit
|
||||
|
||||
Quick Start
|
||||
-----------
|
||||
|
||||
- Setup environment
|
||||
- Get ahab-container.img
|
||||
- Get DDR PHY Firmware Images
|
||||
- Get and Build OEI Images
|
||||
- Get and Build System Manager Image
|
||||
- Get and Build the ARM Trusted Firmware
|
||||
- Build the Bootloader Image
|
||||
- Boot
|
||||
|
||||
Setup environment
|
||||
-----------------
|
||||
|
||||
Suggested current toolchains are ARM 14.3 (https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads):
|
||||
|
||||
- https://developer.arm.com/-/media/Files/downloads/gnu/14.3.rel1/binrel/arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz
|
||||
- https://developer.arm.com/-/media/Files/downloads/gnu/14.3.rel1/binrel/arm-gnu-toolchain-14.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ export TOOLS=<path/to/directory/with/toolchains>
|
||||
$ export CROSS_COMPILE_32=<path/to/arm/toolchain/bin/>arm-none-linux-gnueabihf-
|
||||
$ export CROSS_COMPILE_64=<path/to/arm64/toolchain/bin/>aarch64-none-linux-gnu-
|
||||
|
||||
Get ahab-container.img
|
||||
----------------------
|
||||
|
||||
Note: `$srctree` is the U-Boot source directory
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-ele-imx-2.0.2-89161a8.bin
|
||||
$ sh firmware-ele-imx-2.0.2-89161a8.bin --auto-accept
|
||||
$ cp firmware-ele-imx-2.0.2-89161a8/mx95b0-ahab-container.img $(srctree)
|
||||
|
||||
Get DDR PHY Firmware Images
|
||||
---------------------------
|
||||
|
||||
Note: `$srctree` is the U-Boot source directory
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.28-994fa14.bin
|
||||
$ sh firmware-imx-8.28-994fa14.bin --auto-accept
|
||||
$ cp firmware-imx-8.28-994fa14/firmware/ddr/synopsys/lpddr5*v202409.bin $(srctree)
|
||||
|
||||
Get and Build OEI Images
|
||||
------------------------
|
||||
|
||||
Note: `$srctree` is the U-Boot source directory
|
||||
Get OEI from: https://git.toradex.com/cgit/imx-oei-toradex.git/
|
||||
branch: main
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ git clone -b main https://git.toradex.com/cgit/imx-oei-toradex.git/
|
||||
$ cd imx-oei-toradex
|
||||
|
||||
$ make board=toradex-smarc-imx95 oei=ddr DEBUG=1 r=B0 all
|
||||
$ cp build/toradex-smarc-imx95/ddr/oei-m33-ddr.bin $(srctree)
|
||||
|
||||
$ make board=toradex-smarc-imx95 oei=tcm DEBUG=1 r=B0 all
|
||||
$ cp build/toradex-smarc-imx95/tcm/oei-m33-tcm.bin $(srctree)
|
||||
|
||||
The Makefile will set `DDR_CONFIG` automatically based on the selected silicon
|
||||
revision.
|
||||
|
||||
Get and Build the System Manager Image
|
||||
--------------------------------------
|
||||
|
||||
Note: `$srctree` is the U-Boot source directory
|
||||
Get System Manager from: https://git.toradex.com/cgit/imx-sm-toradex.git/
|
||||
branch: main
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ git clone -b main https://git.toradex.com/cgit/imx-sm-toradex.git/
|
||||
$ cd imx-sm-toradex
|
||||
$ make config=tdx-smarc-imx95 all
|
||||
$ cp build/tdx-smarc-imx95/m33_image.bin $(srctree)
|
||||
|
||||
Get and Build the ARM Trusted Firmware
|
||||
--------------------------------------
|
||||
|
||||
Note: `$srctree` is the U-Boot source directory
|
||||
Get ATF from: https://github.com/nxp-imx/imx-atf/
|
||||
branch: lf_v2.12
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ export CROSS_COMPILE=$CROSS_COMPILE_64
|
||||
$ unset LDFLAGS
|
||||
$ unset AS
|
||||
$ git clone -b lf_v2.12 https://github.com/nxp-imx/imx-atf.git
|
||||
$ cd imx-atf
|
||||
$ make PLAT=imx95 bl31
|
||||
$ cp build/imx95/release/bl31.bin $(srctree)
|
||||
|
||||
Build the Bootloader Image
|
||||
--------------------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ export CROSS_COMPILE=$CROSS_COMPILE_64
|
||||
$ make toradex-smarc-imx95_defconfig
|
||||
$ make
|
||||
|
||||
Flash to eMMC
|
||||
-------------
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
> 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:: console
|
||||
|
||||
> run update_uboot
|
||||
|
||||
Boot
|
||||
----
|
||||
|
||||
Boot sequence is:
|
||||
|
||||
* SPL ---> ATF (TF-A) ---> U-Boot proper
|
||||
|
||||
Output:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
U-Boot SPL 2025.10-00635-g78345766559d (Oct 21 2025 - 17:53:04 +0200)
|
||||
SYS Boot reason: por, origin: -1, errid: -1
|
||||
Trying to boot from MMC1
|
||||
Primary set selected
|
||||
Load image from MMC/SD 0xd9000
|
||||
NOTICE: BL31: v2.12.0(release):lf-6.12.20-2.0.0
|
||||
NOTICE: BL31: Built : 17:34:12, Oct 21 2025
|
||||
|
||||
|
||||
U-Boot 2025.10-00635-g78345766559d (Oct 21 2025 - 17:53:04 +0200)
|
||||
|
||||
CPU: NXP i.MX95 Rev2.0 A55 at 1800 MHz - invalid sensor data
|
||||
DRAM: 7.8 GiB
|
||||
Core: 305 devices, 26 uclasses, devicetree: separate
|
||||
MMC: FSL_SDHC: 0, FSL_SDHC: 1
|
||||
Loading Environment from MMC... Reading from MMC(0)... OK
|
||||
In: serial@44380000
|
||||
Out: serial@44380000
|
||||
Err: serial@44380000
|
||||
Model: Toradex 0096 SMARC iMX95 Hexa 8GB WB IT V1.1A
|
||||
Serial#: 12594027
|
||||
|
||||
BuildInfo:
|
||||
- ELE firmware version 2.0.2-2a118457
|
||||
|
||||
Net: No ethernet found.
|
||||
Hit any key to stop autoboot: 0
|
||||
SMARC iMX95 #
|
||||
24
include/configs/toradex-smarc-imx95.h
Normal file
24
include/configs/toradex-smarc-imx95.h
Normal file
@ -0,0 +1,24 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/* Copyright (C) 2025 Toradex */
|
||||
|
||||
#ifndef __IMX95_TORADEX_SMARC_H
|
||||
#define __IMX95_TORADEX_SMARC_H
|
||||
|
||||
#include <linux/sizes.h>
|
||||
#include <asm/arch/imx-regs.h>
|
||||
|
||||
/* module has 8GB, 2GB from 0x80000000..0xffffffff, 6GB above */
|
||||
#define SZ_6G _AC(0x180000000, ULL)
|
||||
|
||||
/* first 256MB reserved for firmware */
|
||||
#define CFG_SYS_INIT_RAM_ADDR 0x90000000
|
||||
#define CFG_SYS_INIT_RAM_SIZE SZ_2M
|
||||
|
||||
#define CFG_SYS_SDRAM_BASE 0x90000000
|
||||
#define PHYS_SDRAM 0x90000000
|
||||
#define PHYS_SDRAM_SIZE (SZ_2G - SZ_256M)
|
||||
#define PHYS_SDRAM_2_SIZE SZ_6G
|
||||
|
||||
#define WDOG_BASE_ADDR WDG3_BASE_ADDR
|
||||
|
||||
#endif
|
||||
Loading…
x
Reference in New Issue
Block a user