i.MX6DL after POR_B fail boot and Wi-Fi not work

Hello,

We have problems with i.MX6 SOM rev 1.5 after POR reset condition driving by POR_B pin, on our custom board (push-pull and open drain tested) and hummingboard rev 3.5 (U1 switch) .

Configuration info

  • i.MX6DL SOM rev 1.5 Wi-Fi + eMMC SRMX6DLWT1D01GE008V15C0/1 and S6LT18C15/0

  • Kernel 4.9.150

  • OS Debian 9.12

  • Wi-Fi firmware: 8.9.0.0.79 and phy firmware 8.2.0.0.242

  • Custom DTB from solidrun-imx_4.9.x_1.0.0_ga branch

diff --git a/arch/arm/boot/dts/imx6dl-hummingboard-emmc-som-v15.dts b/arch/arm/boot/dts/imx6dl-hummingboard-emmc-som-v15.dts
index 16854c17..0ee55dec 100644
--- a/arch/arm/boot/dts/imx6dl-hummingboard-emmc-som-v15.dts
+++ b/arch/arm/boot/dts/imx6dl-hummingboard-emmc-som-v15.dts
@@ -82,8 +82,8 @@
                MX6QDL_PAD_GPIO_1__GPIO1_IO01 0x400130b1
                MX6QDL_PAD_EIM_DA9__GPIO3_IO09 0x400130b1
                MX6QDL_PAD_EIM_DA8__GPIO3_IO08 0x400130b1
-               MX6QDL_PAD_EIM_DA7__GPIO3_IO07 0x400130b1
-               MX6QDL_PAD_EIM_DA6__GPIO3_IO06 0x400130b1
-               MX6QDL_PAD_EIM_DA3__GPIO3_IO03 0x400130b1
+               MX6QDL_PAD_EIM_DA7__GPIO3_IO07 0x40010001 /* MOD IO1 signal */
+               MX6QDL_PAD_EIM_DA6__GPIO3_IO06 0x40007001 /* MOD IO0 signal */
+               MX6QDL_PAD_EIM_DA3__GPIO3_IO03 0x40000839 /* MOD Reset signal */
        >;
 };
diff --git a/arch/arm/boot/dts/imx6qdl-hummingboard-vendor.dtsi b/arch/arm/boot/dts/imx6qdl-hummingboard-vendor.dtsi
index cec41146..a0b0a02b 100644
--- a/arch/arm/boot/dts/imx6qdl-hummingboard-vendor.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-hummingboard-vendor.dtsi
@@ -59,6 +59,7 @@
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_hummingboard_gpio3_5>;
                linux,rc-map-name = "rc-rc6-mce";
+               status = "disabled"; /* unused peripheral */
        };
 
        mxcfb1: fb@0 {
@@ -70,7 +71,7 @@
                int_clk = <0>;
                late_init = <0>;
                memory-region = <&graphics_mem>;
-               status = "okay";
+               status = "disabled"; /* unused peripheral */
         };
 
         mxcfb2: fb@1 {
@@ -89,6 +90,7 @@
                             "fsl,imx-audio-hdmi";
                model = "imx-audio-hdmi";
                hdmi-controller = <&hdmi_audio>;
+               status = "disabled";
        };
 
        v4l2_cap_0 {
@@ -110,13 +112,13 @@
 &dcic1 {
        dcic_id = <0>;
        dcic_mux = "dcic-hdmi";
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &dcic2 {
        dcic_id = <1>;
        dcic_mux = "dcic-lvds1";
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &ecspi2 {
@@ -148,23 +150,23 @@
 &hdmi_core {
        ipu_id = <0>;
        disp_id = <0>;
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &hdmi_video {
        fsl,phy_reg_vlev = <0x0294>;
        fsl,phy_reg_cksymtx = <0x800d>;
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &hdmi_audio {
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &hdmi_cec {
         pinctrl-names = "default";
         pinctrl-0 = <&pinctrl_hummingboard_hdmi>;
-        status = "okay";
+        status = "disabled"; /* unused peripheral */
 };
 
 &i2c1 {
@@ -187,6 +189,7 @@
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_hummingboard_mipi>;
                extended-buffer;
+               status = "disabled"; /* unused peripheral */
        };
 
        /* Pro baseboard model */
@@ -208,7 +211,7 @@
        clock-frequency = <100000>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_hummingboard_i2c3>;
-       status = "okay";
+       status = "disabled";
 };
 
 &iomuxc {
@@ -254,10 +257,17 @@
        v_channel = <0>;
        lanes = <2>;
        mipi_dphy_clk = /bits/ 8 <0x28>;
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &vpu_fsl {
        memory-region = <&graphics_mem>;
 };
 
+&sgtl5000 {
+       status = "disabled"; /* unused peripheral */
+};
+
+&fec {
+       status = "disabled"; /* unused peripheral */
+};
diff --git a/arch/arm/boot/dts/imx6qdl-hummingboard.dtsi b/arch/arm/boot/dts/imx6qdl-hummingboard.dtsi
index 6a6bb11d..30fb51ad 100644
--- a/arch/arm/boot/dts/imx6qdl-hummingboard.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-hummingboard.dtsi
@@ -106,6 +106,7 @@
        };
 
        sound-sgtl5000 {
+               status = "disabled"; /* unused peripheral */
                audio-codec = <&sgtl5000>;
                audio-routing =
                        "MIC_IN", "Mic Jack",
@@ -124,11 +125,12 @@
                /* IMX6 doesn't implement this yet */
                spdif-controller = <&spdif>;
                spdif-out;
+               status = "disabled"; /* unused peripheral */
        };
 };
 
 &audmux {
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &can1 {
@@ -141,7 +143,7 @@
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_hummingboard_hdmi>;
        ddc-i2c-bus = <&i2c2>;
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &i2c1 {
@@ -157,6 +159,7 @@
 
        /* Pro baseboard model */
        sgtl5000: codec@a {
+               status = "disabled"; /* unused peripheral */
                clocks = <&clks IMX6QDL_CLK_CKO>;
                compatible = "fsl,sgtl5000";
                pinctrl-names = "default";
@@ -171,7 +174,7 @@
        clock-frequency = <100000>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_hummingboard_i2c2>;
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &iomuxc {
@@ -200,11 +203,11 @@
                                MX6QDL_PAD_GPIO_1__GPIO1_IO01 0x400130b1
                                MX6QDL_PAD_EIM_DA9__GPIO3_IO09 0x400130b1
                                MX6QDL_PAD_EIM_DA8__GPIO3_IO08 0x400130b1
-                               MX6QDL_PAD_EIM_DA7__GPIO3_IO07 0x400130b1
-                               MX6QDL_PAD_EIM_DA6__GPIO3_IO06 0x400130b1
+                               MX6QDL_PAD_EIM_DA7__GPIO3_IO07 0x40010001 /* MOD IO1 signal */
+                               MX6QDL_PAD_EIM_DA6__GPIO3_IO06 0x40007001 /* MOD IO0 signal */
                                MX6QDL_PAD_SD3_CMD__GPIO7_IO02 0x400130b1
                                MX6QDL_PAD_SD3_CLK__GPIO7_IO03 0x400130b1
-                               MX6QDL_PAD_EIM_DA3__GPIO3_IO03 0x400130b1
+                               MX6QDL_PAD_EIM_DA3__GPIO3_IO03 0x40000839 /* MOD Reset signal */
                        >;
                };
 
@@ -343,6 +346,21 @@
                                MX6QDL_PAD_DISP0_DAT9__GPIO4_IO30 0x1b0b0
                        >;
                };
+
+               pinctrl_hummingboard_uart2: hummingboard2-uart2 {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD4_DAT4__UART2_RX_DATA 0x1b0b1
+                               MX6QDL_PAD_SD4_DAT7__UART2_TX_DATA 0x1b0b1
+                       >;
+               };
+
+               pinctrl_hummingboard_uart3: hummingboard2-uart3 {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D25__UART3_RX_DATA       0x1b0b1
+                               MX6QDL_PAD_EIM_D24__UART3_TX_DATA       0x1b0b1
+                       >;
+               };
+
        };
 };
 
@@ -350,7 +368,7 @@
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_hummingboard_pcie_reset>;
        reset-gpio = <&gpio3 4 GPIO_ACTIVE_LOW>;
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &pwm1 {
@@ -367,11 +385,11 @@
 &spdif {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_hummingboard_spdif>;
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &ssi1 {
-       status = "okay";
+       status = "disabled"; /* unused peripheral */
 };
 
 &usbh1 {
@@ -407,6 +425,18 @@
        status = "okay";
 };
 
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_hummingboard_uart2>;
+       status = "okay";
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_hummingboard_uart3>;
+       status = "okay";
+};
+
 &vcc_3v3 {
        vin-supply = <&v_3v2>;
 };

Test conditions :

  • 15 min loop with POR_B pin hold to low during 0,5 secs (our custom board)

  • 5 min loop with with POR_B pin hold to low during 2 secs (our older custom board)

  • manual try with U1 switch (hummingboard rev 3.5)

Boot :

Uboot trying to retrieve bad DTB file (SOM rev 1.3) in specific small temperature range after POR reset condition. This temperature range is not same for all SOM.

If uboot trying the bad DTB one time, all next POR condition he try same file.

------- POR_B condition -------

U-Boot SPL 2018.01-02297-g46b85f008c (Jan 21 2020 - 15:41:58)
Trying to boot from MMC1


U-Boot 2018.01-02297-g46b85f008c (Jan 21 2020 - 15:41:58 +0100)

CPU:   Freescale i.MX6DL rev1.3 996 MHz (running at 792 MHz)
CPU:   Commercial temperature grade (0C to 95C) at 46C
Reset cause: POR
Board: MX6 HummingBoard (som rev 1.5)
       Watchdog enabled
DRAM:  1 GiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
No panel detected: default to HDMI
Display: HDMI (1024x768)
In:    serial
Out:   serial
Err:   serial
Net:   FEC
switch to partitions #0, OK
mmc1(part 0) is current device
Scanning mmc 1:1...
Found /boot/extlinux/extlinux.conf
Retrieving file: /boot/extlinux/extlinux.conf
201 bytes read in 105 ms (1000 Bytes/s)
1:      default
Retrieving file: /boot/extlinux/../initrd
8831950 bytes read in 7846 ms (1.1 MiB/s)
Retrieving file: /boot/extlinux/../zImage
7153752 bytes read in 6488 ms (1.1 MiB/s)
append: console=ttymxc0,115200n8 root=UUID=removed rootfstype=ext4 rootwait quiet loglevel=0
Retrieving file: /boot/extlinux/../dtb-dir/imx6dl-hummingboard-emmc-som-v15.dtb
44523 bytes read in 535 ms (81.1 KiB/s)
## Flattened Device Tree blob at 18000000
   Booting using the fdt blob at 0x18000000
   Using Device Tree in place at 18000000, end 1800ddea

Starting kernel ...

SELinux:  Could not open policy file <= /etc/selinux/targeted/policy/policy.30:  No such file or directory

Debian GNU/Linux 9 ttymxc0

mer. juil. 2  2025 21:17:09
login: 
Debian GNU/Linux 9 ttymxc0

------- POR_B condition -------

U-Boot SPL 2018.01-02297-g46b85f008c (Jan 21 2020 - 15:41:58)
Trying to boot from MMC1


U-Boot 2018.01-02297-g46b85f008c (Jan 21 2020 - 15:41:58 +0100)

CPU:   Freescale i.MX6DL rev1.3 996 MHz (running at 792 MHz)
CPU:   Commercial temperature grade (0C to 95C) at 48C
Reset cause: POR
Board: MX6 HummingBoard
       Watchdog enabled
DRAM:  1 GiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
No panel detected: default to HDMI
Display: HDMI (1024x768)
In:    serial
Out:   serial
Err:   serial
Net:   FEC
switch to partitions #0, OK
mmc1(part 0) is current device
Scanning mmc 1:1...
Found /boot/extlinux/extlinux.conf
Retrieving file: /boot/extlinux/extlinux.conf
201 bytes read in 105 ms (1000 Bytes/s)
1:      default
Retrieving file: /boot/extlinux/../initrd
8831950 bytes read in 7835 ms (1.1 MiB/s)
Retrieving file: /boot/extlinux/../zImage
7153752 bytes read in 6490 ms (1.1 MiB/s)
append: console=ttymxc0,115200n8 root=UUID=removed rootfstype=ext4 rootwait quiet loglevel=0
Retrieving file: /boot/extlinux/../dtb-dir/imx6dl-hummingboard-emmc.dtb
** File not found /boot/extlinux/../dtb-dir/imx6dl-hummingboard-emmc.dtb **
Skipping default for failure retrieving fdt
SCRIPT FAILED: continuing...

Note: imx6dl-hummingboard-emmc.dtb file is not existing on our system, products are assembled with SOM rev 1.5.

TI Wi-Fi & Bluetooth :
In some case, rebind 2190000.usdhc can retriving Wi-Fi in working condition.
But if we see the following line in the dmesg:
Bluetooth: hci0: Failed to get CTS.
System can’t up Wi-Fi.

Thanks lot for help,

Enya

The existing u-boot code is designed to auto-detect if the board is a HummingBoard, HummingBoard2, or CuBox, however this functionality will only properly detect the latter 2 if using a rev 1.5 SOM. If you are using a HummingBoard or a custom board then I would recommend you remove the auto-detection code and just return the board type that you expect to load a device-tree for.

1 Like

The carrier board detection is good, our custom board use hummingboard schematics for carrier board reference. But, the SOM rev is wrong.

On previous ttymxc0 capture we can see :

SOM rev 1.5 detected:

Board: MX6 HummingBoard (som rev 1.5)
…
Retrieving file: /boot/extlinux/../dtb-dir/imx6dl-hummingboard-emmc-som-v15.dtb

Wrong SOM rev after POR_B condition:

Board: MX6 HummingBoard
…
Retrieving file: /boot/extlinux/../dtb-dir/imx6dl-hummingboard-emmc.dtb

In my case it’s not a bad carrier board detection

SOM rev is detected by uboot using :

TI MODULE -     i.MX6     -    Logic Levels
BT_EN     -   CSI0_DAT14  -        HIGH
WLAN_IRQ  -   CSI0_DAT18  -         LOW

These signals are not routed to DF40 connectors.

Workaround boot:

After tests, i found a “easy” workaround with the extlinux.conf file in /boot/extlinux.

@@ -5,4 +5,4 @@
-        FDTDIR ../dtb-dir/
+        FDT ../dtb-dir/<DTB file>

But this is a workaroud, not a fix for initial SOM rev detection problem.

Possible bad logic/signals levels from TI module ?

This workaroud no fix Wi-Fi and bluetooth problems after POR reset condition (using POR_B pin).

There are many things that can effect the state of those pins. That code was originally written to simplify the migration from rev 1.3 SOMs with the Broadcom wireless to the rev 1.5 SOMs with the TI Wilink8. This detection should really not be needed on any modern relevant platforms since the rev 1.3 SOMs are EOL. Again I highly recommend removing the autodection code and just using a fixed device-tree configuration for your custom carrier.

1 Like

I fully agree to you, removing auto detection in uboot is the best fix and best practices.

But no solved Wi-Fi problems after using POR_B pin.

It is possible to reset the TI module from OS for return to default reset values ?

Or do you have another solution ?

Thanks for help,

Enya

The TI module is powered by a regulator, which should get reset on reboot. Can you please post the dmesg output of a failed boot, so I can trace the Linux initialization?

If Wi-Fi works (i post just lines for TI module and SDIO interface):

[    4.663170] sdhci-esdhc-imx 2190000.usdhc: could not get ultra high speed state, work on normal mode
[    4.663241] sdhci-esdhc-imx 2190000.usdhc: allocated mmc-pwrseq
[    4.902320] mmc1: SDHCI controller on 2190000.usdhc [2190000.usdhc] using ADMA
[    4.921064] sdhci-esdhc-imx 2190000.usdhc: card claims to support voltages below defined range
[    4.940981] mmc1: new high speed SDIO card at address 0001
[   12.609712] wlcore: wl18xx HW: 183x or 180x, PG 2.2 (ROM 0x11)
[   12.616383] wlcore: WARNING Detected unconfigured mac address in nvs, derive from fuse instead.
[   12.616396] wlcore: WARNING This default nvs file can be removed from the file system
[   12.688196] wlcore: loaded

If Wi-Fi not work, we can read just the following lines:

[    6.641700] sdhci-esdhc-imx 2190000.usdhc: could not get ultra high speed state, work on normal mode
[    6.650944] sdhci-esdhc-imx 2190000.usdhc: allocated mmc-pwrseq
[    6.895297] mmc1: SDHCI controller on 2190000.usdhc [2190000.usdhc] using ADMA

Somtimes, we can get wifi with following commands:

echo -n "2190000.usdhc" > /sys/devices/soc0/soc/2100000.aips-bus/2190000.usdhc/driver/unbind
echo -n "2190000.usdhc" > /sys/bus/soc/devices/soc0/soc/2100000.aips-bus/2190000.usdhc/subsystem/drivers/sdhci-esdhc-imx/bind

Setup used
Image: sr-imx6-debian-stretch-20190925-cli.img.xz
SOM: iMX6DL rev 1.5 with SD card; iMX6DL rev 1.5 with eMMC
Carrier board: HummingBoard rev 3.0 & 3.5; custom boards

Enya

Would it be possible for you to test our latest mainline based distro, just as a point of reference. https://solid-run-images.sos-de-fra-1.exo.io/IMX6/Debian/sr-imx6-debian-bullseye-20210904-cli-sdhc.img.xz

dmesg output with sr-imx6-debian-bullseye-20210904-cli-sdhc.img.xz

Wifi works

[    7.469454] sdhci-esdhc-imx 2190000.mmc: allocated mmc-pwrseq
[    7.754164] mmc0: SDHCI controller on 2190000.mmc [2190000.mmc] using ADMA
[    7.767586] sdhci-esdhc-imx 2190000.mmc: card claims to support voltages below defined range
[   20.544670] wlcore: wl18xx HW: 183x or 180x, PG 2.2 (ROM 0x11)
[   20.558703] wlcore: WARNING Detected unconfigured mac address in nvs, derive from fuse instead.
[   20.567551] wlcore: WARNING This default nvs file can be removed from the file system
[   20.604904] wlcore: loaded

Wifi failed after POR_B

[    7.504930] sdhci-esdhc-imx 2190000.mmc: allocated mmc-pwrseq
[    7.873477] mmc0: SDHCI controller on 2190000.mmc [2190000.mmc] using ADMA

Hardware
SOM: iMX6DL rev 1.5 with SD card
Carrier board: HummingBoard rev 3.0

Enya

I have been going through any errata I can find when using the POR_B signal for reset and I haven’t found any that are specific to the signals used by the TI wifi SOC. I am going back to my original assumption that the wifi module is crashing and not resetting properly. Can you add code to u-boot that sets up the GPIOs for CSI0_DAT8 and CSI0_DAT14 and force them low in u-boot? Linux should then handle these signals properly after it has loaded.