On 1/10/20 7:31 AM, Stefan Roese wrote:
> Hi Mauro,
>
> On 09.01.20 18:28, Mauro Condarelli wrote:
>> I managed to brick my target.
>>
>> Situation:
>> I have a board with a paleolithic (1.1.3) version of u-boot.
>> I had been testing by loading in ram from USB:
>>      usb reset; fatload usb 0 80010000 u-boot.bin; go 80010000
>> and everything was ok.
>> I changed a few settings (both defconfigs are attached below)
>> and tried "the real thing"
>> Unfortunately reflashing the actual boot produced a brick.
>> It does not utter a single byte.
>
> Ugh. Too bad.
I know... :(
 
>> I will have to reflash the original using an external apparatus
>> (which I don't have here, so I'll have to take target to another
>> location, probably tomorrow morning), but question is:
>> how do I debug such a situation?
>
> To debug very early problems, I suggest to use the DEBUG_UART interface
> in U-Boot. I also used it quite a lot before - also on this platform.
>
> Please see:
>
> include/debug_uart.h:
>
>     debug_uart_init();
>     printhex8(0x01);
>     ...
>
> When using UART2 on the MT7628 please make sure to configure the pin
> mux before using the debug uart. Otherwise nothing will get printed.
I do *not* do anything explicitly in my code, but I have stanzas in .dts
Is that supposed to be enough? (I attach my current .dts as I'm sorry to
say I don't really fully grok .dts and I'm merely copying stanzas around).

I have Your code in board/vocore/vocore2/board.c (attached), shouldn't
that be enough?
 
> BTW: This might also be a problem on your board, if you use UART2 and
> the muxing is not done no output will occur.
I understand (see above).

>> What could I have done so wrong?
>>
>> As You can see I changed only a few settings:
>>
>> --- configs/vocore_vocore2-ram_defconfig    2020-01-09
>> 16:11:12.568096050 +0100
>> +++ configs/vocore_vocore2_defconfig    2020-01-09 16:07:10.528267378
>> +0100
>> @@ -1,9 +1,12 @@
>>   CONFIG_MIPS=y
>> -CONFIG_SYS_TEXT_BASE=0x80010000
>> +CONFIG_SYS_TEXT_BASE=0x9c000000
>>   CONFIG_ENV_SIZE=0x00001000
>>   CONFIG_NR_DRAM_BANKS=1
>>   CONFIG_ARCH_MTMIPS=y
>>   CONFIG_BOARD_VOCORE2=y
>> +CONFIG_BOOT_ROM=y
>> +CONFIG_ONBOARD_DDR2_SIZE_1024MBIT=y
>> +CONFIG_ONBOARD_DDR2_CHIP_WIDTH_16BIT=y
>>   CONFIG_MIPS_BOOT_FDT=y
>>   CONFIG_ENV_VARS_UBOOT_CONFIG=y
>>   CONFIG_SYS_BOOT_GET_CMDLINE=y
>> ... in a way that's very similar to boards based on the same SoC
>> (linkit-smart-7688 and gardena-smart-gateway-mt7688).
>>
>> In the ancient u-boot I had to remove a header from the RAM
>> version, but this was not needed with current u-boot.
>>
>> Did I forget some step?
>
> Did you never program U-Boot into SPI NOR before on your VoCore2? 
Yes.
Up to now I've been using the RAM-version and loaded it from my old
(paleolithic 1.1.3) vendor-provided u-boot.
Note: I have modified and reflashed *that* u-boot several times, so I
was kind of confident I could do without much problem.
Of course it's fully possible some initialization done by old code is
missing in the new one.

> Which binary did you program? 
I flashed "u-boot.bin" which looks like a copy of "u-boot-dtb.bin";
this is exactly the same file I used for my RAM-based tests
(after switching _defconfig and recompiling, of course).

> How do the fist line look like? Here my output:
>
> $ hexdump -n 256 u-boot.bin
> 0000000 013f 1000 4800 4080 0000 0000 0000 0000
> 0000010 0000 0000 0000 0000 0000 0000 0000 0000
> *
> 0000100
Mine is quite similar:
$ hexdump -n 256 u-boot.bin
0000000 013f 1000 4800 4080 0000 0000 0000 0000
0000010 0000 0000 0000 0000 0000 0000 0000 0000
*
0000100

I'm about to go where there's a nailbed to reflash SPI NOR
"from outside"; I plan to read back what's on flash before
putting back the "old" u-boot to see if something went wrong
while flashing (but I doubt it).

Problem is how to proceed.
Old code did a lot of hard-coded initialization (non-DT-based)
which I don't (explicitly) do here (including a long RAM calibration
I didn't even try to understand).
I will bring back a certain number of working modules, so I will
have a certain number of "tries" before I need to go back for
hard reflashing; I should try to minimize commuting ;)

> Thanks,
> Stefan
Many Thanks
Mauro
// SPDX-License-Identifier: GPL-2.0
#include <dt-bindings/clock/mt7628-clk.h>
#include <dt-bindings/reset/mt7628-reset.h>

/ {
        #address-cells = <1>;
        #size-cells = <1>;
        compatible = "ralink,mt7628a-soc";

        cpus {
                #address-cells = <1>;
                #size-cells = <0>;

                cpu@0 {
                        compatible = "mti,mips24KEc";
                        device_type = "cpu";
                        reg = <0>;
                };
        };

        cpuintc: interrupt-controller {
                #address-cells = <0>;
                #interrupt-cells = <1>;
                interrupt-controller;
                compatible = "mti,cpu-interrupt-controller";
        };

        clk48m: clk48m@0 {
                compatible = "fixed-clock";

                clock-frequency = <48000000>;

                #clock-cells = <0>;
        };

        palmbus@10000000 {
                compatible = "palmbus", "simple-bus";
                reg = <0x10000000 0x200000>;
                ranges = <0x0 0x10000000 0x1FFFFF>;

                #address-cells = <1>;
                #size-cells = <1>;

                sysc: system-controller@0 {
                        compatible = "ralink,mt7620a-sysc", "syscon";
                        reg = <0x0 0x100>;
                };

                syscon-reboot {
                        compatible = "syscon-reboot";
                        regmap = <&sysc>;
                        offset = <0x34>;
                        mask = <0x1>;
                };

                clkctrl: clkctrl@0x2c {
                        reg = <0x2c 0x8>, <0x10 0x4>;
                        reg-names = "syscfg0", "clkcfg";
                        compatible = "mediatek,mt7628-clk";
                        #clock-cells = <1>;
                        u-boot,dm-pre-reloc;
                };

                clkgate: clkgate@0x30 {
                        reg = <0x30 0x4>;
                        compatible = "mediatek,mtmips-clk-gate";
                        #clock-cells = <1>;
                };

                rstctrl: rstctrl@0x34 {
                        reg = <0x34 0x4>;
                        compatible = "mediatek,mtmips-reset";
                        #reset-cells = <1>;
                };

                pinctrl: pinctrl@60 {
                        compatible = "mediatek,mt7628-pinctrl";
                        reg = <0x3c 0x2c>, <0x1300 0x100>;
                        reg-names = "gpiomode", "padconf";

                        pinctrl-names = "default";
                        pinctrl-0 = <&state_default>;

                        state_default: pin_state {
                        };

                        spi_single_pins: spi_single_pins {
                                groups = "spi";
                                function = "spi";
                        };

                        spi_dual_pins: spi_dual_pins {
                                spi_master_pins {
                                        groups = "spi";
                                        function = "spi";
                                };

                                spi_cs1_pin {
                                        groups = "spi cs1";
                                        function = "spi cs1";
                                };
                        };

                        uart0_pins: uart0_pins {
                                groups = "uart0";
                                function = "uart0";
                        };

                        uart1_pins: uart1_pins {
                                groups = "uart1";
                                function = "uart1";
                        };

                        uart2_pins: uart2_pins {
                                groups = "uart2";
                                function = "uart2";
                        };

                        i2c_pins: i2c_pins {
                                groups = "i2c";
                                function = "i2c";
                        };

                        ephy_iot_mode: ephy_iot_mode {
                                ephy4_1_dis {
                                        groups = "ephy4_1_pad";
                                        function = "digital";
                                };

                                ephy0_en {
                                        groups = "ephy0";
                                        function = "enable";
                                };
                        };

                        ephy_router_mode: ephy_router_mode {
                                ephy4_1_en {
                                        groups = "ephy4_1_pad";
                                        function = "analog";
                                };

                                ephy0_en {
                                        groups = "ephy0";
                                        function = "enable";
                                };
                        };

                        sd_iot_mode: sd_iot_mode {
                                ephy4_1_dis {
                                        groups = "ephy4_1_pad";
                                        function = "digital";
                                };

                                sdxc_en {
                                        groups = "sdmode";
                                        function = "sdxc";
                                };

                                sdxc_iot_mode {
                                        groups = "sd router";
                                        function = "iot";
                                };

                                sd_clk_pad {
                                        pins = "sd_clk";
                                        drive-strength-4g = <8>;
                                };
                        };

                        sd_router_mode: sd_router_mode {
                                sdxc_router_mode {
                                        groups = "sd router";
                                        function = "router";
                                };

                                sdxc_map_pins {
                                        groups = "gpio0", "i2s", "sdmode", \
                                                 "i2c", "uart1";
                                        function = "gpio";
                                };

                                sd_clk_pad {
                                        pins = "gpio0";
                                        drive-strength-28 = <8>;
                                };
                        };

                        emmc_iot_8bit_mode: emmc_iot_8bit_mode {
                                ephy4_1_dis {
                                        groups = "ephy4_1_pad";
                                        function = "digital";
                                };

                                emmc_en {
                                        groups = "sdmode";
                                        function = "sdxc";
                                };

                                emmc_iot_mode {
                                        groups = "sd router";
                                        function = "iot";
                                };

                                emmc_d4_d5 {
                                        groups = "uart2";
                                        function = "sdxc d5 d4";
                                };

                                emmc_d6 {
                                        groups = "pwm1";
                                        function = "sdxc d6";
                                };

                                emmc_d7 {
                                        groups = "pwm0";
                                        function = "sdxc d7";
                                };

                                sd_clk_pad {
                                        pins = "sd_clk";
                                        drive-strength-4g = <8>;
                                };
                        };
                };

                watchdog: watchdog@100 {
                        compatible = "ralink,mt7628a-wdt", 
"mediatek,mt7621-wdt";
                        reg = <0x100 0x30>;

                        resets = <&rstctrl MT7628_TIMER_RST>;
                        reset-names = "wdt";

                        interrupt-parent = <&intc>;
                        interrupts = <24>;
                };

                intc: interrupt-controller@200 {
                        compatible = "ralink,rt2880-intc";
                        reg = <0x200 0x100>;

                        interrupt-controller;
                        #interrupt-cells = <1>;

                        resets = <&rstctrl MT7628_INT_RST>;
                        reset-names = "intc";

                        interrupt-parent = <&cpuintc>;
                        interrupts = <2>;

                        ralink,intc-registers = <0x9c 0xa0
                                                 0x6c 0xa4
                                                 0x80 0x78>;
                };

                memory-controller@300 {
                        compatible = "ralink,mt7620a-memc";
                        reg = <0x300 0x100>;
                };

                gpio@600 {
                        #address-cells = <1>;
                        #size-cells = <0>;

                        compatible = "mtk,mt7628-gpio", "mtk,mt7621-gpio";
                        reg = <0x600 0x100>;

                        resets = <&rstctrl MT7628_PIO_RST>;
                        reset-names = "pio";

                        interrupt-parent = <&intc>;
                        interrupts = <6>;

                        gpio0: bank@0 {
                                reg = <0>;
                                compatible = "mtk,mt7621-gpio-bank";
                                gpio-controller;
                                #gpio-cells = <2>;
                        };

                        gpio1: bank@1 {
                                reg = <1>;
                                compatible = "mtk,mt7621-gpio-bank";
                                gpio-controller;
                                #gpio-cells = <2>;
                        };

                        gpio2: bank@2 {
                                reg = <2>;
                                compatible = "mtk,mt7621-gpio-bank";
                                gpio-controller;
                                #gpio-cells = <2>;
                        };
                };

                spi0: spi@b00 {
                        compatible = "ralink,mt7621-spi";
                        reg = <0xb00 0x40>;

                        resets = <&rstctrl MT7628_SPI_RST>;
                        reset-names = "spi";

                        #address-cells = <1>;
                        #size-cells = <0>;

                        clocks = <&clkctrl CLK_SPI>;
                };

                uart0: uartlite@c00 {
                        compatible = "mediatek,hsuart", "ns16550a";
                        reg = <0xc00 0x100>;

                        pinctrl-names = "default";
                        pinctrl-0 = <&uart0_pins>;

                        clocks = <&clkctrl CLK_UART0>;

                        resets = <&rstctrl MT7628_UART0_RST>;
                        reset-names = "uart0";

                        interrupt-parent = <&intc>;
                        interrupts = <20>;

                        reg-shift = <2>;
                };

                uart1: uart1@d00 {
                        compatible = "mediatek,hsuart", "ns16550a";
                        reg = <0xd00 0x100>;

                        pinctrl-names = "default";
                        pinctrl-0 = <&uart1_pins>;

                        clocks = <&clkctrl CLK_UART1>;

                        resets = <&rstctrl MT7628_UART1_RST>;
                        reset-names = "uart1";

                        interrupt-parent = <&intc>;
                        interrupts = <21>;

                        reg-shift = <2>;
                };

                uart2: uart2@e00 {
                        compatible = "mediatek,hsuart", "ns16550a";
                        reg = <0xe00 0x100>;

                        pinctrl-names = "default";
                        pinctrl-0 = <&uart2_pins>;

                        clocks = <&clkctrl CLK_UART2>;

                        resets = <&rstctrl MT7628_UART2_RST>;
                        reset-names = "uart2";

                        interrupt-parent = <&intc>;
                        interrupts = <22>;

                        reg-shift = <2>;
                };
        };

        eth: eth@10110000 {
                compatible = "mediatek,mt7628-eth";
                reg = <0x10100000 0x10000
                       0x10110000 0x8000>;

                resets = <&rstctrl MT7628_EPHY_RST>;
                reset-names = "ephy";

                syscon = <&sysc>;
        };

        usb_phy: usb-phy@10120000 {
                compatible = "mediatek,mt7628-usbphy";
                reg = <0x10120000 0x1000>;

                #phy-cells = <0>;

                ralink,sysctl = <&sysc>;

                resets = <&rstctrl MT7628_UPHY_RST>;
                reset-names = "phy";

                clocks = <&clkctrl CLK_UPHY>;
                clock-names = "cg";
        };

        ehci@101c0000 {
                compatible = "generic-ehci";
                reg = <0x101c0000 0x1000>;

                phys = <&usb_phy>;
                phy-names = "usb";

                interrupt-parent = <&intc>;
                interrupts = <18>;
        };

        mmc: mmc@10130000 {
                compatible = "mediatek,mt7620-mmc";
                reg = <0x10130000 0x4000>;
                builtin-cd = <1>;
                r_smpl = <1>;

                interrupt-parent = <&intc>;
                interrupts = <14>;

                clocks = <&clk48m>, <&clk48m>;
                clock-names = "source", "hclk";

                pinctrl-names = "default", "state_uhs";
                pinctrl-0 = <&sd_iot_mode>;
                pinctrl-1 = <&sd_iot_mode>;

                vmmc-supply = <&clk48m>;
                vqmmc-supply = <&clk48m>;

                resets = <&rstctrl MT7628_SDXC_RST>;

                status = "disabled";
        };
};

Attachment: vocore_vocore2.dts
Description: audio/vnd.dts

// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (C) 2019 Mauro Condarelli <mc5...@mclink.it>
 *
 * Note: this is largely copied from:
 *       board/seeed/linkit_smart_7688/board.c
 *       Copyright (C) 2018 Stefan Roese <s...@denx.de>
 */

#include <common.h>
#include <asm/io.h>

#define MT76XX_GPIO1_MODE   0x10000060

DECLARE_GLOBAL_DATA_PTR;

void board_debug_uart_init(void)
{
	void __iomem *gpio_mode;

	/* Select UART2 mode instead of GPIO mode (default) */
	gpio_mode = ioremap_nocache(MT76XX_GPIO1_MODE, 0x100);
	clrbits_le32(gpio_mode, GENMASK(27, 26));
}

int board_early_init_f(void)
{
	/*
	 * The pin muxing of UART2 also needs to be done, if debug uart
	 * is not enabled. So we need to call this function here as well.
	 */
	board_debug_uart_init();

	return 0;
}

Reply via email to