testing/u-boot-starqltechn: update u-boot version and new patches (MR 3679)
Add new patches: - enable serial console - save relocation address to find KASLR - buttons as keyboard input driver to navigate bootmenu - bootmenu loop entry selection
This commit is contained in:
parent
7c7c18e40f
commit
fc08a804bc
9 changed files with 464 additions and 602 deletions
|
@ -1,337 +0,0 @@
|
||||||
From 52ece15559cdb67ed3da2d6e1ce06bad0dc722f8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Dzmitry Sankouski <dsankouski@gmail.com>
|
|
||||||
Date: Tue, 25 Jan 2022 22:15:50 +0300
|
|
||||||
Subject: [PATCH 1/3 v3] arm: init: save previous bootloader data
|
|
||||||
|
|
||||||
When u-boot is used as a chain-loaded bootloader (replacing OS kernel),
|
|
||||||
previous bootloader leaves data in RAM, that can be reused.
|
|
||||||
|
|
||||||
For example, on recent arm linux system, when chainloading u-boot,
|
|
||||||
there are initramfs and fdt in RAM prepared for OS booting. Initramfs
|
|
||||||
may be modified to store u-boot's payload, thus providing the ability to
|
|
||||||
use chainloaded u-boot to boot OS without any storage support.
|
|
||||||
|
|
||||||
Two config options added:
|
|
||||||
- SAVE_PREV_BL_INITRAMFS_START_ADDR
|
|
||||||
saves initramfs start address to 'prevbl_initrd_start_addr' environment
|
|
||||||
variable
|
|
||||||
- SAVE_PREV_BL_FDT_ADDR
|
|
||||||
saves fdt address to 'prevbl_fdt_addr' environment variable
|
|
||||||
|
|
||||||
Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com>
|
|
||||||
Cc: Tom Rini <trini@konsulko.com>
|
|
||||||
---
|
|
||||||
Changes for v2:
|
|
||||||
- change signed off line
|
|
||||||
Changes for v3:
|
|
||||||
- use if (CONFIG_IS_ENABLED... instead of #if defined
|
|
||||||
- fix save_prev_bl_data.o in Makefile
|
|
||||||
- add save_prev_bl_data call to env initialization
|
|
||||||
|
|
||||||
arch/arm/lib/Makefile | 5 ++
|
|
||||||
arch/arm/lib/save_prev_bl_data.c | 91 ++++++++++++++++++++++++++++++++
|
|
||||||
boot/Kconfig | 79 +++++++++++++++++----------
|
|
||||||
common/board_r.c | 5 ++
|
|
||||||
include/init.h | 13 +++++
|
|
||||||
5 files changed, 166 insertions(+), 27 deletions(-)
|
|
||||||
create mode 100644 arch/arm/lib/save_prev_bl_data.c
|
|
||||||
|
|
||||||
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
|
|
||||||
index c48e1f622d..f3c31c05e5 100644
|
|
||||||
--- a/arch/arm/lib/Makefile
|
|
||||||
+++ b/arch/arm/lib/Makefile
|
|
||||||
@@ -48,6 +48,11 @@ obj-$(CONFIG_$(SPL_TPL_)USE_ARCH_MEMCPY) += memcpy.o
|
|
||||||
endif
|
|
||||||
obj-$(CONFIG_SEMIHOSTING) += semihosting.o
|
|
||||||
|
|
||||||
+ifneq ($(filter y,$(CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR) $(CONFIG_SAVE_PREV_BL_FDT_ADDR)),)
|
|
||||||
+obj-y += save_prev_bl_data.o
|
|
||||||
+endif
|
|
||||||
+
|
|
||||||
+# obj-$(CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR) += save_prev_bl_data.o
|
|
||||||
obj-y += bdinfo.o
|
|
||||||
obj-y += sections.o
|
|
||||||
CFLAGS_REMOVE_sections.o := $(LTO_CFLAGS)
|
|
||||||
diff --git a/arch/arm/lib/save_prev_bl_data.c b/arch/arm/lib/save_prev_bl_data.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..f4ee86a89c
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/arch/arm/lib/save_prev_bl_data.c
|
|
||||||
@@ -0,0 +1,91 @@
|
|
||||||
+// SPDX-License-Identifier: GPL-2.0+
|
|
||||||
+/*
|
|
||||||
+ * save_prev_bl_data - saving previous bootloader data
|
|
||||||
+ * to environment variables.
|
|
||||||
+ *
|
|
||||||
+ * Copyright (c) 2022 Dzmitry Sankouski (dsankouski@gmail.com)
|
|
||||||
+ */
|
|
||||||
+#include <init.h>
|
|
||||||
+#include <env.h>
|
|
||||||
+#include <fdtdec.h>
|
|
||||||
+#include <fdt_support.h>
|
|
||||||
+#include <fdt.h>
|
|
||||||
+#include <common.h>
|
|
||||||
+#include <linux/errno.h>
|
|
||||||
+#include <asm/system.h>
|
|
||||||
+#include <asm/armv8/mmu.h>
|
|
||||||
+
|
|
||||||
+static ulong reg0 __section(".data");
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Save x0 register value, assuming previous bootloader set it to
|
|
||||||
+ * point on loaded fdt or (for older linux kernels)atags.
|
|
||||||
+ */
|
|
||||||
+void save_boot_params(ulong r0)
|
|
||||||
+{
|
|
||||||
+ reg0 = r0;
|
|
||||||
+ save_boot_params_ret();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+bool is_addr_accessible(phys_addr_t addr)
|
|
||||||
+{
|
|
||||||
+ struct mm_region *mem = mem_map;
|
|
||||||
+ phys_addr_t bank_start;
|
|
||||||
+ phys_addr_t bank_end;
|
|
||||||
+
|
|
||||||
+ while (mem->size) {
|
|
||||||
+ bank_start = mem->phys;
|
|
||||||
+ bank_end = bank_start + mem->size;
|
|
||||||
+ debug("check if block %pap - %pap includes %pap\n", &bank_start, &bank_end, &addr);
|
|
||||||
+ if (addr > bank_start && addr < bank_end)
|
|
||||||
+ return true;
|
|
||||||
+ mem++;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return false;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int save_prev_bl_data(void)
|
|
||||||
+{
|
|
||||||
+ struct fdt_header *fdt_blob;
|
|
||||||
+ int node;
|
|
||||||
+ u64 initrd_start_prop;
|
|
||||||
+
|
|
||||||
+ if (!is_addr_accessible((phys_addr_t)reg0))
|
|
||||||
+ return -ENODATA;
|
|
||||||
+
|
|
||||||
+ fdt_blob = (struct fdt_header *)reg0;
|
|
||||||
+ if (!fdt_valid(&fdt_blob)) {
|
|
||||||
+ pr_warn("%s: address 0x%lx is not a valid fdt\n", __func__, reg0);
|
|
||||||
+ return -ENODATA;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (CONFIG_IS_ENABLED(SAVE_PREV_BL_FDT_ADDR))
|
|
||||||
+ env_set_addr("prevbl_fdt_addr", (void *)reg0);
|
|
||||||
+ if (!CONFIG_IS_ENABLED(SAVE_PREV_BL_INITRAMFS_START_ADDR))
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ node = fdt_path_offset(fdt_blob, "/chosen");
|
|
||||||
+ if (!node) {
|
|
||||||
+ pr_warn("%s: chosen node not found in device tree at addr: 0x%lx\n",
|
|
||||||
+ __func__, reg0);
|
|
||||||
+ return -ENODATA;
|
|
||||||
+ }
|
|
||||||
+ /*
|
|
||||||
+ * linux,initrd-start property might be either 64 or 32 bit,
|
|
||||||
+ * depending on primary bootloader implementation.
|
|
||||||
+ */
|
|
||||||
+ initrd_start_prop = fdtdec_get_uint64(fdt_blob, node, "linux,initrd-start", 0);
|
|
||||||
+ if (!initrd_start_prop) {
|
|
||||||
+ debug("%s: attempt to get uint64 linux,initrd-start property failed, trying uint\n",
|
|
||||||
+ __func__);
|
|
||||||
+ initrd_start_prop = fdtdec_get_uint(fdt_blob, node, "linux,initrd-start", 0);
|
|
||||||
+ if (!initrd_start_prop) {
|
|
||||||
+ debug("%s: attempt to get uint failed, too\n", __func__);
|
|
||||||
+ return -ENODATA;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ env_set_addr("prevbl_initrd_start_addr", (void *)initrd_start_prop);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
diff --git a/boot/Kconfig b/boot/Kconfig
|
|
||||||
index c8d5906cd3..da2f0797e0 100644
|
|
||||||
--- a/boot/Kconfig
|
|
||||||
+++ b/boot/Kconfig
|
|
||||||
@@ -135,10 +135,10 @@ config FIT_IMAGE_POST_PROCESS
|
|
||||||
processed before being added to the FIT image).
|
|
||||||
|
|
||||||
config FIT_PRINT
|
|
||||||
- bool "Support FIT printing"
|
|
||||||
- default y
|
|
||||||
- help
|
|
||||||
- Support printing the content of the fitImage in a verbose manner.
|
|
||||||
+ bool "Support FIT printing"
|
|
||||||
+ default y
|
|
||||||
+ help
|
|
||||||
+ Support printing the content of the fitImage in a verbose manner.
|
|
||||||
|
|
||||||
if SPL
|
|
||||||
|
|
||||||
@@ -207,12 +207,12 @@ config SPL_LOAD_FIT
|
|
||||||
This path has the following limitations:
|
|
||||||
|
|
||||||
1. "loadables" images, other than FDTs, which do not have a "load"
|
|
||||||
- property will not be loaded. This limitation also applies to FPGA
|
|
||||||
- images with the correct "compatible" string.
|
|
||||||
+ property will not be loaded. This limitation also applies to FPGA
|
|
||||||
+ images with the correct "compatible" string.
|
|
||||||
2. For FPGA images, only the "compatible" = "u-boot,fpga-legacy"
|
|
||||||
- loading method is supported.
|
|
||||||
+ loading method is supported.
|
|
||||||
3. FDTs are only loaded for images with an "os" property of "u-boot".
|
|
||||||
- "linux" images are also supported with Falcon boot mode.
|
|
||||||
+ "linux" images are also supported with Falcon boot mode.
|
|
||||||
|
|
||||||
config SPL_LOAD_FIT_ADDRESS
|
|
||||||
hex "load address of fit image"
|
|
||||||
@@ -345,8 +345,8 @@ config SYS_EXTRA_OPTIONS
|
|
||||||
The old configuration infrastructure (= mkconfig + boards.cfg)
|
|
||||||
provided the extra options field. If you have something like
|
|
||||||
"HAS_BAR,BAZ=64", the optional options
|
|
||||||
- #define CONFIG_HAS
|
|
||||||
- #define CONFIG_BAZ 64
|
|
||||||
+ #define CONFIG_HAS
|
|
||||||
+ #define CONFIG_BAZ 64
|
|
||||||
will be defined in include/config.h.
|
|
||||||
This option was prepared for the smooth migration from the old
|
|
||||||
configuration to Kconfig. Since this option will be removed sometime,
|
|
||||||
@@ -380,7 +380,7 @@ config SYS_CLK_FREQ
|
|
||||||
int "CPU clock frequency"
|
|
||||||
default 125000000 if ARCH_LS1012A
|
|
||||||
default 100000000 if ARCH_P2020 || ARCH_T1024 || ARCH_T1042 || \
|
|
||||||
- ARCH_LS1021A || FSL_LSCH2 || FSL_LSCH3
|
|
||||||
+ ARCH_LS1021A || FSL_LSCH2 || FSL_LSCH3
|
|
||||||
default 66666666 if ARCH_P1010 || ARCH_P1020 || ARCH_T4240
|
|
||||||
default 66660000 if ARCH_T2080
|
|
||||||
default 33333333 if RCAR_GEN3
|
|
||||||
@@ -485,15 +485,15 @@ config BOOTSTAGE_REPORT
|
|
||||||
boot process. The report looks something like this:
|
|
||||||
|
|
||||||
Timer summary in microseconds:
|
|
||||||
- Mark Elapsed Stage
|
|
||||||
- 0 0 reset
|
|
||||||
+ Mark Elapsed Stage
|
|
||||||
+ 0 0 reset
|
|
||||||
3,575,678 3,575,678 board_init_f start
|
|
||||||
- 3,575,695 17 arch_cpu_init A9
|
|
||||||
- 3,575,777 82 arch_cpu_init done
|
|
||||||
- 3,659,598 83,821 board_init_r start
|
|
||||||
- 3,910,375 250,777 main_loop
|
|
||||||
+ 3,575,695 17 arch_cpu_init A9
|
|
||||||
+ 3,575,777 82 arch_cpu_init done
|
|
||||||
+ 3,659,598 83,821 board_init_r start
|
|
||||||
+ 3,910,375 250,777 main_loop
|
|
||||||
29,916,167 26,005,792 bootm_start
|
|
||||||
- 30,361,327 445,160 start_kernel
|
|
||||||
+ 30,361,327 445,160 start_kernel
|
|
||||||
|
|
||||||
config BOOTSTAGE_RECORD_COUNT
|
|
||||||
int "Number of boot stage records to store"
|
|
||||||
@@ -580,24 +580,24 @@ config SHOW_BOOT_PROGRESS
|
|
||||||
Legacy uImage format:
|
|
||||||
|
|
||||||
Arg Where When
|
|
||||||
- 1 common/cmd_bootm.c before attempting to boot an image
|
|
||||||
+ 1 common/cmd_bootm.c before attempting to boot an image
|
|
||||||
-1 common/cmd_bootm.c Image header has bad magic number
|
|
||||||
- 2 common/cmd_bootm.c Image header has correct magic number
|
|
||||||
+ 2 common/cmd_bootm.c Image header has correct magic number
|
|
||||||
-2 common/cmd_bootm.c Image header has bad checksum
|
|
||||||
- 3 common/cmd_bootm.c Image header has correct checksum
|
|
||||||
+ 3 common/cmd_bootm.c Image header has correct checksum
|
|
||||||
-3 common/cmd_bootm.c Image data has bad checksum
|
|
||||||
- 4 common/cmd_bootm.c Image data has correct checksum
|
|
||||||
+ 4 common/cmd_bootm.c Image data has correct checksum
|
|
||||||
-4 common/cmd_bootm.c Image is for unsupported architecture
|
|
||||||
- 5 common/cmd_bootm.c Architecture check OK
|
|
||||||
+ 5 common/cmd_bootm.c Architecture check OK
|
|
||||||
-5 common/cmd_bootm.c Wrong Image Type (not kernel, multi)
|
|
||||||
- 6 common/cmd_bootm.c Image Type check OK
|
|
||||||
+ 6 common/cmd_bootm.c Image Type check OK
|
|
||||||
-6 common/cmd_bootm.c gunzip uncompression error
|
|
||||||
-7 common/cmd_bootm.c Unimplemented compression type
|
|
||||||
- 7 common/cmd_bootm.c Uncompression OK
|
|
||||||
- 8 common/cmd_bootm.c No uncompress/copy overwrite error
|
|
||||||
+ 7 common/cmd_bootm.c Uncompression OK
|
|
||||||
+ 8 common/cmd_bootm.c No uncompress/copy overwrite error
|
|
||||||
-9 common/cmd_bootm.c Unsupported OS (not Linux, BSD, VxWorks, QNX)
|
|
||||||
|
|
||||||
- 9 common/image.c Start initial ramdisk verification
|
|
||||||
+ 9 common/image.c Start initial ramdisk verification
|
|
||||||
-10 common/image.c Ramdisk header has bad magic number
|
|
||||||
-11 common/image.c Ramdisk header has bad checksum
|
|
||||||
10 common/image.c Ramdisk header is OK
|
|
||||||
@@ -1067,4 +1067,29 @@ config DEFAULT_FDT_FILE
|
|
||||||
help
|
|
||||||
This option is used to set the default fdt file to boot OS.
|
|
||||||
|
|
||||||
+config SAVE_PREV_BL_FDT_ADDR
|
|
||||||
+ depends on ARM
|
|
||||||
+ bool "Saves fdt address, passed by the previous bootloader, to env var"
|
|
||||||
+ default n
|
|
||||||
+ help
|
|
||||||
+ When u-boot is used as a chain-loaded bootloader (replacing OS kernel),
|
|
||||||
+ enable this option to save fdt address, passed by the
|
|
||||||
+ previous bootloader for future use.
|
|
||||||
+ Address is saved to `prevbl_fdt_addr` environment variable.
|
|
||||||
+
|
|
||||||
+ If no fdt was provided by previous bootloader, no env variables
|
|
||||||
+ will be created.
|
|
||||||
+
|
|
||||||
+config SAVE_PREV_BL_INITRAMFS_START_ADDR
|
|
||||||
+ depends on ARM
|
|
||||||
+ bool "Saves initramfs address, passed by the previous bootloader, to env var"
|
|
||||||
+ default n
|
|
||||||
+ help
|
|
||||||
+ When u-boot is used as a chain-loaded bootloader(replacing OS kernel),
|
|
||||||
+ enable this option to save initramfs address, passed by the
|
|
||||||
+ previous bootloader for future use.
|
|
||||||
+ Address is saved to `prevbl_initrd_start_addr` environment variable.
|
|
||||||
+
|
|
||||||
+ If no initramfs was provided by previous bootloader, no env variables
|
|
||||||
+ will be created.
|
|
||||||
endmenu # Booting
|
|
||||||
diff --git a/common/board_r.c b/common/board_r.c
|
|
||||||
index c24d9b4e22..5b717e2162 100644
|
|
||||||
--- a/common/board_r.c
|
|
||||||
+++ b/common/board_r.c
|
|
||||||
@@ -445,6 +445,11 @@ static int initr_env(void)
|
|
||||||
env_set_hex("fdtcontroladdr",
|
|
||||||
(unsigned long)map_to_sysmem(gd->fdt_blob));
|
|
||||||
|
|
||||||
+ #if (CONFIG_IS_ENABLED(SAVE_PREV_BL_INITRAMFS_START_ADDR) || \
|
|
||||||
+ CONFIG_IS_ENABLED(SAVE_PREV_BL_FDT_ADDR))
|
|
||||||
+ save_prev_bl_data();
|
|
||||||
+ #endif
|
|
||||||
+
|
|
||||||
/* Initialize from environment */
|
|
||||||
image_load_addr = env_get_ulong("loadaddr", 16, image_load_addr);
|
|
||||||
|
|
||||||
diff --git a/include/init.h b/include/init.h
|
|
||||||
index 20c3976af0..1a55a0e2e4 100644
|
|
||||||
--- a/include/init.h
|
|
||||||
+++ b/include/init.h
|
|
||||||
@@ -166,6 +166,19 @@ int arch_setup_bdinfo(void);
|
|
||||||
*/
|
|
||||||
int setup_bdinfo(void);
|
|
||||||
|
|
||||||
+#if defined(CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR) || \
|
|
||||||
+defined(CONFIG_SAVE_PREV_BL_FDT_ADDR)
|
|
||||||
+/**
|
|
||||||
+ * save_prev_bl_data - Save prev bl data in env vars.
|
|
||||||
+ *
|
|
||||||
+ * When u-boot is chain-loaded, save previous bootloader data,
|
|
||||||
+ * like initramfs address to environment variables.
|
|
||||||
+ *
|
|
||||||
+ * Return: 0 if ok; -ENODATA on error
|
|
||||||
+ */
|
|
||||||
+int save_prev_bl_data(void);
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* cpu_secondary_init_r() - CPU-specific secondary initialization
|
|
||||||
*
|
|
||||||
--
|
|
||||||
2.20.1
|
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
From f6c35ea176e29eda0e34c13a38d877af4124c25a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dzmitry Sankouski <dsankouski@gmail.com>
|
||||||
|
Date: Tue, 29 Nov 2022 17:25:37 +0300
|
||||||
|
Subject: [PATCH 1/6] starqltechn: enable serial console
|
||||||
|
|
||||||
|
Problem affected device boot, was fixed in
|
||||||
|
f5ed6c9ccf3ec32a4bcc20835ee8fc378c342df9
|
||||||
|
---
|
||||||
|
configs/starqltechn_defconfig | 10 ++++++----
|
||||||
|
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/configs/starqltechn_defconfig b/configs/starqltechn_defconfig
|
||||||
|
index 7955076d61..995a623305 100644
|
||||||
|
--- a/configs/starqltechn_defconfig
|
||||||
|
+++ b/configs/starqltechn_defconfig
|
||||||
|
@@ -9,7 +9,8 @@ CONFIG_IDENT_STRING="\nSamsung S9 SM-G9600"
|
||||||
|
CONFIG_SYS_LOAD_ADDR=0x80000000
|
||||||
|
CONFIG_FIT=y
|
||||||
|
CONFIG_FIT_VERBOSE=y
|
||||||
|
-CONFIG_BOOTDELAY=0
|
||||||
|
+CONFIG_BOOTDELAY=5
|
||||||
|
+CONFIG_USE_PREBOOT=y
|
||||||
|
CONFIG_SAVE_PREV_BL_FDT_ADDR=y
|
||||||
|
CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR=y
|
||||||
|
# CONFIG_DISPLAY_CPUINFO is not set
|
||||||
|
@@ -20,17 +21,18 @@ CONFIG_SYS_PBSIZE=532
|
||||||
|
CONFIG_CMD_GPIO=y
|
||||||
|
CONFIG_CMD_BMP=y
|
||||||
|
# CONFIG_NET is not set
|
||||||
|
-# CONFIG_DM_STDIO is not set
|
||||||
|
CONFIG_CLK=y
|
||||||
|
CONFIG_MSM_GPIO=y
|
||||||
|
CONFIG_QCOM_PMIC_GPIO=y
|
||||||
|
CONFIG_PINCTRL=y
|
||||||
|
CONFIG_DM_PMIC=y
|
||||||
|
CONFIG_PMIC_QCOM=y
|
||||||
|
-# CONFIG_REQUIRE_SERIAL_CONSOLE is not set
|
||||||
|
+CONFIG_REQUIRE_SERIAL_CONSOLE=y
|
||||||
|
+CONFIG_MSM_GENI_SERIAL=y
|
||||||
|
CONFIG_SPMI_MSM=y
|
||||||
|
CONFIG_VIDEO=y
|
||||||
|
CONFIG_SYS_WHITE_ON_BLACK=y
|
||||||
|
CONFIG_VIDEO_SIMPLE=y
|
||||||
|
-CONFIG_VIDEO_DT_SIMPLEFB=y
|
||||||
|
+CONFIG_VIDEO_DT_SIMPLEFB=n
|
||||||
|
CONFIG_LMB_MAX_REGIONS=64
|
||||||
|
+CONFIG_BAUDRATE=921600
|
||||||
|
--
|
||||||
|
2.30.2
|
||||||
|
|
|
@ -1,257 +0,0 @@
|
||||||
From 9dc363f0968cd74223cace7806fb88a938d897b2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Dzmitry Sankouski <dsankouski@gmail.com>
|
|
||||||
Date: Wed, 26 Jan 2022 14:34:33 +0300
|
|
||||||
Subject: [PATCH 2/3 v4] board: starqltechn: get board usable - add bootcmd and
|
|
||||||
docs
|
|
||||||
|
|
||||||
U-boot is intended to replace linux kernel in android boot image(ABL), and
|
|
||||||
it's FIT payload to replace initramfs file. The boot process is similar to
|
|
||||||
boot image with linux:
|
|
||||||
- android bootloader (ABL) unpacks android boot image
|
|
||||||
- ABL sets `linux,initrd-start property` in chosen node in unpacked FDT
|
|
||||||
- ABL sets x0 register to FDT address, and passes control to u-boot
|
|
||||||
- u-boot reads x0 register, and stores it in `prevbl_fdt_addr` env variable
|
|
||||||
- u-boot reads `linux,initrd-start` property,
|
|
||||||
and stores it in `prevbl_initrd_start_addr`
|
|
||||||
|
|
||||||
In this way, u-boot bootcmd relies on `prevbl_initrd_start_addr` env
|
|
||||||
variable, and boils down to `bootm $prevbl_initrd_start_addr`.
|
|
||||||
If more control on boot process is desired, pack a boot script in
|
|
||||||
FIT image, and put it to default configuration
|
|
||||||
|
|
||||||
What done:
|
|
||||||
- strip unneeded config options
|
|
||||||
- add FIT image support
|
|
||||||
- add framebuffer node, u-boot logo and video console
|
|
||||||
- increase LMB_MAX_REGIONS, to store all linux dtb reserved memory regions
|
|
||||||
- add linux kernel image header
|
|
||||||
|
|
||||||
Uart driver causes hang, when u-boot is used in android boot image instead
|
|
||||||
of linux. Temporary disable console driver, until investigated and fixed.
|
|
||||||
|
|
||||||
Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com>
|
|
||||||
Cc: Ramon Fried <rfried.dev@gmail.com>
|
|
||||||
---
|
|
||||||
Changes for v2:
|
|
||||||
- change signed off line
|
|
||||||
- add CONFIG_SAVE_PREV_BL_FDT_ADDR. It's needed to boot
|
|
||||||
android stock kernel
|
|
||||||
- change bootcmd to source bootscript from FIT image
|
|
||||||
for more flexibility
|
|
||||||
Changes for v3:
|
|
||||||
- enable simple framebuffer
|
|
||||||
- enable video console
|
|
||||||
- add preboot variable
|
|
||||||
- remove 0x prefix in name in device tree
|
|
||||||
Changes for v4:
|
|
||||||
- fix uart driver pinmux
|
|
||||||
- remove serial from stdout and stderr env
|
|
||||||
- disable serial driver, because it's crashes autoboot
|
|
||||||
|
|
||||||
arch/arm/dts/sdm845.dtsi | 6 ++--
|
|
||||||
arch/arm/dts/starqltechn-uboot.dtsi | 9 ++++--
|
|
||||||
arch/arm/dts/starqltechn.dts | 13 ++++++--
|
|
||||||
configs/starqltechn_defconfig | 21 ++++++++++---
|
|
||||||
doc/board/qualcomm/sdm845.rst | 47 ++++++++++++++++++++++++++++-
|
|
||||||
include/configs/sdm845.h | 8 +++++
|
|
||||||
6 files changed, 90 insertions(+), 14 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/arch/arm/dts/sdm845.dtsi b/arch/arm/dts/sdm845.dtsi
|
|
||||||
index 1185b71216..6f2fb20d68 100644
|
|
||||||
--- a/arch/arm/dts/sdm845.dtsi
|
|
||||||
+++ b/arch/arm/dts/sdm845.dtsi
|
|
||||||
@@ -48,10 +48,8 @@
|
|
||||||
|
|
||||||
/* DEBUG UART */
|
|
||||||
qup_uart9: qup-uart9-default {
|
|
||||||
- pinmux {
|
|
||||||
- pins = "GPIO_4", "GPIO_5";
|
|
||||||
- function = "qup9";
|
|
||||||
- };
|
|
||||||
+ pins = "GPIO_4", "GPIO_5";
|
|
||||||
+ function = "gpio";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
diff --git a/arch/arm/dts/starqltechn-uboot.dtsi b/arch/arm/dts/starqltechn-uboot.dtsi
|
|
||||||
index d8d75e018a..b55cccfe14 100644
|
|
||||||
--- a/arch/arm/dts/starqltechn-uboot.dtsi
|
|
||||||
+++ b/arch/arm/dts/starqltechn-uboot.dtsi
|
|
||||||
@@ -8,15 +8,18 @@
|
|
||||||
|
|
||||||
/
|
|
||||||
{
|
|
||||||
+ framebuffer@9D400000 {
|
|
||||||
+ u-boot,dm-pre-reloc;
|
|
||||||
+ };
|
|
||||||
soc {
|
|
||||||
u-boot,dm-pre-reloc;
|
|
||||||
+ serial@a84000 {
|
|
||||||
+ u-boot,dm-pre-reloc;
|
|
||||||
+ };
|
|
||||||
gcc {
|
|
||||||
clock-controller@100000 {
|
|
||||||
u-boot,dm-pre-reloc;
|
|
||||||
};
|
|
||||||
- serial@0xa84000 {
|
|
||||||
- u-boot,dm-pre-reloc;
|
|
||||||
- };
|
|
||||||
gpio_north@3900000 {
|
|
||||||
u-boot,dm-pre-reloc;
|
|
||||||
};
|
|
||||||
diff --git a/arch/arm/dts/starqltechn.dts b/arch/arm/dts/starqltechn.dts
|
|
||||||
index 387420f30b..0261388319 100644
|
|
||||||
--- a/arch/arm/dts/starqltechn.dts
|
|
||||||
+++ b/arch/arm/dts/starqltechn.dts
|
|
||||||
@@ -34,9 +34,18 @@
|
|
||||||
method = "smc";
|
|
||||||
};
|
|
||||||
|
|
||||||
+ framebuffer: framebuffer@9D400000 {
|
|
||||||
+ compatible = "simple-framebuffer";
|
|
||||||
+ reg = <0 0x9D400000 0 (2960 * 1440 * 4)>;//2400000
|
|
||||||
+ width = <1440>;
|
|
||||||
+ height = <2960>;
|
|
||||||
+ stride = <(1440 * 4)>;
|
|
||||||
+ format = "a8r8g8b8";
|
|
||||||
+ };
|
|
||||||
+
|
|
||||||
soc: soc {
|
|
||||||
- serial@0xa84000 {
|
|
||||||
- status = "ok";
|
|
||||||
+ serial@a84000 {
|
|
||||||
+ status = "okay";
|
|
||||||
};
|
|
||||||
|
|
||||||
pinctrl@3900000 {
|
|
||||||
diff --git a/configs/starqltechn_defconfig b/configs/starqltechn_defconfig
|
|
||||||
index f57bb859cc..75e8409c4d 100644
|
|
||||||
--- a/configs/starqltechn_defconfig
|
|
||||||
+++ b/configs/starqltechn_defconfig
|
|
||||||
@@ -2,16 +2,18 @@ CONFIG_ARM=y
|
|
||||||
CONFIG_SKIP_LOWLEVEL_INIT=y
|
|
||||||
CONFIG_POSITION_INDEPENDENT=y
|
|
||||||
CONFIG_ARCH_SNAPDRAGON=y
|
|
||||||
-CONFIG_SYS_TEXT_BASE=0x80000000
|
|
||||||
-CONFIG_SYS_MALLOC_LEN=0x81f000
|
|
||||||
CONFIG_DEFAULT_DEVICE_TREE="starqltechn"
|
|
||||||
+CONFIG_BOOTDELAY=0
|
|
||||||
+CONFIG_FIT=y
|
|
||||||
+CONFIG_FIT_VERBOSE=y
|
|
||||||
CONFIG_TARGET_STARQLTECHN=y
|
|
||||||
CONFIG_IDENT_STRING="\nSamsung S9 SM-G9600"
|
|
||||||
CONFIG_SYS_LOAD_ADDR=0x80000000
|
|
||||||
-CONFIG_USE_PREBOOT=y
|
|
||||||
+CONFIG_LMB_MAX_REGIONS=64
|
|
||||||
# CONFIG_DISPLAY_CPUINFO is not set
|
|
||||||
CONFIG_HUSH_PARSER=y
|
|
||||||
CONFIG_CMD_GPIO=y
|
|
||||||
+# CONFIG_REQUIRE_SERIAL_CONSOLE is not set
|
|
||||||
# CONFIG_NET is not set
|
|
||||||
# CONFIG_DM_STDIO is not set
|
|
||||||
CONFIG_CLK=y
|
|
||||||
@@ -20,5 +22,16 @@ CONFIG_PM8916_GPIO=y
|
|
||||||
CONFIG_PINCTRL=y
|
|
||||||
CONFIG_DM_PMIC=y
|
|
||||||
CONFIG_PMIC_PM8916=y
|
|
||||||
-CONFIG_MSM_GENI_SERIAL=y
|
|
||||||
+# CONFIG_MSM_GENI_SERIAL is not set
|
|
||||||
CONFIG_SPMI_MSM=y
|
|
||||||
+CONFIG_LINUX_KERNEL_IMAGE_HEADER=y
|
|
||||||
+CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR=y
|
|
||||||
+CONFIG_SAVE_PREV_BL_FDT_ADDR=y
|
|
||||||
+CONFIG_DM_VIDEO=y
|
|
||||||
+CONFIG_VIDEO_LOGO=y
|
|
||||||
+CONFIG_CMD_VIDCONSOLE=y
|
|
||||||
+CONFIG_CONSOLE_NORMAL=y
|
|
||||||
+CONFIG_SYS_WHITE_ON_BLACK=y
|
|
||||||
+CONFIG_VIDEO_DT_SIMPLEFB=y
|
|
||||||
+CONFIG_VIDEO_SIMPLE=y
|
|
||||||
+CONFIG_CMD_BMP=y
|
|
||||||
diff --git a/doc/board/qualcomm/sdm845.rst b/doc/board/qualcomm/sdm845.rst
|
|
||||||
index cd46cbe9cf..b00a30a313 100644
|
|
||||||
--- a/doc/board/qualcomm/sdm845.rst
|
|
||||||
+++ b/doc/board/qualcomm/sdm845.rst
|
|
||||||
@@ -17,7 +17,9 @@ It is loaded as an Android boot image through ABL
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
-First, setup ``CROSS_COMPILE`` for aarch64. Then, build U-Boot for your board::
|
|
||||||
+Build
|
|
||||||
+^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
+Setup ``CROSS_COMPILE`` for aarch64 and build U-Boot for your board::
|
|
||||||
|
|
||||||
$ export CROSS_COMPILE=<aarch64 toolchain prefix>
|
|
||||||
$ make <your board name here, see Boards section>_defconfig
|
|
||||||
@@ -25,6 +27,49 @@ First, setup ``CROSS_COMPILE`` for aarch64. Then, build U-Boot for your board::
|
|
||||||
|
|
||||||
This will build ``u-boot.bin`` in the configured output directory.
|
|
||||||
|
|
||||||
+Generate FIT image
|
|
||||||
+^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
+See doc/uImage.FIT for more details
|
|
||||||
+
|
|
||||||
+Pack android boot image
|
|
||||||
+^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
+We'll assemble android boot image with ``u-boot.bin`` instead of linux kernel,
|
|
||||||
+and FIT image instead of ``initramfs``. Android bootloader expect gzipped kernel
|
|
||||||
+with appended dtb, so let's mimic linux to satisfy stock bootloader:
|
|
||||||
+
|
|
||||||
+- create dump dtb::
|
|
||||||
+
|
|
||||||
+ workdir=/tmp/prepare_payload
|
|
||||||
+ mkdir -p "$workdir"
|
|
||||||
+ cd "$workdir"
|
|
||||||
+ mock_dtb="$workdir"/payload_mock.dtb
|
|
||||||
+
|
|
||||||
+ dtc -I dts -O dtb -o "$mock_dtb" << EOF
|
|
||||||
+ /dts-v1/;
|
|
||||||
+ / {
|
|
||||||
+ memory {
|
|
||||||
+ /* We expect the bootloader to fill in the size */
|
|
||||||
+ reg = <0 0 0 0>;
|
|
||||||
+ };
|
|
||||||
+
|
|
||||||
+ chosen { };
|
|
||||||
+ };
|
|
||||||
+ EOF
|
|
||||||
+
|
|
||||||
+- gzip u-boot ``gzip u-boot.bin``
|
|
||||||
+- append dtb to gzipped u-boot: ``cat u-boot.bin.gz "$mock_dtb" > u-boot.bin.gz-dtb``
|
|
||||||
+
|
|
||||||
+Now we've got everything to build android boot image:::
|
|
||||||
+
|
|
||||||
+ mkbootimg --base 0x0 --kernel_offset 0x00008000 \
|
|
||||||
+ --ramdisk_offset 0x02000000 --tags_offset 0x01e00000 \
|
|
||||||
+ --pagesize 4096 --second_offset 0x00f00000 \
|
|
||||||
+ --ramdisk "$fit_image" \
|
|
||||||
+ --kernel u-boot.bin.gz-dtb \
|
|
||||||
+ -o boot.img
|
|
||||||
+
|
|
||||||
+Flash image with your phone's flashing method.
|
|
||||||
+
|
|
||||||
Boards
|
|
||||||
------------
|
|
||||||
starqlte
|
|
||||||
diff --git a/include/configs/sdm845.h b/include/configs/sdm845.h
|
|
||||||
index af9ba197d4..ba57323c74 100644
|
|
||||||
--- a/include/configs/sdm845.h
|
|
||||||
+++ b/include/configs/sdm845.h
|
|
||||||
@@ -16,6 +16,14 @@
|
|
||||||
/* Generic Timer Definitions */
|
|
||||||
#define COUNTER_FREQUENCY 19000000
|
|
||||||
|
|
||||||
+#define CONFIG_EXTRA_ENV_SETTINGS \
|
|
||||||
+ "bootm_size=0x4000000\0" \
|
|
||||||
+ "bootm_low=0x80000000\0" \
|
|
||||||
+ "stdout=vidconsole\0" \
|
|
||||||
+ "stderr=vidconsole\0" \
|
|
||||||
+ "preboot=source $prevbl_initrd_start_addr:prebootscript\0" \
|
|
||||||
+ "bootcmd=source $prevbl_initrd_start_addr:bootscript\0"
|
|
||||||
+
|
|
||||||
/* Size of malloc() pool */
|
|
||||||
#define CONFIG_SYS_BOOTM_LEN SZ_64M
|
|
||||||
|
|
||||||
--
|
|
||||||
2.20.1
|
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
From 22865c8e1872c7ff634232b0174b7cf5adb10bbd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dzmitry Sankouski <dsankouski@gmail.com>
|
||||||
|
Date: Tue, 29 Nov 2022 21:45:48 +0300
|
||||||
|
Subject: [PATCH 2/6] sdm845: save relocaddr to env variables
|
||||||
|
|
||||||
|
KASLR address is needed to boot fully functional Android.
|
||||||
|
KASLR is set by primary bootloader, and since u-boot is used
|
||||||
|
as a secondary bootloader(replacing kernel) on sdm845 platform,
|
||||||
|
KASLR may be found by comparing memory chunks at relocaddr over
|
||||||
|
supposed KASLR range.
|
||||||
|
---
|
||||||
|
arch/arm/mach-snapdragon/init_sdm845.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/mach-snapdragon/init_sdm845.c b/arch/arm/mach-snapdragon/init_sdm845.c
|
||||||
|
index 5f53c21947..1f22aee7f6 100644
|
||||||
|
--- a/arch/arm/mach-snapdragon/init_sdm845.c
|
||||||
|
+++ b/arch/arm/mach-snapdragon/init_sdm845.c
|
||||||
|
@@ -77,6 +77,7 @@ __weak int misc_init_r(void)
|
||||||
|
} else {
|
||||||
|
env_set("key_power", "0");
|
||||||
|
}
|
||||||
|
+ env_set_addr("relocaddr", gd->relocaddr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.30.2
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
From 4e60f940452ca7ae8651d3560c0ac1b368375c3b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dzmitry Sankouski <dsankouski@gmail.com>
|
||||||
|
Date: Thu, 1 Dec 2022 20:07:36 +0300
|
||||||
|
Subject: [PATCH 3/6] input: do not override console, when stdin and device
|
||||||
|
name not defined
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/input/input.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/input/input.c b/drivers/input/input.c
|
||||||
|
index a4341e8c7c..a4eeba13a5 100644
|
||||||
|
--- a/drivers/input/input.c
|
||||||
|
+++ b/drivers/input/input.c
|
||||||
|
@@ -671,7 +671,7 @@ int input_stdio_register(struct stdio_dev *dev)
|
||||||
|
error = stdio_register(dev);
|
||||||
|
#if !defined(CONFIG_SPL_BUILD) || CONFIG_IS_ENABLED(ENV_SUPPORT)
|
||||||
|
/* check if this is the standard input device */
|
||||||
|
- if (!error && strcmp(env_get("stdin"), dev->name) == 0) {
|
||||||
|
+ if (!error && !dev->name && strcmp(env_get("stdin"), dev->name) == 0) {
|
||||||
|
/* reassign the console */
|
||||||
|
if (OVERWRITE_CONSOLE ||
|
||||||
|
console_assign(stdin, dev->name))
|
||||||
|
--
|
||||||
|
2.30.2
|
||||||
|
|
|
@ -0,0 +1,212 @@
|
||||||
|
From 70477a286fbb36ba8b019ccff30615f837b89dbf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dzmitry Sankouski <dsankouski@gmail.com>
|
||||||
|
Date: Thu, 1 Dec 2022 20:13:04 +0300
|
||||||
|
Subject: [PATCH 4/6] wip: input driver for gpio buttons
|
||||||
|
|
||||||
|
Bootmenu requires an input device with arrows and enter key.
|
||||||
|
A common smartphone luckily has power, volume up/down buttons,
|
||||||
|
which may be used for bootmenu.
|
||||||
|
|
||||||
|
This driver implements linux,code on a gpio pins.
|
||||||
|
---
|
||||||
|
drivers/input/Makefile | 1 +
|
||||||
|
drivers/input/button_kbd.c | 175 +++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 176 insertions(+)
|
||||||
|
create mode 100644 drivers/input/button_kbd.c
|
||||||
|
|
||||||
|
diff --git a/drivers/input/Makefile b/drivers/input/Makefile
|
||||||
|
index ded76bddb2..b113c836e7 100644
|
||||||
|
--- a/drivers/input/Makefile
|
||||||
|
+++ b/drivers/input/Makefile
|
||||||
|
@@ -6,6 +6,7 @@
|
||||||
|
obj-$(CONFIG_$(SPL_TPL_)CROS_EC_KEYB) += cros_ec_keyb.o
|
||||||
|
obj-$(CONFIG_$(SPL_TPL_)OF_CONTROL) += key_matrix.o
|
||||||
|
obj-$(CONFIG_$(SPL_TPL_)DM_KEYBOARD) += input.o keyboard-uclass.o
|
||||||
|
+obj-$(CONFIG_DM_KEYBOARD) += button_kbd.o
|
||||||
|
|
||||||
|
ifndef CONFIG_SPL_BUILD
|
||||||
|
|
||||||
|
diff --git a/drivers/input/button_kbd.c b/drivers/input/button_kbd.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..2a9490dc1c
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/input/button_kbd.c
|
||||||
|
@@ -0,0 +1,175 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
+/*
|
||||||
|
+ * (C) Copyright 2022 Dzmitry Sankouski <dsankouski@gmail.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <common.h>
|
||||||
|
+#include <dm.h>
|
||||||
|
+#include <fdtdec.h>
|
||||||
|
+#include <input.h>
|
||||||
|
+#include <keyboard.h>
|
||||||
|
+#include <log.h>
|
||||||
|
+#include <asm/io.h>
|
||||||
|
+#include <asm/gpio.h>
|
||||||
|
+#include <linux/delay.h>
|
||||||
|
+#include <linux/input.h>
|
||||||
|
+
|
||||||
|
+struct gpio_desc keydown_desc;
|
||||||
|
+struct gpio_desc keypwr_desc;
|
||||||
|
+int pwr_current = 0;
|
||||||
|
+int voldown_current = 0;
|
||||||
|
+char pwr_keycode = 0;
|
||||||
|
+char voldown_keycode = 0;
|
||||||
|
+
|
||||||
|
+struct button_kbd_priv {
|
||||||
|
+ struct input_config *input;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+int read_voldown(void) {
|
||||||
|
+ if (voldown_current != dm_gpio_get_value(&keydown_desc)) {
|
||||||
|
+ voldown_current = !voldown_current;
|
||||||
|
+ pwr_keycode = KEY_DOWN;
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int read_pwr(void) {
|
||||||
|
+ int pwrval = dm_gpio_get_value(&keypwr_desc);
|
||||||
|
+ if (pwr_current != pwrval) {
|
||||||
|
+ pwr_keycode = KEY_ENTER;
|
||||||
|
+ pwr_current = !pwr_current;
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int button_tstc(struct udevice *dev) {
|
||||||
|
+ int res = 0;
|
||||||
|
+
|
||||||
|
+ res |= read_pwr();
|
||||||
|
+ res |= read_voldown();
|
||||||
|
+ return res;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int button_read_keys(struct input_config *input) {
|
||||||
|
+ int res = 0;
|
||||||
|
+ int code[1];
|
||||||
|
+ if (read_pwr()) {
|
||||||
|
+ if (pwr_current == 0) {
|
||||||
|
+ code[0] = -1;
|
||||||
|
+ input_send_keycodes(input, code, 1);
|
||||||
|
+ } else {
|
||||||
|
+ code[0] = KEY_ENTER;
|
||||||
|
+ input_send_keycodes(input, code, 1);
|
||||||
|
+ }
|
||||||
|
+ res = 1;
|
||||||
|
+ }
|
||||||
|
+ if (read_voldown()) {
|
||||||
|
+ if (voldown_current == 0) {
|
||||||
|
+ code[0] = -1;
|
||||||
|
+ input_send_keycodes(input, code, 1);
|
||||||
|
+ } else {
|
||||||
|
+ code[0] = KEY_DOWN;
|
||||||
|
+ input_send_keycodes(input, code, 1);
|
||||||
|
+ }
|
||||||
|
+ res = 1;
|
||||||
|
+ }
|
||||||
|
+ return res;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+int button_getc(struct udevice *dev) {
|
||||||
|
+ int code = 0;
|
||||||
|
+ if (pwr_keycode || read_pwr()) {
|
||||||
|
+ code = pwr_keycode;
|
||||||
|
+ pwr_keycode = 0;
|
||||||
|
+ return code;
|
||||||
|
+ }
|
||||||
|
+ if (voldown_keycode || read_voldown()) {
|
||||||
|
+ code = voldown_keycode;
|
||||||
|
+ voldown_keycode = 0;
|
||||||
|
+ return code;
|
||||||
|
+ }
|
||||||
|
+ return -EAGAIN;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int button_kbd_start(struct udevice *dev) {
|
||||||
|
+ struct udevice *pon;
|
||||||
|
+ int node, ret;
|
||||||
|
+
|
||||||
|
+ ret = uclass_get_device_by_name(UCLASS_GPIO, "pm8998_pon@800", &pon);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ printf("Failed to find PMIC pon node. Check device tree\n");
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pon),
|
||||||
|
+ "key_vol_down");
|
||||||
|
+ if (node < 0) {
|
||||||
|
+ printf("Failed to find key_vol_down node. Check device tree\n");
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ if (gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
|
||||||
|
+ &keydown_desc, 0)) {
|
||||||
|
+ printf("Failed to request key_vol_down button.\n");
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pon),
|
||||||
|
+ "key_power");
|
||||||
|
+ if (node < 0) {
|
||||||
|
+ printf("Failed to find key_power node. Check device tree\n");
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ if (gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
|
||||||
|
+ &keypwr_desc, 0)) {
|
||||||
|
+ printf("Failed to request key_power button.\n");
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int button_kbd_probe(struct udevice *dev) {
|
||||||
|
+ struct button_kbd_priv *priv = dev_get_priv(dev);
|
||||||
|
+ struct keyboard_priv *uc_priv = dev_get_uclass_priv(dev);
|
||||||
|
+ struct stdio_dev *sdev = &uc_priv->sdev;
|
||||||
|
+ struct input_config *input = &uc_priv->input;
|
||||||
|
+ int ret = 0;
|
||||||
|
+
|
||||||
|
+ input_init(input, false);
|
||||||
|
+ input_add_tables(input, false);
|
||||||
|
+
|
||||||
|
+ /* Register the device. init_tegra_keyboard() will be called soon */
|
||||||
|
+ priv->input = input;
|
||||||
|
+ input->dev = dev;
|
||||||
|
+ input->read_keys = button_read_keys;
|
||||||
|
+ strcpy(sdev->name, "button-kbc");
|
||||||
|
+ ret = input_stdio_register(sdev);
|
||||||
|
+ if (ret) {
|
||||||
|
+ debug("%s: input_stdio_register() failed\n", __func__);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct keyboard_ops button_kbd_ops = {
|
||||||
|
+ .start = button_kbd_start,
|
||||||
|
+ .getc = button_getc,
|
||||||
|
+ .tstc = button_tstc
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct udevice_id button_kbd_ids[] = {
|
||||||
|
+ { .compatible = "button-kbd" },
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+U_BOOT_DRIVER(button_kbd) = {
|
||||||
|
+ .name = "button_kbd",
|
||||||
|
+ .id = UCLASS_KEYBOARD,
|
||||||
|
+ .of_match = button_kbd_ids,
|
||||||
|
+ .probe = button_kbd_probe,
|
||||||
|
+ .ops = &button_kbd_ops ,
|
||||||
|
+ .priv_auto = sizeof(struct button_kbd_priv),
|
||||||
|
+};
|
||||||
|
--
|
||||||
|
2.30.2
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
From 506cdd778b001d7586dbf87beaf92b2c134305e3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dzmitry Sankouski <dsankouski@gmail.com>
|
||||||
|
Date: Thu, 1 Dec 2022 20:15:24 +0300
|
||||||
|
Subject: [PATCH 5/6] starqltechn: use button-kbd driver for navigating boot
|
||||||
|
menu
|
||||||
|
|
||||||
|
---
|
||||||
|
arch/arm/dts/sdm845.dtsi | 4 +++
|
||||||
|
arch/arm/mach-snapdragon/init_sdm845.c | 45 --------------------------
|
||||||
|
configs/starqltechn_defconfig | 2 ++
|
||||||
|
3 files changed, 6 insertions(+), 45 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/dts/sdm845.dtsi b/arch/arm/dts/sdm845.dtsi
|
||||||
|
index 607af277f8..4adf494218 100644
|
||||||
|
--- a/arch/arm/dts/sdm845.dtsi
|
||||||
|
+++ b/arch/arm/dts/sdm845.dtsi
|
||||||
|
@@ -63,6 +63,10 @@
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
+ button_kbd {
|
||||||
|
+ compatible = "button-kbd";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
spmi@c440000 {
|
||||||
|
compatible = "qcom,spmi-pmic-arb";
|
||||||
|
reg = <0xc440000 0x1100>,
|
||||||
|
diff --git a/arch/arm/mach-snapdragon/init_sdm845.c b/arch/arm/mach-snapdragon/init_sdm845.c
|
||||||
|
index 1f22aee7f6..cbbe1d5c76 100644
|
||||||
|
--- a/arch/arm/mach-snapdragon/init_sdm845.c
|
||||||
|
+++ b/arch/arm/mach-snapdragon/init_sdm845.c
|
||||||
|
@@ -32,51 +32,6 @@ __weak int board_init(void)
|
||||||
|
/* Check for vol- and power buttons */
|
||||||
|
__weak int misc_init_r(void)
|
||||||
|
{
|
||||||
|
- struct udevice *pon;
|
||||||
|
- struct gpio_desc resin;
|
||||||
|
- int node, ret;
|
||||||
|
-
|
||||||
|
- ret = uclass_get_device_by_name(UCLASS_GPIO, "pm8998_pon@800", &pon);
|
||||||
|
- if (ret < 0) {
|
||||||
|
- printf("Failed to find PMIC pon node. Check device tree\n");
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pon),
|
||||||
|
- "key_vol_down");
|
||||||
|
- if (node < 0) {
|
||||||
|
- printf("Failed to find key_vol_down node. Check device tree\n");
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
- if (gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
|
||||||
|
- &resin, 0)) {
|
||||||
|
- printf("Failed to request key_vol_down button.\n");
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
- if (dm_gpio_get_value(&resin)) {
|
||||||
|
- env_set("key_vol_down", "1");
|
||||||
|
- printf("Volume down button pressed\n");
|
||||||
|
- } else {
|
||||||
|
- env_set("key_vol_down", "0");
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pon),
|
||||||
|
- "key_power");
|
||||||
|
- if (node < 0) {
|
||||||
|
- printf("Failed to find key_power node. Check device tree\n");
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
- if (gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
|
||||||
|
- &resin, 0)) {
|
||||||
|
- printf("Failed to request key_power button.\n");
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
- if (dm_gpio_get_value(&resin)) {
|
||||||
|
- env_set("key_power", "1");
|
||||||
|
- printf("Power button pressed\n");
|
||||||
|
- } else {
|
||||||
|
- env_set("key_power", "0");
|
||||||
|
- }
|
||||||
|
env_set_addr("relocaddr", gd->relocaddr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
diff --git a/configs/starqltechn_defconfig b/configs/starqltechn_defconfig
|
||||||
|
index 995a623305..baaba6824f 100644
|
||||||
|
--- a/configs/starqltechn_defconfig
|
||||||
|
+++ b/configs/starqltechn_defconfig
|
||||||
|
@@ -10,6 +10,8 @@ CONFIG_SYS_LOAD_ADDR=0x80000000
|
||||||
|
CONFIG_FIT=y
|
||||||
|
CONFIG_FIT_VERBOSE=y
|
||||||
|
CONFIG_BOOTDELAY=5
|
||||||
|
+CONFIG_CMD_BOOTMENU=y
|
||||||
|
+CONFIG_DM_KEYBOARD=y
|
||||||
|
CONFIG_USE_PREBOOT=y
|
||||||
|
CONFIG_SAVE_PREV_BL_FDT_ADDR=y
|
||||||
|
CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR=y
|
||||||
|
--
|
||||||
|
2.30.2
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
From ee9acd76d945aece3b375b56600f88843f5a105f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dzmitry Sankouski <dsankouski@gmail.com>
|
||||||
|
Date: Thu, 1 Dec 2022 22:07:08 +0300
|
||||||
|
Subject: [PATCH 6/6] bootmenu: loop over menu entries with one key
|
||||||
|
|
||||||
|
---
|
||||||
|
cmd/bootmenu.c | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
|
||||||
|
index 3340be1632..7d9f0b3a46 100644
|
||||||
|
--- a/cmd/bootmenu.c
|
||||||
|
+++ b/cmd/bootmenu.c
|
||||||
|
@@ -103,11 +103,15 @@ static char *bootmenu_choice_entry(void *data)
|
||||||
|
case KEY_UP:
|
||||||
|
if (menu->active > 0)
|
||||||
|
--menu->active;
|
||||||
|
+ else
|
||||||
|
+ menu->active = menu->count - 1;
|
||||||
|
/* no menu key selected, regenerate menu */
|
||||||
|
return NULL;
|
||||||
|
case KEY_DOWN:
|
||||||
|
if (menu->active < menu->count - 1)
|
||||||
|
++menu->active;
|
||||||
|
+ else
|
||||||
|
+ menu->active = 0;
|
||||||
|
/* no menu key selected, regenerate menu */
|
||||||
|
return NULL;
|
||||||
|
case KEY_SELECT:
|
||||||
|
--
|
||||||
|
2.30.2
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# U-boot with patches to make the Samsung S9 boot
|
# U-boot with patches to make the Samsung S9 boot
|
||||||
pkgname=u-boot-starqltechn
|
pkgname=u-boot-starqltechn
|
||||||
pkgver=2022.04_rc4
|
pkgver=2023.01_rc2
|
||||||
pkgrel=0
|
pkgrel=0
|
||||||
pkgdesc="U-Boot bootloader for the Samsung SM-G9600 starqltechn"
|
pkgdesc="U-Boot bootloader for the Samsung SM-G9600 starqltechn"
|
||||||
url="https://source.denx.de/u-boot"
|
url="https://source.denx.de/u-boot"
|
||||||
|
@ -18,11 +18,15 @@ makedepends="$depends_dev
|
||||||
swig
|
swig
|
||||||
"
|
"
|
||||||
options="!archcheck !check !strip"
|
options="!archcheck !check !strip"
|
||||||
ubootver=2022.04-rc4
|
ubootver=2023.01-rc2
|
||||||
source="
|
source="
|
||||||
http://source.denx.de/u-boot/u-boot/-/archive/v$ubootver/u-boot-v$ubootver.tar.gz
|
http://source.denx.de/u-boot/u-boot/-/archive/v$ubootver/u-boot-v$ubootver.tar.gz
|
||||||
0001-arm-init-save-previous-bootloader-data.patch
|
0001-starqltechn-enable-serial-console.patch
|
||||||
0002-board-starqltechn-get-board-usable-add-bootcmd-and-d.patch
|
0002-sdm845-save-relocaddr-to-env-variables.patch
|
||||||
|
0003-input-do-not-override-console-when-stdin-and-device-.patch
|
||||||
|
0004-wip-input-driver-for-gpio-buttons.patch
|
||||||
|
0005-starqltechn-use-button-kbd-driver-for-navigating-boo.patch
|
||||||
|
0006-bootmenu-loop-over-menu-entries-with-one-key.patch
|
||||||
"
|
"
|
||||||
builddir="$srcdir/u-boot-v$ubootver"
|
builddir="$srcdir/u-boot-v$ubootver"
|
||||||
|
|
||||||
|
@ -37,7 +41,11 @@ package() {
|
||||||
}
|
}
|
||||||
|
|
||||||
sha512sums="
|
sha512sums="
|
||||||
f9865d9aa552c4161deb416379b0221cbf3ba0530e4af4c95db6b7ef96843a9bc59a0fc30b38e9e3fd1403dc6557249930d7476423a1470820f07104f2e7747b u-boot-v2022.04-rc4.tar.gz
|
5e570a0070cd31bb4d9541542532229dbe15e28955428e8a6659de5e4140c89f82d635045d5594e6b9cc6b4bb3037ea4e2c6236433d65a7c814a0ec9c0f32004 u-boot-v2023.01-rc2.tar.gz
|
||||||
a6158cf9271f400e758b6c4724c044dea66066ae28c7ecae9c51323b795684238b9f4509b8f590e001568033478e87f0fb5abd7511c1bc65f757d62982fa5763 0001-arm-init-save-previous-bootloader-data.patch
|
068453a2eb3e2e6a950a31cd014f1dd4eed99f327f09aae69f4e4e55edf99cbef640d2361ada5844c5a02b2242c5668800d6b88599886c257764378615b351f8 0001-starqltechn-enable-serial-console.patch
|
||||||
95d4fa1e7327fba05f0213aa29f27a231fd314a419b055a572ae23a5bb9155eb6149e91bfe90953b7725ab8b876ed4745c6b8082f30c7ecae9c4aaab9930e178 0002-board-starqltechn-get-board-usable-add-bootcmd-and-d.patch
|
5e0dbe9a99c3931aba8d67510453058722f028ca3dbaeb8f12523b76b60349d2394175ffc25a6ea2395f5f65c5e86f563cd4db3794e17986c1085ca444613b0b 0002-sdm845-save-relocaddr-to-env-variables.patch
|
||||||
|
ea3e3c270d04da74a7ab993802467631af7c47a14b78dcb3e185b234ceec804841eb4b6c0919d6bdd30157126fdb44a99e829712f3b44c60dd794a2a3acb812c 0003-input-do-not-override-console-when-stdin-and-device-.patch
|
||||||
|
72b78a26737d9ee21854b71036ec5e31206be7cfe70e11ba583eb3e699da674db0db45ce9e51c30f1935aa8bcfa8ed6157899f129de55fb5966892490e6e7eb3 0004-wip-input-driver-for-gpio-buttons.patch
|
||||||
|
1060f0517d5fe7ad36156313b50f7814e73b1ccfec96fa01cfb66bd63c6d6e5343121024c6ccc32ecbf12eeed499b00de5d7df73882edafac65a4bd7cacb7067 0005-starqltechn-use-button-kbd-driver-for-navigating-boo.patch
|
||||||
|
e6217387c7e5f5766602feca99d3973c0a1780069d279e279b413425dc7ab1b6f4227eb0d108f17e6ccbeddb6ab99c5a6b236678980cf5a77dbff36fd1b1d2b0 0006-bootmenu-loop-over-menu-entries-with-one-key.patch
|
||||||
"
|
"
|
||||||
|
|
Loading…
Reference in a new issue