[U-Boot] [U-Boot, 1/8] rockchip: rk3328: add tpl board file support

Philipp Tomsich philipp.tomsich at theobroma-systems.com
Tue Nov 7 15:04:38 UTC 2017



On Thu, 26 Oct 2017, Kever Yang wrote:

> rk3328 tpl suppose to init ddr sdram and then back to bootrom.
>
> Signed-off-by: Kever Yang <kever.yang at rock-chips.com>
> Acked-by: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>
> ---
>
> arch/arm/mach-rockchip/Makefile           |   1 +
> arch/arm/mach-rockchip/rk3328-board-tpl.c | 114 ++++++++++++++++++++++++++++++
> 2 files changed, 115 insertions(+)
> create mode 100644 arch/arm/mach-rockchip/rk3328-board-tpl.c
>
> diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
> index cc3a63e..49bdd36 100644
> --- a/arch/arm/mach-rockchip/Makefile
> +++ b/arch/arm/mach-rockchip/Makefile
> @@ -14,6 +14,7 @@ obj-tpl-$(CONFIG_ROCKCHIP_BROM_HELPER) += bootrom.o save_boot_param.o
> obj-tpl-$(CONFIG_ROCKCHIP_RK3188) += rk3188-board-tpl.o
> obj-tpl-$(CONFIG_ROCKCHIP_RK3368) += rk3368-board-tpl.o
> obj-tpl-$(CONFIG_ROCKCHIP_RK322X) += rk322x-board-tpl.o
> +obj-tpl-$(CONFIG_ROCKCHIP_RK3328) += rk3328-board-tpl.o
>
> obj-spl-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o
> obj-spl-$(CONFIG_ROCKCHIP_RK3188) += rk3188-board-spl.o
> diff --git a/arch/arm/mach-rockchip/rk3328-board-tpl.c b/arch/arm/mach-rockchip/rk3328-board-tpl.c
> new file mode 100644
> index 0000000..1c74ff2
> --- /dev/null
> +++ b/arch/arm/mach-rockchip/rk3328-board-tpl.c
> @@ -0,0 +1,114 @@
> +/*
> + * (C) Copyright 2016 Rockchip Electronics Co., Ltd
> + *
> + * SPDX-License-Identifier:     GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <debug_uart.h>
> +#include <dm.h>
> +#include <fdtdec.h>
> +#include <led.h>
> +#include <malloc.h>
> +#include <mmc.h>
> +#include <ram.h>
> +#include <spl.h>
> +#include <asm/gpio.h>
> +#include <asm/io.h>
> +#include <asm/arch/bootrom.h>
> +#include <asm/arch/clock.h>
> +#include <asm/arch/hardware.h>
> +#include <asm/arch/periph.h>
> +#include <asm/arch/sdram.h>
> +#include <asm/arch/timer.h>
> +#include <dm/pinctrl.h>
> +#include <dm/root.h>
> +#include <dm/test.h>
> +#include <dm/util.h>
> +#include <power/regulator.h>
> +#include <asm/arch/grf_rk3328.h>
> +#include <asm/arch/uart.h>
> +
> +#define CRU_BASE		0xFF440000
> +#define GRF_BASE		0xFF100000
> +#define UART2_BASE		0xFF130000
> +#define STIMER_BASE_ADDR		0xFF1d0000
> +#define CPU_TIMER_BASE			(STIMER_BASE_ADDR + 0x20)
> +
> +void board_timer_init(void)
> +{
> +	/* Initialize CNTFRQ */
> +	__asm__ volatile ("LDR x0,=24000000");
> +	__asm__ volatile ("MSR CNTFRQ_EL0, x0");

This should be done by setting COUNTER_FREQUENCY and having start.s take
care of this...

> +
> +	/* Enable STimer1 for core */
> +	writel(0x0, CPU_TIMER_BASE + 0x0010);
> +	writel(0xffffffff, CPU_TIMER_BASE + 0x0000);
> +	writel(0xffffffff, CPU_TIMER_BASE + 0x0004);
> +	writel(0x1, CPU_TIMER_BASE + 0x0010);

Can we use the DM timer (same as for the RK3368) and not initialise the
secure timer here?  We should keep U-Boot and this initialisation 
separate, as ATF will take care of this (and U-Boot can just use a regular
tick timer).

> +}
> +
> +void board_debug_uart_init(void)
> +{
> +	struct rk3328_grf_regs * const grf = (void *)GRF_BASE;
> +	struct rk_uart * const uart = (void *)UART2_BASE;
> +
> +	/* uart_sel_clk default select 24MHz */
> +	writel((3 << (8 + 16)) | (2 << 8), CRU_BASE + 0x148);
> +
> +	/* init uart baud rate 1500000 */
> +	writel(0x83, &uart->lcr);
> +	writel(0x1, &uart->rbr);
> +	writel(0x3, &uart->lcr);
> +
> +	/* Enable early UART2 */
> +	rk_clrsetreg(&grf->com_iomux,
> +		     IOMUX_SEL_UART2_MASK,
> +		     IOMUX_SEL_UART2_M1 << IOMUX_SEL_UART2_SHIFT);
> +	rk_clrsetreg(&grf->gpio2a_iomux,
> +		     GPIO2A0_SEL_MASK,
> +		     GPIO2A0_UART2_TX_M1 << GPIO2A0_SEL_SHIFT);
> +	rk_clrsetreg(&grf->gpio2a_iomux,
> +		     GPIO2A1_SEL_MASK,
> +		     GPIO2A1_UART2_RX_M1 << GPIO2A1_SEL_SHIFT);
> +
> +	/* enable FIFO */
> +	writel(0x1, &uart->sfe);
> +}
> +
> +void board_return_to_bootrom(void)
> +{
> +	back_to_bootrom();
> +}
> +
> +u32 spl_boot_device(void)
> +{
> +	return BOOT_DEVICE_BOOTROM;
> +}
> +
> +
> +void board_init_f(ulong dummy)
> +{
> +	struct udevice *dev;
> +	int ret;
> +
> +#define EARLY_UART
> +#ifdef EARLY_UART
> +	debug_uart_init();
> +	printascii("U-Boot TPL board init\n");
> +#endif
> +
> +	board_timer_init();

If we use the DM timer, we don't have to do this any longer (see the 
RK3368 TPL support code).

> +
> +	ret = spl_early_init();
> +	if (ret) {
> +		printf("spl_early_init() failed: %d\n", ret);
> +		hang();
> +	}
> +
> +	ret = uclass_get_device(UCLASS_RAM, 0, &dev);
> +	if (ret) {
> +		printf("DRAM init failed: %d\n", ret);
> +		return;
> +	}
> +}
>


More information about the U-Boot mailing list