[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