diff options
author | Chandan Uddaraju <chandanu@quicinc.com> | 2010-01-05 16:32:33 -0800 |
---|---|---|
committer | Chandan Uddaraju <chandanu@quicinc.com> | 2010-01-05 16:32:33 -0800 |
commit | de85d3f4ad1e799ff1d290229db71141a64ff09d (patch) | |
tree | da22881afd3a96efea5b2ea676a43f10c3ae3bc5 | |
parent | 0ec5bb772a349bd1faa911a88c9a15400d696778 (diff) | |
download | lk-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-x | app/aboot/aboot.c | 36 | ||||
-rw-r--r-- | platform/msm_shared/smem.h | 2 | ||||
-rw-r--r-- | target/init.c | 5 | ||||
-rw-r--r-- | target/msm7627_ffa/init.c | 22 | ||||
-rwxr-xr-x | target/msm7627_ffa/rules.mk | 2 | ||||
-rw-r--r-- | target/msm7627_surf/init.c | 22 | ||||
-rw-r--r-- | target/msm7627_surf/rules.mk | 2 | ||||
-rw-r--r-- | target/msm7630_surf/init.c | 5 | ||||
-rw-r--r-- | target/qsd8250_ffa/init.c | 17 | ||||
-rw-r--r-- | target/qsd8250_ffa/rules.mk | 2 | ||||
-rw-r--r-- | target/qsd8250_surf/init.c | 17 | ||||
-rw-r--r-- | target/qsd8250_surf/rules.mk | 2 |
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 |