0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

汽车电子技术 来源: loitawu 作者: loitawu 2022-10-10 14:25 次阅读

RK3588双系统启动流程如下图

poYBAGKO4i-AaTP3AACUBpHa2T4214.jpg

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引导不同的系统

在uboot打上支持双系统的补丁0003-disk-part-Support-get-par

ti

tion-name-suffix-from-env.patch,该补丁可以通过RK的redmine系统获取。

设置切换按键及分区名称下标

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 =

;

+ 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

+#include

#include

#include

#include

@@ -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

");

+ if (key_is_pressed(key_read(KEY_BACK))) {

+ env_set("part_suffix", "_android");

+ printf("Part suffix: _android

");

+ } 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=y

CONFIG_OPTEE_CLIENT=y

CONFIG_OPTEE_V2=y

CONFIG_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

",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* autoauto 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这三个是共用的,只需要烧一份即可。

pYYBAGKO4luAJqZQAAIirntIxUs913.jpgpoYBAGKO4nOAHdolAAIb5agK_iA509.jpg

验证

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

原作者:loitawu

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3841

    浏览量

    125498
  • Linux
    +关注

    关注

    87

    文章

    10942

    浏览量

    206540
  • 开发板
    +关注

    关注

    25

    文章

    4370

    浏览量

    93432
  • Uboot
    +关注

    关注

    4

    文章

    123

    浏览量

    27776
  • RK3588
    +关注

    关注

    6

    文章

    230

    浏览量

    3408
收藏 人收藏

    评论

    相关推荐

    瑞芯微RK3588开发板RK3588 EVB和RK3588S EVB解读

    瑞芯微RK3588开发板RK3588 EVB和RK3588S EVB解读 瑞芯微旗舰芯RK3588系列开发板受到广大开发者伙伴的关注和问询。针对相关的开发板功能、操作指南等问题,我们一
    的头像 发表于 09-22 15:54 1.4w次阅读
    瑞芯微<b class='flag-5'>RK3588</b>开发板<b class='flag-5'>RK3588</b> EVB和<b class='flag-5'>RK3588</b>S EVB解读

    求一种基于RK3588实现SPI-NOR大容量存储方案

    1、基于RK3588S自研平板方案实现硬件存储CPU: RK3588SDDR: LPDDR5 8GBNOR: SPI接口 32MB容量SSD: PCIE接口 256GB容量软件版本要求
    发表于 05-23 14:20

    如何实现基于RK3588Android系统Linux系统切换呢

    概述RK3588双系统启动流程如下图uboot根据按键来识别要启动的系统,这里可以使用拨码开关来代替。uboot在加载分区的时根据分区名字来区分加载android或者
    发表于 05-26 10:16

    基于RK3588芯片方案开发ARM PC项目

    天然优势。  瑞芯微RK3588有着丰富的系统支持。早在RK3588发布之初,瑞芯微便成若RK3588会有丰富的系统支持,目前
    发表于 07-27 16:05

    RK3588 SDK编译与固件烧写步骤

    /envsetup.sh  $ lunch rk3588_s-userdebug  $ 。/build.sh-AUCKu -d rk3588
    发表于 08-31 17:45

    RK3588 Android系统编译命令

    rk3588 代码kernel内核版本是5.10,Android 12,编译命令如下:source build/envsetup.shlunch rk3588
    发表于 09-20 16:55

    RK3588 Android 12.0 SDK编译步骤分享

    rk3588sevb1-lp4x-v10.img -j24单独编译uboot$ ./make.sh rk35882、固件烧写升级工具版本:AndroidTool_Release_v2.84USB驱动版本:Driver
    发表于 09-20 17:11

    RK3588J和RK3588是什么关系?

    RK3588J是不是一个开发板的名字,里面的SOC是RK3588?还是RK3588J属于RK3588的子系列?
    发表于 03-13 14:22

    RK3588RK3588S之间的区别是什么

    RK3588RK3588S的区别: RK3588S是RK3588的低配版,其区别类似RK3568跟RK
    发表于 03-10 19:22 2.1w次阅读

    rk3588rk3588s的区别

    rk3588rk3588s的区别 Rockchip是一家专业的半导体公司,成立于2001年,总部位于中国深圳,主要从事集成电路的设计、开发和销售。他们的热门产品RK3588RK3588
    的头像 发表于 08-15 16:44 7768次阅读

    RK3588RK3588S比较哪个好?

    RK3588RK3588S比较哪个好? 随着物联网、人工智能和大数据的快速发展,处理器、芯片等微电子产品的重要性也越来越高。越来越多的人对于处理器的选择变得更加谨慎,因为一个好的处理器在设备的运作
    的头像 发表于 08-15 16:44 6671次阅读

    RK35883588s的区别

    RK35883588s的区别 Rockchip RK3588RK3588s是两种功能强大且广受欢迎的片上系统(SoC)解决
    的头像 发表于 08-15 17:03 1.2w次阅读

    rk3588是armv8吗?rk3588硬件资料

    rk3588是armv8吗?rk3588 硬件资料 RK3588是一款高性能处理器,是Rockchip公司推出的最新芯片。本文将详细介绍RK3588的硬件资料。 首先,我们需要了解一下
    的头像 发表于 08-21 17:32 1789次阅读

    迅为RK3588Linux 系统中使用 NPU

    迅为RK3588Linux 系统中使用 NPU
    的头像 发表于 09-08 14:14 927次阅读
    迅为<b class='flag-5'>RK3588</b>在 <b class='flag-5'>Linux</b> <b class='flag-5'>系统</b>中使用 NPU

    迅为RK3588最小系统板发布

    迅为RK3588最小系统板发布
    的头像 发表于 03-08 15:32 150次阅读
    迅为<b class='flag-5'>RK3588</b>最小<b class='flag-5'>系统</b>板发布