aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChandan Uddaraju <chandanu@quicinc.com>2010-01-05 16:32:33 -0800
committerChandan Uddaraju <chandanu@quicinc.com>2010-01-05 16:32:33 -0800
commitde85d3f4ad1e799ff1d290229db71141a64ff09d (patch)
treeda22881afd3a96efea5b2ea676a43f10c3ae3bc5
parent0ec5bb772a349bd1faa911a88c9a15400d696778 (diff)
downloadlk-de85d3f4ad1e799ff1d290229db71141a64ff09d.tar.gz
[target/(msm7627,qsd8250)]: Add support to boot into recovery mode and bootloader fastboot mode
Add recovery partition in page table entry for 7627_surf and 7627_ffa targets. Add code support to boot into recovery mode using the Home_key. Add code support to boot into recovery and bootloader (fastboot) mode using adb shell reboot commands.
-rwxr-xr-xapp/aboot/aboot.c36
-rw-r--r--platform/msm_shared/smem.h2
-rw-r--r--target/init.c5
-rw-r--r--target/msm7627_ffa/init.c22
-rwxr-xr-xtarget/msm7627_ffa/rules.mk2
-rw-r--r--target/msm7627_surf/init.c22
-rw-r--r--target/msm7627_surf/rules.mk2
-rw-r--r--target/msm7630_surf/init.c5
-rw-r--r--target/qsd8250_ffa/init.c17
-rw-r--r--target/qsd8250_ffa/rules.mk2
-rw-r--r--target/qsd8250_surf/init.c17
-rw-r--r--target/qsd8250_surf/rules.mk2
12 files changed, 126 insertions, 8 deletions
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index 2a66fbb6..0060306d 100755
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -48,6 +48,9 @@
#define DEFAULT_CMDLINE "mem=100M console=null";
#define EMMC_BOOT_IMG_HEADER_ADDR 0xFF000
+#define RECOVERY_MODE 0x77665502
+#define FASTBOOT_MODE 0x77665500
+
static const char *emmc_cmdline = " androidboot.emmc=true";
static struct udc_device surf_udc_device = {
@@ -69,8 +72,11 @@ struct atag_ptbl_entry
void platform_uninit_timer(void);
unsigned* target_atag_mem(unsigned* ptr);
unsigned board_machtype(void);
+unsigned check_reboot_mode(void);
int target_is_emmc_boot(void);
+static int boot_into_recovery = 0;
+
static void ptentry_to_tag(unsigned **ptr, struct ptentry *ptn)
{
struct atag_ptbl_entry atag_ptn;
@@ -181,6 +187,7 @@ int boot_linux_from_flash(void)
unsigned offset = 0;
const char *cmdline;
+
if (target_is_emmc_boot()) {
hdr = (struct boot_img_hdr *)EMMC_BOOT_IMG_HEADER_ADDR;
if (memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
@@ -196,10 +203,21 @@ int boot_linux_from_flash(void)
return -1;
}
- ptn = ptable_find(ptable, "boot");
- if (ptn == NULL) {
- dprintf(CRITICAL, "ERROR: No boot partition found\n");
- return -1;
+ if(!boot_into_recovery)
+ {
+ ptn = ptable_find(ptable, "boot");
+ if (ptn == NULL) {
+ dprintf(CRITICAL, "ERROR: No boot partition found\n");
+ return -1;
+ }
+ }
+ else
+ {
+ ptn = ptable_find(ptable, "recovery");
+ if (ptn == NULL) {
+ dprintf(CRITICAL, "ERROR: No recovery partition found\n");
+ return -1;
+ }
}
if (flash_read(ptn, offset, buf, page_size)) {
@@ -364,11 +382,21 @@ void cmd_continue(const char *arg, void *data, unsigned sz)
void aboot_init(const struct app_descriptor *app)
{
+ unsigned reboot_mode = 0;
page_size = flash_page_size();
page_mask = page_size - 1;
+ if (keys_get_state(KEY_HOME) != 0)
+ boot_into_recovery = 1;
if (keys_get_state(KEY_BACK) != 0)
goto fastboot;
+ reboot_mode = check_reboot_mode();
+ if (reboot_mode == RECOVERY_MODE){
+ boot_into_recovery = 1;
+ }else if(reboot_mode == FASTBOOT_MODE){
+ goto fastboot;
+ }
+
boot_linux_from_flash();
dprintf(CRITICAL, "ERROR: Could not do normal boot. Reverting "
"to fastboot mode.\n");
diff --git a/platform/msm_shared/smem.h b/platform/msm_shared/smem.h
index a514f95b..8300b551 100644
--- a/platform/msm_shared/smem.h
+++ b/platform/msm_shared/smem.h
@@ -80,6 +80,8 @@ typedef enum {
SMEM_AARM_PARTITION_TABLE = 9,
+ SMEM_APPS_BOOT_MODE = 106,
+
SMEM_BOARD_INFO_LOCATION = 137,
SMEM_FIRST_VALID_TYPE = SMEM_SPINLOCK_ARRAY,
diff --git a/target/init.c b/target/init.c
index 156284de..67671d49 100644
--- a/target/init.c
+++ b/target/init.c
@@ -46,3 +46,8 @@ __WEAK int target_is_emmc_boot(void)
return 0;
#endif
}
+
+__WEAK unsigned check_reboot_mode(void)
+{
+ return 0;
+}
diff --git a/target/msm7627_ffa/init.c b/target/msm7627_ffa/init.c
index d82ff594..000cb170 100644
--- a/target/msm7627_ffa/init.c
+++ b/target/msm7627_ffa/init.c
@@ -35,6 +35,7 @@
#include <dev/gpio_keypad.h>
#include <lib/ptable.h>
#include <dev/flash.h>
+#include <smem.h>
#define LINUX_MACHTYPE 1007015
@@ -66,6 +67,11 @@ static struct ptentry board_part_list[] = {
},
{
.start = 704,
+ .length = 40 /* 5MB */,
+ .name = "recovery",
+ },
+ {
+ .start = 744,
.length = 720 /* 90MB */,
.name = "userdata",
},
@@ -124,3 +130,19 @@ unsigned board_machtype(void)
{
return LINUX_MACHTYPE;
}
+
+unsigned check_reboot_mode(void)
+{
+ unsigned mode = 0;
+ unsigned int mode_len = sizeof(mode);
+ unsigned smem_status;
+
+ smem_status = smem_read_alloc_entry(SMEM_APPS_BOOT_MODE,
+ &mode, mode_len );
+ if(smem_status)
+ {
+ dprintf(CRITICAL, "ERROR: unable to read shared memory for reboot mode\n");
+ return 0;
+ }
+ return mode;
+}
diff --git a/target/msm7627_ffa/rules.mk b/target/msm7627_ffa/rules.mk
index 955471c4..5dde7bef 100755
--- a/target/msm7627_ffa/rules.mk
+++ b/target/msm7627_ffa/rules.mk
@@ -1,6 +1,6 @@
LOCAL_DIR := $(GET_LOCAL_DIR)
-INCLUDES += -I$(LOCAL_DIR)/include
+INCLUDES += -I$(LOCAL_DIR)/include -I$(LK_TOP_DIR)/platform/msm_shared
PLATFORM := msm7k
diff --git a/target/msm7627_surf/init.c b/target/msm7627_surf/init.c
index 8a57d569..a860e074 100644
--- a/target/msm7627_surf/init.c
+++ b/target/msm7627_surf/init.c
@@ -35,6 +35,7 @@
#include <dev/gpio_keypad.h>
#include <lib/ptable.h>
#include <dev/flash.h>
+#include <smem.h>
#define LINUX_MACHTYPE 1007014
@@ -66,6 +67,11 @@ static struct ptentry board_part_list[] = {
},
{
.start = 704,
+ .length = 40 /* 5MB */,
+ .name = "recovery",
+ },
+ {
+ .start = 744,
.length = 720 /* 90MB */,
.name = "userdata",
},
@@ -124,3 +130,19 @@ unsigned board_machtype(void)
{
return LINUX_MACHTYPE;
}
+
+unsigned check_reboot_mode(void)
+{
+ unsigned mode = 0;
+ unsigned int mode_len = sizeof(mode);
+ unsigned smem_status;
+
+ smem_status = smem_read_alloc_entry(SMEM_APPS_BOOT_MODE,
+ &mode, mode_len );
+ if(smem_status)
+ {
+ dprintf(CRITICAL, "ERROR: unable to read shared memory for reboot mode\n");
+ return 0;
+ }
+ return mode;
+}
diff --git a/target/msm7627_surf/rules.mk b/target/msm7627_surf/rules.mk
index 955471c4..5dde7bef 100644
--- a/target/msm7627_surf/rules.mk
+++ b/target/msm7627_surf/rules.mk
@@ -1,6 +1,6 @@
LOCAL_DIR := $(GET_LOCAL_DIR)
-INCLUDES += -I$(LOCAL_DIR)/include
+INCLUDES += -I$(LOCAL_DIR)/include -I$(LK_TOP_DIR)/platform/msm_shared
PLATFORM := msm7k
diff --git a/target/msm7630_surf/init.c b/target/msm7630_surf/init.c
index 93327189..2ea8294f 100644
--- a/target/msm7630_surf/init.c
+++ b/target/msm7630_surf/init.c
@@ -187,3 +187,8 @@ int target_is_emmc_boot(void)
return emmc_boot;
}
+
+unsigned check_reboot_mode(void)
+{
+ return 0;
+}
diff --git a/target/qsd8250_ffa/init.c b/target/qsd8250_ffa/init.c
index a86ddc76..c3ec4b6e 100644
--- a/target/qsd8250_ffa/init.c
+++ b/target/qsd8250_ffa/init.c
@@ -35,6 +35,7 @@
#include <dev/gpio_keypad.h>
#include <lib/ptable.h>
#include <dev/flash.h>
+#include <smem.h>
#define LINUX_MACHTYPE 1008002
@@ -124,3 +125,19 @@ unsigned board_machtype(void)
{
return LINUX_MACHTYPE;
}
+
+unsigned check_reboot_mode(void)
+{
+ unsigned mode[2] = {0, 0};
+ unsigned int mode_len = sizeof(mode);
+ unsigned smem_status;
+
+ smem_status = smem_read_alloc_entry(SMEM_APPS_BOOT_MODE,
+ &mode, mode_len );
+ if(smem_status)
+ {
+ dprintf(CRITICAL, "ERROR: unable to read shared memory for reboot mode\n");
+ return 0;
+ }
+ return mode[0];
+}
diff --git a/target/qsd8250_ffa/rules.mk b/target/qsd8250_ffa/rules.mk
index fd3f9741..de54dfd6 100644
--- a/target/qsd8250_ffa/rules.mk
+++ b/target/qsd8250_ffa/rules.mk
@@ -1,6 +1,6 @@
LOCAL_DIR := $(GET_LOCAL_DIR)
-INCLUDES += -I$(LOCAL_DIR)/include
+INCLUDES += -I$(LOCAL_DIR)/include -I$(LK_TOP_DIR)/platform/msm_shared
PLATFORM := qsd8k
diff --git a/target/qsd8250_surf/init.c b/target/qsd8250_surf/init.c
index cbfeeaf1..442854b5 100644
--- a/target/qsd8250_surf/init.c
+++ b/target/qsd8250_surf/init.c
@@ -35,6 +35,7 @@
#include <dev/gpio_keypad.h>
#include <lib/ptable.h>
#include <dev/flash.h>
+#include <smem.h>
#define LINUX_MACHTYPE 1008000
@@ -123,3 +124,19 @@ unsigned board_machtype(void)
{
return LINUX_MACHTYPE;
}
+
+unsigned check_reboot_mode(void)
+{
+ unsigned mode[2] = {0, 0};
+ unsigned int mode_len = sizeof(mode);
+ unsigned smem_status;
+
+ smem_status = smem_read_alloc_entry(SMEM_APPS_BOOT_MODE,
+ &mode, mode_len );
+ if(smem_status)
+ {
+ dprintf(CRITICAL, "ERROR: unable to read shared memory for reboot mode\n");
+ return 0;
+ }
+ return mode[0];
+}
diff --git a/target/qsd8250_surf/rules.mk b/target/qsd8250_surf/rules.mk
index fd3f9741..de54dfd6 100644
--- a/target/qsd8250_surf/rules.mk
+++ b/target/qsd8250_surf/rules.mk
@@ -1,6 +1,6 @@
LOCAL_DIR := $(GET_LOCAL_DIR)
-INCLUDES += -I$(LOCAL_DIR)/include
+INCLUDES += -I$(LOCAL_DIR)/include -I$(LK_TOP_DIR)/platform/msm_shared
PLATFORM := qsd8k