Rockchip RK3588 Android+Linux双系统方案的实现

article/2025/10/16 17:30:28

Rockchip RK3588 Android+Linux双系统方案的实现

文章目录

  • Rockchip RK3588 Android+Linux双系统方案的实现
    • 概述
    • 硬件环境
    • 软件环境
    • 要求
    • 代码修改
      • uboot引导不同的系统
      • 修改parameter分区表
      • 修改Android系统的fstab
      • Linux系统固件
    • 固件烧写
    • 验证

概述

RK3588双系统启动流程如下图
在这里插入图片描述

uboot根据按键来识别要启动的系统,这里可以使用拨码开关来代替。
uboot在加载分区的时根据分区名字来区分加载android或者linux的分区,所以在linux和android分区表中需要用"_android"字段来区分。

硬件环境

基于RK3588 EVB1开发板实现,系统切换按键是ESC 返回键

软件环境

RK3588 Android12 SDK + RK3588 linux Debian系统

要求

  • Android和linux的固件的代码uboot和rkbin部分需要一致,因为uboot和loader是共用一份
  • uboot需要额外补丁,可以通过RK的redmine获取

代码修改

uboot引导不同的系统

  1. 在uboot打上支持双系统的补丁0003-disk-part-Support-get-partition-name-suffix-from-env.patch,该补丁可以通过RK的redmine系统获取。
  2. 设置切换按键及分区名称下标
u-boot$
//配置BACK按键做为切换按键,这里使用adc采样,设置按键对应的adc值
diff --git a/arch/arm/dts/rk3588-evb.dts b/arch/arm/dts/rk3588-evb.dts
index ad750d5b74..b6218fd742 100644
--- a/arch/arm/dts/rk3588-evb.dts
+++ b/arch/arm/dts/rk3588-evb.dts
@@ -27,5 +27,12 @@label = "volume up";press-threshold-microvolt = <1750>;};
+
+               back-key {
+                       u-boot,dm-pre-reloc;
+                       linux,code = <KEY_BACK>;
+                       label = "back";
+                       press-threshold-microvolt = <1235000>;
+               };};};
//配置按键切换,在开机是检测到按键按下就从boot_android分区引导boot启动,即启动android系统,否则引导linux的boot,启动linux系统
diff --git a/arch/arm/mach-rockchip/rk3588/rk3588.c b/arch/arm/mach-rockchip/rk3588/rk3588.c
index a8efc4f9b4..e7b94001c1 100644
--- a/arch/arm/mach-rockchip/rk3588/rk3588.c
+++ b/arch/arm/mach-rockchip/rk3588/rk3588.c
@@ -4,6 +4,7 @@* SPDX-License-Identifier:     GPL-2.0+*/#include <common.h>
+#include <key.h>#include <mmc.h>#include <spl.h>#include <asm/io.h>
@@ -940,3 +941,18 @@ int rk_board_fdt_fixup(const void *blob)return 0;}
+
+int board_early_init_r(void)
+{
+
+       printf("board_early_init_r\n");
+       if (key_is_pressed(key_read(KEY_BACK))) {
+               env_set("part_suffix", "_android");
+               printf("Part suffix: _android\n");
+       } else {
+               env_set("part_suffix", NULL);
+       }
+
+       return 0;
+}
+
diff --git a/configs/rk3588_defconfig b/configs/rk3588_defconfig
index fd6c9114f0..da7ca13626 100644
--- a/configs/rk3588_defconfig
+++ b/configs/rk3588_defconfig
@@ -223,3 +223,4 @@ CONFIG_RK_AVB_LIBAVB_USER=yCONFIG_OPTEE_CLIENT=yCONFIG_OPTEE_V2=yCONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
+CONFIG_BOARD_EARLY_INIT_R=y
diff --git a/drivers/input/key-uclass.c b/drivers/input/key-uclass.c
index 1fe9f2c267..0db67fb251 100644
--- a/drivers/input/key-uclass.c
+++ b/drivers/input/key-uclass.c
@@ -39,6 +39,7 @@ uint64_t key_timer(uint64_t base)static int key_adc_event(struct dm_key_uclass_platdata *uc_key, int adcval){
+       KEY_ERR("adcval=%d,max=%d,min=%d\n",adcval, uc_key->max, uc_key->min);return (adcval <= uc_key->max && adcval >= uc_key->min) ?KEY_PRESS_DOWN : KEY_PRESS_NONE;}

修改parameter分区表

双系统的分区表使用同一个,需要把linux和android的分区都加上去,如果两个系统分区名称有重复的,需要把android的分区名后面加_android来区分。具体如下:

FIRMWARE_VER: 12.0
MACHINE_MODEL: rk3588_s
MACHINE_ID: 007
MANUFACTURER: rockchip
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: rk3588_s
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00002000(security),0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc_android),0x00002000@0x0000a000(dtbo),0x00000800@0x0000c000(vbmeta),0x00014000@0x0000c800(boot_android),0x00030000@0x00020800(recovery_android),0x000c0000@0x00050800(backup_android),0x000c0000@0x00110800(cache),0x00008000@0x001d0800(metadata),0x00000800@0x001d8800(baseparameter),0x00614000@0x001d9000(super),0x800000@0x007ed000(userdata_android),0x00002000@0x00fed000(misc),0x00020000@0x00fef000(boot),0x00040000@0x0100f000(recovery),0x00010000@0x0104f000(backup),0x01c00000@0x0105f000(rootfs),0x00040000@0x02c5f000(oem),-@0x02c9f000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9

** 其中:

  • uboot分区是linux和android共用的,其他分区都是独立的;
  • Android的misc、boot、 recovery、 backup、 userdata分区因为跟linux重复了所以需要改为misc_android boot_android recovery_android backup_android userdata_android

修改Android系统的fstab

由于Android的分区名改了,所以需要fstab里面对应修改挂在的路径,如下:

  • fstab的修改
device/rockchip/common:
diff --git a/scripts/fstab_tools/fstab.in b/scripts/fstab_tools/fstab.in
index 2ec6c265..c5098a0c 100755
--- a/scripts/fstab_tools/fstab.in
+++ b/scripts/fstab_tools/fstab.in
@@ -6,10 +6,10 @@ ${_block_prefix}system  /system   ext4 ro,barrier=1 ${_flags_vbmeta},first_stage${_block_prefix}vendor  /vendor   ext4 ro,barrier=1 ${_flags},first_stage_mount${_block_prefix}odm     /odm      ext4 ro,barrier=1 ${_flags},first_stage_mount-/dev/block/by-name/boot     /boot       emmc defaults     ${_flags_chained}first_stage_mount
+/dev/block/by-name/boot_android     /boot       emmc defaults     ${_flags_chained}first_stage_mount
/dev/block/by-name/cache    /cache      ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard    wait,check/dev/block/by-name/metadata /metadata   ext4 nodev,noatime,nosuid,discard,sync                          wait,formattable,first_stage_mount,check
-/dev/block/by-name/misc     /misc       emmc defaults     defaults
+/dev/block/by-name/misc_android     /misc       emmc defaults     defaults/devices/platform/*usb*   auto vfat defaults      voldmanaged=usb:auto@@ -23,6 +23,6 @@ ${_block_prefix}odm     /odm      ext4 ro,barrier=1 ${_flags},first_stage_mount# For sdmmc/devices/platform/${_sdmmc_device}/mmc_host*        auto  auto    defaults        voldmanaged=sdcard1:auto#  Full disk encryption has less effect on rk3326, so default to enable this.
-/dev/block/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065 latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,reservedsize=128M,checkpoint=fs
+/dev/block/by-name/userdata_android /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,reservedsize=128M,checkpoint=fs# for ext4#/dev/block/by-name/userdata    /data      ext4    discard,noatime,nosuid,nodev,noauto_da_alloc,data=ordered,user_xattr,barrier=1    latemount,wait,formattable,check,fileencryption=software,quota,reservedsize=128M,checkpoint=block
  • recovery.fstab的修改
    对应的recovery的fstab也要修改,修改产品目录下的recovery.fstab
device/rockchip/rk3588$ 
diff --git a/rk3588_s/recovery.fstab b/rk3588_s/recovery.fstab
index f7843a1..6a82ccc 100644
--- a/rk3588_s/recovery.fstab
+++ b/rk3588_s/recovery.fstab
@@ -9,20 +9,20 @@/dev/block/by-name/system_ext            /system_ext          ext4             defaults                  defaults/dev/block/by-name/vendor_dlkm            /vendor_dlkm          ext4             defaults                  defaults/dev/block/by-name/odm_dlkm            /odm_dlkm          ext4             defaults                  defaults/dev/block/by-name/cache                 /cache               ext4             defaults                  defaults/dev/block/by-name/metadata              /metadata            ext4             defaults                  defaults
-/dev/block/by-name/userdata              /data                f2fs             defaults                  defaults
+/dev/block/by-name/userdata_android              /data                f2fs             defaults                  defaults/dev/block/by-name/cust                  /cust                ext4             defaults                  defaults/dev/block/by-name/custom                /custom              ext4             defaults                  defaults/dev/block/by-name/radical_update        /radical_update      ext4             defaults                  defaults
-/dev/block/by-name/misc                  /misc                emmc             defaults                  defaults
+/dev/block/by-name/misc_android                  /misc                emmc             defaults                  defaults/dev/block/by-name/uboot                 /uboot               emmc             defaults                  defaults/dev/block/by-name/charge                /charge              emmc             defaults                  defaults/dev/block/by-name/resource                       /resource                emmc                         defaults                                  defaults/dev/block/by-name/parameter             /parameter           emmc             defaults                  defaults
-/dev/block/by-name/boot                  /boot                emmc             defaults                  defaults
-/dev/block/by-name/recovery              /recovery            emmc             defaults                  defaults
-/dev/block/by-name/backup                /backup              emmc             defaults                  defaults
+/dev/block/by-name/boot_android                  /boot                emmc             defaults                  defaults
+/dev/block/by-name/recovery_android              /recovery            emmc             defaults                  defaults
+/dev/block/by-name/backup_android                /backup              emmc             defaults                  defaults/dev/block/by-name/frp                   /frp                 emmc             defaults                  defaults/dev/block/by-name/trust                 /trust               emmc             defaults                  defaults/dev/block/by-name/baseparamer           /baseparamer         emmc             defaults                  defaults

Linux系统固件

linux系统的固件软件不需要修改,可以直接用编译好的固件

固件烧写

固件需要烧写linux和android的固件,如下图,可以直接右键导入上面修改好的parameter.txt文件,然后删除不需要的烧写固件分区即可。
注意:uboot、loader、parameter这三个是共用的,只需要烧一份即可。
在这里插入图片描述
在这里插入图片描述

验证

固件烧写完成后第一次默认开机会从linux系统启动,linux正常启动后可以按住ESC按键,然后重启系统,ESC要一直按住到android系统启动完成。


http://chatgpt.dhexx.cn/article/vSJLZ3is.shtml

相关文章

windows加linux双系统安装方法

windows中标麒麟或中科方德的双系统安装方法 如果需要安装windows和linux系统双系统&#xff0c;需要先安装windows&#xff0c;windows的安装方法就不在这里说明了&#xff0c;安装了windows系统后再安装linux系统。 一、windows和中科方德双系统安装方法 1、安装windows后重启…

linux双系统安装教程

最近刚刚完成了Windows和Linux双系统(这里以Ubuntu安装为例)的安装,应某奔同学要求,这里简单记录下安装过程。 1 系统启动盘准备 因为不想装第二个系统的时候重做系统盘,所以这里做的系统启动盘本身就是Windows和Linux双系统引导的。这里用的工具前面在docker安装笔记的…

在windows系统下安装linux双系统

其实是不难的&#xff0c;只是要注意一些小细节&#xff1b;&#xff08;主要问题有两个&#xff1a;1.怎么进入自己电脑的bios 2.安装linux过程中的分区大小问题&#xff0c;后面会详细描述我遇到的这方面的问题&#xff09; 步骤如下&#xff1a; 1.去ubuntu官网上下载一个…

【解决windows】Windows Linux双系统安装历程,超详细

Window Linux 双系统安装历程 今天下午心血来潮装个双系统搞了几个小时&#xff0c;可谓是困难重重&#xff0c;但是实际上只是被一个很小的问题困住了&#xff0c;其它地方都很简单。 那么接下来简单讲一下安装的步骤以及遇到的问题。 先讲一下设备状况&#xff1a; 1. 一台…

linux和win双系统删除,Windows+Linux 双系统的卸载方法

关于如何在同一台电脑上运行多个操作系统的文章数不胜数,比如有的文章介绍了如何同时安装Windows和Linux,有的文章介绍了如何同时安装Windows和OS X,还有一些其他的文章。但是,当你想卸载其中的某个操作系统,你应该怎么办呢?下面,我们就介绍一下你安装了“Windows+Linux…

Win11、Linux 双系统安装方法

偷偷拿来记录一下萌新的cs路——day 43 安装linux 系统&#xff0c;让电脑变成win、linux 双系统&#xff0c;以及踩的一些坑qwq。 目录 制作启动U盘 磁盘准备 进入BIOS系统 进入Ubuntu 安装Ubuntu 切换系统 制作启动U盘 1. 至Ubuntu官网下载iso文件&#xff0c;如Ubun…

Win装linux双系统教程

Win装linux双系统教程 1. 准备步骤 Linux系统镜像、空u盘&#xff08;16g&#xff09;、写入软件&#xff08;一般是UltraISO&#xff0c;其他也行&#xff09;、引导编辑工具&#xff08;EasyBCD、easyuefi之类的&#xff09; 2&#xff0e;释放空间 右键我的电脑-管理-磁盘…

linux下设置双系统选项,linux双系统【操作步骤】

虽然电脑已经很普遍了,但是一些年长的人对电脑的操作不是很熟悉,比如在使用win7系统时一旦遇到linux双系统 时就懵了,对于linux双系统 处理起来相对来说较简单,按照我们的步骤处理linux双系统 很容易上手,linux双系统 具体处理方法如下: 计算机装Windows和Linux双系统 问…

Linux双系统安装指南

背景 在实际工作中&#xff0c;一些同事可能需要使用到Windows和Linux两种操作系统&#xff0c;需要将这两种系统安装在同一台电脑上&#xff0c;但是网上的教程良莠不齐&#xff0c;有一些文章已经失去了时效性&#xff0c;可能会造成一些误导&#xff0c;不仅浪费时间&#…

Window Linux双系统安装 超详细教程

Window Linux双系统安装历程 今天下午搞了几个小时&#xff0c;可谓是困难重重&#xff0c;但是实际上只是被一个很小的问题困住了&#xff0c;其它地方都很简单。 接下来简单讲一下安装的步骤以及遇到的问题。 先讲一下设备状况&#xff1a; 一台12年买的i3 window7 待报废…

JESD204B的SYSREF频率设置

SYSREF在脉冲模式下对频率没有特定要求。在周期性模式下&#xff0c;频率必须与LMFC之间呈整数倍关系。根据图3可得LMFC与SYSREF的计算公式如下&#xff1a; 其中&#xff0c;F表示一帧数据中的字节数&#xff0c;K表示一个多帧数据中帧的个数&#xff0c;R表示LMFC与SYSREF的频…

1.JESD204B基础知识

什么是JESD204B JESD204B是一种新型的高速串行ADC/DAC数据传输接口,JESD204B包括3个子类,分别是子类0,子类1,子类2。 subclass0:不支持确定延迟; subclass1:使用SYSREF信号 。 subclass2:使用SYNC信号。 说明:后续均是介绍subclass1 JESD204B接口优劣 相对于传统的…

JESD204B接口与协议

JESD204B协议 在使用最新模数转换器&#xff08;ADC&#xff09;和数模转换器&#xff08;DAC&#xff09;设计系统时&#xff0c;我已知道了很多有关JESD204B接口标准的信息&#xff0c;这些器件使用该协议与FPGA通信。有一个没有深入讨论的主题就是解决ADC至FPGA 和FPGA 至D…

【国产虚拟仪器】基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集模块设计(一)总体方案

本章将根据高速数据采集指标要求&#xff0c;分析并确定高速数据采集模块的设计方 案&#xff0c;由此分析数据存储需求及存储速度需求给出高速大容量数据存储方案&#xff0c;完成 双通道高速数据采集模块总体设计方案&#xff0c;并综合采集、存储方案及 AXIe 接口需求 …

JESD204接口调试总结——Xilinx JESD204B数据手册的理解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 JESD204接口调试总结——Xilinx JESD204B数据手册的理解 时钟架构Subclass 1SYSREF Sampling Clock Edge确定性时延SYSREF Delay 时钟架构 设计中采用如下图所示时钟设计图&…

【国产虚拟仪器】基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集模块设计(二)研究 JESD204B 链路建立与同步的过程

基于 JESD204B 的采集与数据接收电路设计 本章将围绕基于 JESD204B 高速数据传输接口的双通道高速数据采集实现展 开。首先&#xff0c;简介 JESD204B 协议、接口结构。然后&#xff0c;研究 JESD204B 链路建立与同 步的过程。其次&#xff0c;研究基于 JESD204B …

JESD204接口调试总结——JESD204C协议的介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 JESD204接口调试总结——JESD204C协议的介绍 前言JESD204C变化总结新术语传输层数据链路层物理层 第二部分64b/66b和64b/80b链路层多块(MB)和扩展多块(EMB)同步字64b/66b链路…

JESD204B 和 JESD204C 之间的差异

JESD204 标准 JESD204规范定义了实现协议数据流的四个关键层&#xff0c;如图9所示。 传输层映射样本和已帧、已解码的字节之间的转换。可选的扰乱层对八位元进行扰动/解扰动&#xff0c;分散谱峰值以降低电磁干扰(EMI)。数据链路层处理链路同步、设置和维护&#xff0c;并对…

纸上谈兵_JESD204B

文章目录 基本概念优点子类协议结构链路参数传输层映射方式测试模式 数据链路层对齐字符替换与还原数据链路建立与维护 物理层 时钟器件时钟帧时钟/多帧时钟调整时钟各时钟关系图各协议层时钟使用情况 Xilinx IPPortsBasic Generic Clocking SchemesSubclass 1 OperationRx exa…

【JESD204系列】三、JESD204B标准分层

JESD204B 作为一种分层规范&#xff0c;在规范中共定义了四个层&#xff0c;分别为应用层&#xff0c;传输层&#xff0c;数据链路层和物理层。各层分别执行各自的对应的功能&#xff0c;最终通过四个层的联合&#xff0c;将数据高速无误的进行传输。 【JESD204系列】三、JESD2…