
Hi Fabio,
I used the following diff with "make mx28evk_defconfig", but unfortunately still get absolutely nothing on the DUART when running "mxsloader u-boot.sb". In fact, mxsloader returns immediately on trying to load my own u-boot.sb, whereas it hangs when running the vendor u-boot.sb, I assume because the CALL never returns. Additionally, there is no need to reset the board between attempting a custom u-boot and the vendor u-boot, indicating that the ROM-based SDP protocol handler is still running. This suggests that there is something wrong with the format of the u-boot.sb file which the ROM-based SDP protocol handler is rejecting, I would think?
I did confirm that the correct DTB file is being used, as the dts/dt.dtb file is identical to arch/arm/dts/imx28-wink-hub-v1.dtb. $ diff dts/dt.dtb arch/arm/dts/imx28-wink-hub-v1.dtb $ grep -i wink .config CONFIG_DEFAULT_DEVICE_TREE="imx28-wink-hub-v1" CONFIG_OF_LIST="imx28-wink-hub-v1"
diff --git a/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c b/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c index a94803ee93..f4d6cac878 100644 --- a/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c +++ b/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c @@ -29,7 +29,7 @@ __weak uint32_t mxs_dram_vals[] = { 0x00000000, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010101, 0x01010101, - 0x000f0f01, 0x0f02020a, 0x00000000, 0x00010101, + 0x000f0f01, 0x0f02020a, 0x00000000, 0x00000101, 0x00000100, 0x00000100, 0x00000000, 0x00000002, 0x01010000, 0x07080403, 0x06005003, 0x0a0000c8, 0x02009c40, 0x0002030c, 0x0036a609, 0x031a0612, diff --git a/arch/arm/dts/imx28-wink-hub-v1.dts b/arch/arm/dts/imx28-wink-hub-v1.dts new file mode 100644 index 0000000000..b0bddebce8 --- /dev/null +++ b/arch/arm/dts/imx28-wink-hub-v1.dts @@ -0,0 +1,206 @@ +// SPDX-License-Identifier: GPL-2.0+ +// Copyright (C) 2023 Fabio Estevam festevam@gmail.com + +/dts-v1/; +#include <dt-bindings/gpio/gpio.h> +#include "imx28.dtsi" +/ { + model = "i.MX28 Wink Hub v1"; + compatible = "wink,imx28-wink-hub-v1", "fsl,imx28"; + + memory@40000000 { + device_type = "memory"; + reg = <0x40000000 0>; /* will be filled in by U-Boot */ + }; + + reg_wifi: regulator-wifi { + compatible = "regulator-fixed"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_enable>; + regulator-name = "wifi"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + gpio = <&gpio1 13 GPIO_ACTIVE_HIGH>; + enable-active-high; + }; + + pwmleds { + compatible = "pwm-leds"; + + led-red { + label = "red"; + max-brightness = <255>; + pwms = <&pwm 0 500000>; + }; + + led-green { + label = "green"; + max-brightness = <255>; + pwms = <&pwm 1 500000>; + }; + + led-blue { + label = "blue"; + max-brightness = <255>; + pwms = <&pwm 3 500000>; + }; + }; +}; + +&auart0 { + pinctrl-names = "default"; + pinctrl-0 = <&auart0_pins_a>; + uart-has-rtscts; + status = "okay"; +}; + +&auart1 { + pinctrl-names = "default"; + pinctrl-0 = <&auart1_2pins_a>; + status = "okay"; +}; + +&auart2 { + pinctrl-names = "default"; + pinctrl-0 = <&auart2_2pins_a>; + status = "okay"; +}; + +&auart3 { + pinctrl-names = "default"; + pinctrl-0 = <&auart3_2pins_a>; + status = "okay"; +}; + +&auart4 { + pinctrl-names = "default"; + pinctrl-0 = <&auart4_pins_a>; + uart-has-rtscts; + status = "okay"; +}; + +&duart { + pinctrl-names = "default"; + pinctrl-0 = <&duart_pins_c>; + status = "okay"; +}; + +&gpmi { + pinctrl-names = "default"; + pinctrl-0 = <&gpmi_pins_a &gpmi_pins_extra>; + status = "okay"; + + partition@0 { + label = "gpmi-nfc-0-boot"; + reg = <0x0000000 0x300000>; + read-only; + }; + + partition@300000 { + label = "updater-kernel"; + reg = <0x0300000 0x400000>; + }; + + partition@700000 { + label = "updater-rootfs"; + reg = <0x0700000 0x1c00000>; + }; + + partition@2300000 { + label = "database"; + reg = <0x2300000 0x0800000>; + }; + + partition@2b00000 { + label = "app-kernel"; + reg = <0x2b00000 0x0800000>; + }; + + partition@3300000 { + label = "gpmi-nfc-general-use"; + reg = <0x3300000 0x4d00000>; + }; +}; + +&pwm { + pinctrl-names = "default"; + pinctrl-0 = <&pwm0_pins_a &pwm1_pins_a &pwm3_pins_a>; + status = "okay"; +}; + +&ssp0 { + compatible = "fsl,imx28-mmc"; + pinctrl-names = "default"; + pinctrl-0 = <&mmc0_4bit_pins_a &mmc0_sck_cfg>; + vmmc-supply = <®_wifi>; + bus-width = <4>; + status = "okay"; +}; + +&ssp3 { + compatible = "fsl,imx28-spi"; + pinctrl-names = "default"; + pinctrl-0 = <&spi3_pins_b>; + status = "okay"; + + spidev@0 { + /* Generic compatible to make spidev happy */ + compatible = "rohm,dh2228fv"; + reg = <0>; + spi-max-frequency = <24000000>; + }; +}; + +&usb0 { + dr_mode = "peripheral"; + status = "okay"; +}; + +&usbphy0 { + status = "okay"; +}; + +&pinctrl { + pinctrl-names = "default"; + pinctrl-0 = <&hog_pins_a>; + + hog_pins_a: hog@0 { + reg = <0>; + fsl,pinmux-ids = < + MX28_PAD_LCD_D07__GPIO_1_7 /* Z-Wave reset connection high output */ + MX28_PAD_LCD_D08__GPIO_1_8 /* Lutron Clear-Connect button */ + MX28_PAD_LCD_D09__GPIO_1_9 /* Zigbee reset */ + MX28_PAD_LCD_D10__GPIO_1_10 /* Lutron reset */ + MX28_PAD_LCD_D12__GPIO_1_12 /* Input Zigbee interrupt */ + MX28_PAD_LCD_D14__GPIO_1_14 /* BT power down */ + MX28_PAD_LCD_D15__GPIO_1_15 /* Kidde Reset */ + MX28_PAD_LCD_D16__GPIO_1_16 /* Kidde Data */ + MX28_PAD_LCD_D19__GPIO_1_19 /* Kidde RF Clock */ + MX28_PAD_LCD_D20__GPIO_1_20 /* Kidde GPIO */ + >; + fsl,drive-strength = <MXS_DRIVE_4mA>; + fsl,voltage = <MXS_VOLTAGE_HIGH>; + fsl,pull-up = <MXS_PULL_DISABLE>; + }; + + gpmi_pins_extra: gpmi-pins-extra@0 { + reg = <0>; + fsl,pinmux-ids = < + MX28_PAD_GPMI_CE1N__GPMI_CE1N + MX28_PAD_GPMI_RDY1__GPMI_READY1 + >; + fsl,drive-strength = <MXS_DRIVE_4mA>; + fsl,voltage = <MXS_VOLTAGE_HIGH>; + fsl,pull-up = <MXS_PULL_DISABLE>; + }; + + wifi_enable: wifi-enable@1 { + reg = <1>; + fsl,pinmux-ids = < + MX28_PAD_LCD_D13__GPIO_1_13 + >; + fsl,drive-strength = <MXS_DRIVE_4mA>; + fsl,voltage = <MXS_VOLTAGE_HIGH>; + fsl,pull-up = <MXS_PULL_DISABLE>; + }; +}; diff --git a/arch/arm/dts/imx28.dtsi b/arch/arm/dts/imx28.dtsi index 130b4145af..b4e2c8ec05 100644 --- a/arch/arm/dts/imx28.dtsi +++ b/arch/arm/dts/imx28.dtsi @@ -239,6 +239,17 @@ fsl,pull-up = <MXS_PULL_DISABLE>; };
+ duart_pins_c: duart@2 { + reg = <2>; + fsl,pinmux-ids = < + MX28_PAD_I2C0_SCL__DUART_RX + MX28_PAD_I2C0_SDA__DUART_TX + >; + fsl,drive-strength = <MXS_DRIVE_8mA>; + fsl,voltage = <MXS_VOLTAGE_HIGH>; + fsl,pull-up = <MXS_PULL_DISABLE>; + }; + duart_4pins_a: duart-4pins@0 { reg = <0>; fsl,pinmux-ids = < @@ -404,6 +415,20 @@ fsl,pull-up = <MXS_PULL_DISABLE>; };
+ auart4_pins_a: auart4-4pins@0 { + reg = <0>; + fsl,pinmux-ids = < + MX28_PAD_SAIF0_BITCLK__AUART4_RX + MX28_PAD_SAIF0_SDATA0__AUART4_TX + MX28_PAD_SAIF0_MCLK__AUART4_CTS + MX28_PAD_SAIF0_LRCLK__AUART4_RTS + >; + fsl,drive-strength = <MXS_DRIVE_4mA>; + fsl,voltage = <MXS_VOLTAGE_HIGH>; + fsl,pull-up = <MXS_PULL_DISABLE>; + }; + + auart4_2pins_a: auart4@0 { reg = <0>; fsl,pinmux-ids = < @@ -719,6 +744,16 @@ fsl,pull-up = <MXS_PULL_DISABLE>; };
+ pwm1_pins_a: pwm1@0 { + reg = <0>; + fsl,pinmux-ids = < + MX28_PAD_PWM1__PWM_1 + >; + fsl,drive-strength = <MXS_DRIVE_4mA>; + fsl,voltage = <MXS_VOLTAGE_HIGH>; + fsl,pull-up = <MXS_PULL_DISABLE>; + }; + pwm2_pins_a: pwm2@0 { reg = <0>; fsl,pinmux-ids = < diff --git a/board/freescale/mx28evk/iomux.c b/board/freescale/mx28evk/iomux.c index cc0c858854..1e9ba07f8f 100644 --- a/board/freescale/mx28evk/iomux.c +++ b/board/freescale/mx28evk/iomux.c @@ -22,8 +22,8 @@
const iomux_cfg_t iomux_setup[] = { /* DUART */ - MX28_PAD_PWM0__DUART_RX, - MX28_PAD_PWM1__DUART_TX, + MX28_PAD_I2C0_SCL__DUART_RX, + MX28_PAD_I2C0_SDA__DUART_TX,
/* MMC0 */ MX28_PAD_SSP0_DATA0__SSP0_D0 | MUX_CONFIG_SSP0,
On Mon, 25 Sept 2023 at 01:38, Fabio Estevam festevam@gmail.com wrote:
Hi Rogan,
On Sun, Sep 24, 2023 at 5:16 PM Rogan Dawes rogan@dawes.za.net wrote:
Hi folks,
I eventually decided that I did need to figure out the DRAM timings for
the Micron chip on my board, but I found an easier way than actually "understanding what I'm doing"! :-)
I pulled the vendor U-Boot image off the flash, skipped the appropriate
number of bytes until I was actually dealing with a u-boot.sb formatted image (looking for the STMP signature I found in the compiled mainline u-boot), then used the Rockbox project's sbtoelf tool to convert the SB back to two ELF files, the SPL.elf and the u-boot.elf. From there I loaded the SPL.elf into ghidra, then went looking for byte sequences found in arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c to see if I could locate them in the vendor blob. I did, right at the end of the binary, then converted bytes into uint32 sequences so that I could compare with the mxs_dram_vals for CONFIG_MX28.
Did the compare and found a single bit that is different between the two
sequences of initialisation values. Literally a 1 to a 0, and that is all. So I built mainline with that change, and an updated iomux_setup because the Wink Hub v1 uses MX28_PAD_I2C0_SCL__DUART_RX and MX28_PAD_I2C0_SDA__DUART_TX for its console pins. i was hoping to see it boot via mxsldr, but unfortunately, I got nothing.
Ideally, you should create a new imx28-wink_defconfig.
For a quick test, besides changing iomux_setup, please make sure that arch/arm/dts/imx28-evk.dts also has the duart pins changed.
How can I get the SPL to emit something on the console to confirm it is
running? i.e. before the DRAM initialisation?
SPL runs from the internal RAM, and should print something to the console prior to the DRAM init.