[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