[PATCH 3/3] Add imx8mp-libra-fpsc board
Benjamin Hahn
B.Hahn at phytec.de
Tue Jul 29 11:06:04 CEST 2025
Hi Wadim,
On 29.07.25 08:25, Wadim Egorov wrote:
> 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.
Will change to imx8mp-libra-fpsc.
>
>> +
>> +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.
There is a reason for this guard. We only want to include it, if we
actually use it, which is bound to this config.
We have the config deactivated for now, as we do not have EEPROM Images
on libra for the alpha release yet, but I expect that to be added for
the full release.
>
>> +#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.
See above.
>
>> +
>> + 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?
In this file, variables are sorted alphabetically, so no I can not bring
those next to each other.
>
>> +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?
Because EEPROM addresses are not standardized as far as I know and might
vary between different boards/SoMs. So this is board specific and not
general.
Regards,
Benjamin
>
> Regards,
> Wadim
More information about the U-Boot
mailing list