[PATCH 3/3] Add imx8mp-libra-fpsc board
Wadim Egorov
w.egorov at phytec.de
Tue Jul 29 08:25:01 CEST 2025
Hi,
On 7/25/25 1:35 PM, Benjamin Hahn wrote:
> Add new imx8mp-libra-fpsc board.
> USB is not working yet, as the entry in the upstream devicetree is
> missing.
>
> Signed-off-by: Benjamin Hahn <B.Hahn at phytec.de>
> ---
> arch/arm/dts/imx8mp-libra-rdk-fpsc-u-boot.dtsi | 78 +
> arch/arm/mach-imx/imx8m/Kconfig | 9 +
> board/phytec/imx8mp-libra-fpsc/Kconfig | 16 +
> board/phytec/imx8mp-libra-fpsc/MAINTAINERS | 8 +
> board/phytec/imx8mp-libra-fpsc/Makefile | 10 +
> board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.c | 114 ++
> .../phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.env | 30 +
> board/phytec/imx8mp-libra-fpsc/lpddr4_timing.c | 1846 ++++++++++++++++++++
> board/phytec/imx8mp-libra-fpsc/spl.c | 131 ++
> configs/imx8mp-libra-fpsc_defconfig | 170 ++
> include/configs/imx8mp-libra-fpsc.h | 27 +
> 11 files changed, 2439 insertions(+)
>
> diff --git a/arch/arm/dts/imx8mp-libra-rdk-fpsc-u-boot.dtsi b/arch/arm/dts/imx8mp-libra-rdk-fpsc-u-boot.dtsi
> new file mode 100644
> index 000000000000..8f0f86d9f09e
> --- /dev/null
> +++ b/arch/arm/dts/imx8mp-libra-rdk-fpsc-u-boot.dtsi
> @@ -0,0 +1,78 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2025 PHYTEC Messtechnik GmbH
> + */
> +
> +#include "imx8mp-u-boot.dtsi"
> +
> +/ {
> + wdt-reboot {
> + compatible = "wdt-reboot";
> + wdt = <&wdog1>;
> + bootph-pre-ram;
> + };
> +};
> +
> +®_usdhc2_vmmc {
> + bootph-pre-ram;
> +};
> +
> +&pinctrl_uart4 {
> + bootph-pre-ram;
> +};
> +
> +&pinctrl_usdhc2 {
> + bootph-pre-ram;
> +};
> +
> +&pinctrl_usdhc3 {
> + bootph-pre-ram;
> +};
> +
> +&pinctrl_wdog {
> + bootph-pre-ram;
> +};
> +
> +&gpio1 {
> + bootph-pre-ram;
> +};
> +
> +&gpio2 {
> + bootph-pre-ram;
> +};
> +
> +&gpio3 {
> + bootph-pre-ram;
> +};
> +
> +&gpio4 {
> + bootph-pre-ram;
> +};
> +
> +&gpio5 {
> + bootph-pre-ram;
> +};
> +
> +&uart4 {
> + bootph-pre-ram;
> +};
> +
> +&i2c1 {
> + bootph-pre-ram;
> +};
> +
> +&pmic {
> + bootph-pre-ram;
> +};
> +
> +&usdhc2 {
> + bootph-pre-ram;
> +};
> +
> +&usdhc3 {
> + bootph-pre-ram;
> +};
> +
> +&wdog1 {
> + bootph-pre-ram;
> +};
> diff --git a/arch/arm/mach-imx/imx8m/Kconfig b/arch/arm/mach-imx/imx8m/Kconfig
> index 74416a788473..2e4b86473c63 100644
> --- a/arch/arm/mach-imx/imx8m/Kconfig
> +++ b/arch/arm/mach-imx/imx8m/Kconfig
> @@ -345,6 +345,14 @@ config TARGET_PHYCORE_IMX8MP
> select IMX8M_LPDDR4
> imply OF_UPSTREAM
>
> +config TARGET_IMX8MP_LIBRA_FPSC
> + bool "PHYTEC Libra FPSC i.MX 8M Plus"
> + select IMX8MP
> + select SUPPORT_SPL
> + select IMX8M_LPDDR4
> + help
> + i.MX8M Plus Libra is an FPSC SOM based on NXP i.MX8MP.
> +
> config TARGET_IMX8MM_CL_IOT_GATE
> bool "CompuLab iot-gate-imx8"
> select IMX8MM
> @@ -411,6 +419,7 @@ source "board/msc/sm2s_imx8mp/Kconfig"
> source "board/mntre/imx8mq_reform2/Kconfig"
> source "board/phytec/phycore_imx8mm/Kconfig"
> source "board/phytec/phycore_imx8mp/Kconfig"
> +source "board/phytec/imx8mp-libra-fpsc/Kconfig"
> source "board/polyhex/imx8mp_debix_model_a/Kconfig"
> source "board/purism/librem5/Kconfig"
> source "board/ronetix/imx8mq-cm/Kconfig"
> diff --git a/board/phytec/imx8mp-libra-fpsc/Kconfig b/board/phytec/imx8mp-libra-fpsc/Kconfig
> new file mode 100644
> index 000000000000..449bfda79632
> --- /dev/null
> +++ b/board/phytec/imx8mp-libra-fpsc/Kconfig
> @@ -0,0 +1,16 @@
> +if TARGET_IMX8MP_LIBRA_FPSC
> +
> +config SYS_BOARD
> + default "imx8mp-libra-fpsc"
> +
> +config SYS_VENDOR
> + default "phytec"
> +
> +config IMX_CONFIG
> + default "board/phytec/phycore_imx8mp/imximage-8mp-sd.cfg"
This does not seem to be right. I guess you want to have a copy of that
file for this board.
> +
> +config SYS_CONFIG_NAME
> + default "imx8mp-libra-fpsc"
> +
> +source "board/phytec/common/Kconfig"
> +endif
> diff --git a/board/phytec/imx8mp-libra-fpsc/MAINTAINERS b/board/phytec/imx8mp-libra-fpsc/MAINTAINERS
> new file mode 100644
> index 000000000000..16b18b605e0d
> --- /dev/null
> +++ b/board/phytec/imx8mp-libra-fpsc/MAINTAINERS
> @@ -0,0 +1,8 @@
> +Libra-i.MX 8M Plus
> +M: Teresa Remmet <t.remmet at phytec.de>
> +W: https://www.phytec.eu/en/produkte/system-on-modules/phycore-imx-8m-plus-fpsc/
> +S: Maintained
> +F: arch/arm/dts/imx8mp-libra-rdk-fpsc-u-boot.dtsi
> +F: board/phytec/imx8mp-libra-fpsc/
> +F: configs/imx8mp-libra-fpsc_defconfig
> +F: include/configs/imx8mp-libra-fpsc.h
> diff --git a/board/phytec/imx8mp-libra-fpsc/Makefile b/board/phytec/imx8mp-libra-fpsc/Makefile
> new file mode 100644
> index 000000000000..8f956eb2ffbb
> --- /dev/null
> +++ b/board/phytec/imx8mp-libra-fpsc/Makefile
> @@ -0,0 +1,10 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +#
> +# Copyright (C) 2025 PHYTEC Messtechnik GmbH
> +
> +obj-y += imx8mp-libra-fpsc.o
> +
> +ifdef CONFIG_SPL_BUILD
> +obj-y += spl.o
> +obj-$(CONFIG_IMX8M_LPDDR4) += lpddr4_timing.o
> +endif
> diff --git a/board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.c b/board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.c
> new file mode 100644
> index 000000000000..89b3b6f90ecb
> --- /dev/null
> +++ b/board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.c
> @@ -0,0 +1,114 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2025 PHYTEC Messtechnik GmbH
> + */
> +
> +#include <asm/arch/clock.h>
> +#include <asm/arch/sys_proto.h>
> +#include <asm/global_data.h>
> +#include <linux/io.h>
> +#include <asm/mach-imx/boot_mode.h>
> +#include <dwc3-uboot.h>
> +#include <env.h>
> +#include <init.h>
> +#include <fdt_support.h>
> +#include <jffs2/load_kernel.h>
> +#include <miiphy.h>
> +#include <mtd_node.h>
> +#include <usb.h>
> +#include <i2c.h>
> +
> +#if IS_ENABLED(CONFIG_PHYTEC_SOM_DETECTION)
There is not need for this guard. Please drop it.
> +#include "../common/imx8m_som_detection.h"
> +#endif
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define EEPROM_ADDR 0x51
> +
> +#define TUSB_PORT_POL_CRTL_REG 0xB
> +#define TUSB_CUSTOM_POL BIT(7)
> +#define TUSB_P0_POL BIT(0)
> +
> +/*
> + * WORKAROUND for PCM-937-L 1618.0, 1618.1.
> + * USB HUB TUSB8042A has swapped upstream pin polarity.
> + * Set i2c registers to inform the hub that the lines
> + * are swapped.
> + */
> +void tusb8042a_swap_lines(void)
> +{
> + const u8 pol_swap_val = (TUSB_CUSTOM_POL | TUSB_P0_POL);
> + const int addr = 0x44;
> + struct udevice *dev = 0;
> + int ret = i2c_get_chip_for_busnum(2, addr, 1, &dev);
> +
> + if (!ret)
> + dm_i2c_write(dev, TUSB_PORT_POL_CRTL_REG, &pol_swap_val, 1);
> + else
> + printf("TUSB8042A: Failed to fixup USB HUB.\n");
> +}
> +
> +static int setup_fec(void)
> +{
> + struct iomuxc_gpr_base_regs *gpr =
> + (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR;
> +
> + /* Use 125M anatop REF_CLK1 for ENET1, not from external */
> + clrsetbits_le32(&gpr->gpr[1], 0x2000, 0);
> +
> + return 0;
> +}
> +
> +int board_init(void)
> +{
> +#if IS_ENABLED(CONFIG_PHYTEC_SOM_DETECTION)
> + int ret = phytec_eeprom_data_setup(NULL, 0, EEPROM_ADDR);
What is the point of reading out the EEPROM at this stage if you are not
using the information? Drop it and add it later when you actually need it.
> +
> + if (ret)
> + printf("%s: EEPROM data init failed\n", __func__);
> +#endif
> + tusb8042a_swap_lines();
> +
> + setup_fec();
> +
> + return 0;
> +}
> +
> +int board_mmc_get_env_dev(int devno)
> +{
> + return devno;
> +}
> +
> +int board_late_init(void)
> +{
> + switch (get_boot_device()) {
> + case SD2_BOOT:
> + env_set_ulong("mmcdev", 1);
> + if (!strcmp(env_get("boot_targets"), env_get_default("boot_targets")))
> + env_set("boot_targets", "mmc1 mmc2 ethernet");
> + break;
> + case MMC3_BOOT:
> + env_set_ulong("mmcdev", 2);
> + break;
> + case USB_BOOT:
> + printf("Detect USB boot. Will enter fastboot mode!\n");
> + if (!strcmp(env_get("bootcmd"), env_get_default("bootcmd")))
> + env_set("bootcmd", "fastboot 0; bootflow scan -lb;");
> + break;
> + default:
> + break;
> + }
> +
> + 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;
> +}
> diff --git a/board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.env b/board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.env
> new file mode 100644
> index 000000000000..edcd05aedd2e
> --- /dev/null
> +++ b/board/phytec/imx8mp-libra-fpsc/imx8mp-libra-fpsc.env
> @@ -0,0 +1,30 @@
> +bootmeths=script
> +boot_targets=mmc2 mmc1 ethernet
> +boot_script_dhcp=boot.scr.uimg
> +bootenv_addr_r=0x49100000
> +console=ttymxc3,115200
> +emmc_dev=2 /* This is needed by built-in uuu flash scripts */
> +fdt_addr_r=0x48000000
> +fdtfile=CONFIG_DEFAULT_FDT_FILE
> +fdtoverlay_addr_r=0x49000000
> +fit_fdtconf=conf-imx8mp-libra-rdk-fpsc.dtb
> +ip_dyn=no
> +ipaddr=192.168.3.11
> +kernel_addr_r=0x5A080000
> +kernel_comp_addr_r=0x60000000
> +kernel_comp_size=0x2000000
> +mmcautodetect=yes
> +mmcdev=CONFIG_SYS_MMC_ENV_DEV
> +mmcpart=1
> +mmcroot=2
> +netmask=255.225.255.0
> +nfsroot=/srv/nfs
> +no_bootenv=0
> +no_extensions=0
> +pxefile_addr_r=0x58600000
> +ramdisk_addr_r=0x5e000000
> +sd_dev=1 /* This is needed by built-in uuu flash scripts */
Can you bring both variables next to each other and use only a single
comment line?
> +script_offset_f=0x400000
> +script_size_f=0x2000
> +scriptaddr=0x58500000
> +serverip=192.168.3.10
> diff --git a/board/phytec/imx8mp-libra-fpsc/lpddr4_timing.c b/board/phytec/imx8mp-libra-fpsc/lpddr4_timing.c
> new file mode 100644
> index 000000000000..dd5b4ad8347a
> --- /dev/null
<snip>
> +++ b/board/phytec/imx8mp-libra-fpsc/spl.c
> @@ -0,0 +1,131 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2025 PHYTEC Messtechnik GmbH
> + */
> +
> +#include <config.h>
> +#include <asm/arch/clock.h>
> +#include <asm/arch/ddr.h>
> +#include <asm/arch/imx8mp_pins.h>
> +#include <asm/arch/sys_proto.h>
> +#include <asm/global_data.h>
> +#include <asm/mach-imx/boot_mode.h>
> +#include <asm/mach-imx/gpio.h>
> +#include <asm/mach-imx/mxc_i2c.h>
> +#include <asm/mach-imx/iomux-v3.h>
> +#include <hang.h>
> +#include <init.h>
> +#include <log.h>
> +#include <power/pmic.h>
> +#include <power/pca9450.h>
> +#include <spl.h>
> +
> +#include "../common/imx8m_som_detection.h"
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define EEPROM_ADDR 0x51
Why can't we have this defined in imx8m_som_detection.h?
Regards,
Wadim
More information about the U-Boot
mailing list