New Boot Partition for Dual-Boot

Android support the following boot modes:

  1. reboot loader
  2. reboot recovery

It means that we can also switch the system when dual booting in a diffent way.
Ubuntu booting can be installed in a new independent partition named ramfs instead of the Recovery partition.
So here I describe how to add ramfs boot mode for Ubuntu.

Please add all the patches manually as the locations will differ in every SDK.

Adding the boot mode
Linux kernel patch

diff --git a/arch/arm/mach-rockchip/common.c b/arch/arm/mach-rockchip/common.c
index 510e4da..e91fa64 100755
--- a/arch/arm/mach-rockchip/common.c
+++ b/arch/arm/mach-rockchip/common.c
@@ -264,6 +264,9 @@ void rockchip_restart_get_boot_mode(const char *cmd, u32 *flag, u32 *mode)
                else if (!strcmp(cmd, "charge")) {
                        *flag = SYS_LOADER_REBOOT_FLAG + BOOT_CHARGING;
                        *mode = BOOT_MODE_CHARGE;
+               }else if(!strcmp(cmd, "ramfs")){
+                       *flag = SYS_LOADER_REBOOT_FLAG + BOOT_RAMFS;
+                       *mode = BOOT_MODE_RAMFS;
                }
        } else {
                if (is_panic)
diff --git a/arch/arm/mach-rockchip/loader.h b/arch/arm/mach-rockchip/loader.h
index bf2cd47..819e277 100644
--- a/arch/arm/mach-rockchip/loader.h
+++ b/arch/arm/mach-rockchip/loader.h
@@ -17,6 +17,7 @@ enum {
     BOOT_FASTBOOT,   /* enter fast boot mode */
     BOOT_SECUREBOOT_DISABLE,
     BOOT_CHARGING,   /* enter charge mode */
+    BOOT_RAMFS,
     BOOT_MAX         /* MAX VALID BOOT TYPE.*/
 };

diff --git a/include/linux/rockchip/common.h b/include/linux/rockchip/common.h
index 006d52d..0a10625 100644
--- a/include/linux/rockchip/common.h
+++ b/include/linux/rockchip/common.h
@@ -52,6 +52,7 @@ int rockchip_cpu_disable(unsigned int cpu);
 #define BOOT_MODE_PANIC                        7
 #define BOOT_MODE_WATCHDOG             8
 #define BOOT_MODE_TSADC                        9
+#define BOOT_MODE_RAMFS                      10

 int rockchip_boot_mode(void);
 void __init rockchip_boot_mode_init(u32 flag, u32 mode);
diff --git a/include/uapi/linux/reboot.h b/include/uapi/linux/reboot.h
index 09d056d..28e4c51 100644
--- a/include/uapi/linux/reboot.h
+++ b/include/uapi/linux/reboot.h
@@ -33,6 +33,7 @@
 #define        LINUX_REBOOT_CMD_RESTART2       0xA1B2C3D4
 #define        LINUX_REBOOT_CMD_SW_SUSPEND     0xD000FCE2
 #define        LINUX_REBOOT_CMD_KEXEC          0x45584543
+#define        LINUX_REBOOT_CMD_RESTART_RAMFS  0xEEEEEEEE

diff --git a/kernel/sys.c b/kernel/sys.c
index b1a203d..3147ab5 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -505,6 +505,8 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,

        mutex_lock(&reboot_mutex);
        switch (cmd) {
+       case LINUX_REBOOT_CMD_RESTART_RAMFS:
+               kernel_restart("ramfs");
        case LINUX_REBOOT_CMD_RESTART:
                kernel_restart(NULL);
                break;

[b]U-Boot patch

diff --git a/board/rockchip/common/config.h b/board/rockchip/common/config.h
index 37d287a..9347fe0 100755
--- a/board/rockchip/common/config.h
+++ b/board/rockchip/common/config.h
@@ -188,6 +188,7 @@ enum {
        BOOT_FASTBOOT,
        BOOT_SECUREBOOT_DISABLE,
        BOOT_CHARGING,
+       BOOT_RAMFS,
        BOOT_MAX         /* MAX VALID BOOT TYPE.*/
 };

diff --git a/board/rockchip/common/rkboot/fastboot.c b/board/rockchip/common/rkboot/fastboot.c
index 4bb8c28..c3f47f0 100755
--- a/board/rockchip/common/rkboot/fastboot.c
+++ b/board/rockchip/common/rkboot/fastboot.c
@@ -120,6 +120,10 @@ enum fbt_reboot_type board_fbt_get_reboot_type(void)
                        case BOOT_CHARGING:
                                frt = FASTBOOT_REBOOT_CHARGE;
                                break;
+                       case BOOT_RAMFS:
+                               frt = FASTBOOT_REBOOT_RAMFS;
+                               break;
+
                        default:
                                printf("unsupport rk boot type %d\n", reboot_mode);
                                break;
@@ -479,6 +483,12 @@ void board_fbt_preboot(void)
                board_fbt_request_start_fastboot();
        }
 #endif
+       else if (frt == FASTBOOT_REBOOT_RAMFS) {
+               #ifdef CONFIG_CMD_BOOTRK
+               char *const boot_cmd[] = {"bootrk", "ramfs"};
+               do_bootrk(NULL, 0, ARRAY_SIZE(boot_cmd), boot_cmd);
+               #endif
+       }
        else {
                FBTDBG("\n%s: check misc command.\n", __func__);
                /* unknown reboot cause (typically because of a cold boot).
diff --git a/include/fastboot.h b/include/fastboot.h
index 7b8508b..d6b8f1f 100755
--- a/include/fastboot.h
+++ b/include/fastboot.h
@@ -238,6 +238,7 @@ enum fbt_reboot_type {
        FASTBOOT_REBOOT_RECOVERY_WIPE_DATA,     /* recovery and wipe data */
        FASTBOOT_REBOOT_FASTBOOT,               /* android fastboot */
        FASTBOOT_REBOOT_CHARGE,                 /* charge */
+       FASTBOOT_REBOOT_RAMFS,
 };

Adding the new boot partition

diff --git a/board/rockchip/common/rkboot/fastboot.c b/board/rockchip/common/rkboot/
index f77fa2c..39e4b69 100755
--- a/board/rockchip/common/rkboot/fastboot.c
+++ b/board/rockchip/common/rkboot/fastboot.c
@@ -218,6 +218,10 @@ void board_fbt_boot_failed(const char* boot)
                printf("try to start backup\n");
                char *const boot_cmd[] = {"bootrk", BACKUP_NAME};
                do_bootrk(NULL, 0, ARRAY_SIZE(boot_cmd), boot_cmd);
+       } else if (!memcmp(BACKUP_NAME, boot, sizeof(BACKUP_NAME))) {
+               printf("try to start ramfs\n");
+               char *const boot_cmd[] = {"bootrk", RAMFS_NAME};
+               do_bootrk(NULL, 0, ARRAY_SIZE(boot_cmd), boot_cmd);
        }
 #endif
        printf("try to start rockusb\n");
diff --git a/board/rockchip/common/rkloader/rkimage.h b/board/rockchip/common/rkload
index 812055f..a2d2855 100755
--- a/board/rockchip/common/rkloader/rkimage.h
+++ b/board/rockchip/common/rkloader/rkimage.h
@@ -144,6 +144,7 @@ typedef struct tag_second_loader_hdr
 #define RESOURCE_NAME   "resource"
 #define LOGO_NAME       "logo"
 #define FACTORY_NAME    "factory"
+#define RAMFS_NAME      "ramfs"

 int rkimage_load_image(rk_boot_img_hdr *hdr, const disk_partition_t *boot_ptn, \

Then also add the ramfs partition to your partition file
Please use your own partition file, this is just an example

CMDLINE: console=ttyS2 root=LABEL=linuxroot rw rootfstype=ext4 init=/sbin/init mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),0x00008000@0x00006000(resource),0x00010000@0x0000E000(ramfs),-@0x0001E000(linuxroot)

Now you can flash the linux-boot.img image to ramfs partition instead of Recovery partition and still keep the Android Recovery or flash TWRP Recovery to it while still dual-booting
Will also need to add ramfs partition info to the first screen of AndroidTool v2.35

I hope Firefly Team will implement this into their next dual-boot firmware to have an extra partition for dual-booting.

[/b]

Wow, that’s a triple booting :slight_smile:

We currently have a solution of extracting Android recovery image flashed in “backup” partition and booting it, when the Linux initrd in “recovery” partition checks that no special flag is resident in “misc” partition.

Your solution is more complete. We’ll evaluate it.

And what’re the commands of switch OS between Android and Linux?

busybee Posted at 3/7/2016 15:02
And what’re the commands of switch OS between Android and Linux?

From Android - reboot ramfs
From Linux - reboot android
No special scripts are needed to change misc.img to boot to another partition.
As easy as that.
Can also put into a script if needed then it will look like eg. reboot.sh script for Android:

#!/bin/sh

Reboot --ramfs $@

Then something like that can also be put on Firefly power menu to boot to Linux.
If turned off from Linux and device turned on again will automatically boot to Android again since misc.img is empty. But can change the misc.img also if needed to have extra string instead of ‘recovery’ maybe then ‘ramfs’ or something so it automatically boots to Linux like Firefly is currently doing to make it permanent if needed.

When Marshmallow firmware is released for Firefly then people can also install TWRP recovery and flash Xposed framework that don’t currently work on Lollipop firmware then 2 partitions - recovery, and ramfs will be needed for users.

The content is awesome; I’ll like it right now. Strengthen your IT expertise with free New C-THR95-2505 exam experience. Good luck and best wishes!

Wollen Sie den Plan machen, dass Sie AAPC CPB Zertifizierungsprüfung ablegen, um Ihre Fähigkeit zu entwickeln. Wenn Sie AAPC CPB Prüfung ablegen, ob Sie die geeigneten Lernhilfe finden? Und welche Unterlage sind wertvoll? Haben Sie AAPC CPB Dumps gewählt? Wenn ja, sorgen Sie sich bitte nicht um den Misserfolg.

I’m truly grateful for your article, it really made an impression. Here are the Download PCEP-30-02 free dumps materials, free of charge—best of luck!