[PATCH v1 16/17] rockchip: rk3066: add recovery mode in spl

Johan Jonker jbx6244 at gmail.com
Sun May 8 17:08:24 CEST 2022


Add a recovery button test as condition to enter the recovery mode
in spl. Run the rockusb gadget for MMC while connected to a USB host.
Allow external user defined functions by labeling these functions
as "__weak".

Signed-off-by: Johan Jonker <jbx6244 at gmail.com>
---
 .../arm/include/asm/arch-rockchip/f_rockusb.h |  1 +
 arch/arm/mach-rockchip/rk3066/rk3066.c        | 86 +++++++++++++++++++
 2 files changed, 87 insertions(+)

diff --git a/arch/arm/include/asm/arch-rockchip/f_rockusb.h b/arch/arm/include/asm/arch-rockchip/f_rockusb.h
index e9c7f793..ab1e2c2f 100644
--- a/arch/arm/include/asm/arch-rockchip/f_rockusb.h
+++ b/arch/arm/include/asm/arch-rockchip/f_rockusb.h
@@ -8,6 +8,7 @@
 #ifndef _F_ROCKUSB_H_
 #define _F_ROCKUSB_H_
 #include <blk.h>
+#include <linux/usb/composite.h>
 
 #define ROCKUSB_VERSION		"0.1"
 
diff --git a/arch/arm/mach-rockchip/rk3066/rk3066.c b/arch/arm/mach-rockchip/rk3066/rk3066.c
index 1d1b8687..be19400c 100644
--- a/arch/arm/mach-rockchip/rk3066/rk3066.c
+++ b/arch/arm/mach-rockchip/rk3066/rk3066.c
@@ -4,9 +4,15 @@
  */
 
 #include <common.h>
+#include <adc.h>
+#include <g_dnl.h>
+#include <spl.h>
 #include <asm/io.h>
 #include <asm/arch-rockchip/bootrom.h>
 #include <asm/arch-rockchip/grf_rk3066.h>
+#include <asm/arch-rockchip/f_rockusb.h>
+#include <dm/device.h>
+#include <dm/uclass.h>
 
 #define GRF_BASE	0x20008000
 
@@ -26,6 +32,81 @@ void board_debug_uart_init(void)
 		     GPIO1B0_UART2_SIN << GPIO1B0_SHIFT);
 }
 
+__weak void do_spl(void)
+{
+	if (CONFIG_IS_ENABLED(OF_PLATDATA))
+		return;
+
+#if IS_ENABLED(CONFIG_SPL_USB_FUNCTION_ROCKUSB)
+	char *dev_type;
+	int dev_index;
+	int ret;
+
+	switch (spl_boot_device()) {
+	case BOOT_DEVICE_MMC1:
+		dev_type = "mmc";
+		dev_index = 0;
+		break;
+	default:
+		return;
+	}
+
+	rockusb_dev_init(dev_type, dev_index);
+
+	ret = usb_gadget_initialize(0);
+	if (ret) {
+		printf("USB init failed: %d\n", ret);
+		return;
+	}
+
+	g_dnl_clear_detach();
+	ret = g_dnl_register("usb_dnl_rockusb");
+	if (ret)
+		return;
+
+	if (!g_dnl_board_usb_cable_connected()) {
+		printf("\rUSB cable not detected\n");
+		goto exit;
+	}
+
+	while (1) {
+		if (g_dnl_detach())
+			break;
+		if (ctrlc())
+			break;
+		usb_gadget_handle_interrupts(0);
+	}
+
+exit:
+	g_dnl_unregister();
+	g_dnl_clear_detach();
+	usb_gadget_release(0);
+#endif
+	return;
+}
+
+#define KEY_DOWN_MIN_VAL	0
+#define KEY_DOWN_MAX_VAL	30
+
+__weak int rockchip_dnl_key_pressed(void)
+{
+#if IS_ENABLED(CONFIG_SPL_SARADC_ROCKCHIP)
+	unsigned int val;
+	int ret;
+
+	ret = adc_channel_single_shot("saradc at 2006c000", 1, &val);
+
+	if (ret) {
+		printf("Read adc key val failed\n");
+		return false;
+	}
+
+	if (val >= KEY_DOWN_MIN_VAL && val <= KEY_DOWN_MAX_VAL)
+		return true;
+#endif
+	return false;
+}
+
 void spl_board_init(void)
 {
 	__maybe_unused struct rk3066_grf * const grf = (void *)GRF_BASE;
@@ -49,4 +130,9 @@ void spl_board_init(void)
 			     GPIO3B5_SDMMC0_DATA3  << GPIO3B5_SHIFT |
 			     GPIO3B6_SDMMC0_DECTN  << GPIO3B6_SHIFT);
 	}
+
+	if (rockchip_dnl_key_pressed()) {
+		printf("Recovery button was pressed!\n");
+		do_spl();
+	}
 }
-- 
2.20.1



More information about the U-Boot mailing list