summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhang Jiejing <jiejing.zhang@freescale.com>2012-05-14 14:50:42 +0800
committerJustin Waters <justin.waters@timesys.com>2012-09-12 11:05:50 -0400
commitab381ac8d3a587dd0e35d53b4a78b38bdf4b96a6 (patch)
treeaade2b5a946115f3d965dc615174edc6eb4a7e10
parent8c13dd74ae860c3176d38ca8da638931431c1e14 (diff)
ENGR00209059 android: refine fastboot and recovery support.
1. add check asrc register to enter recovery mode, rather then check the file. 2. fix the boot.img can not fastboot flash function. 3. consolidate and cleanup fastboot code. 4. clean up many build warnning message. Signed-off-by: Zhang Jiejing <jiejing.zhang@freescale.com>
-rw-r--r--board/freescale/common/recovery.h4
-rw-r--r--board/freescale/mx6q_sabrelite/mx6q_sabrelite.c79
-rw-r--r--board/freescale/mx6q_sabresd/mx6q_sabresd.c68
-rw-r--r--common/cmd_fastboot.c5
-rw-r--r--cpu/arm_cortexa8/mx6/generic.c44
-rw-r--r--drivers/fastboot/fastboot.c88
-rw-r--r--drivers/usb/gadget/imx_udc.c4
-rw-r--r--include/fastboot.h6
-rw-r--r--include/usb/imx_udc.h5
-rw-r--r--lib_arm/board.c3
10 files changed, 115 insertions, 191 deletions
diff --git a/board/freescale/common/recovery.h b/board/freescale/common/recovery.h
index f3a47b81ad..5dde01df39 100644
--- a/board/freescale/common/recovery.h
+++ b/board/freescale/common/recovery.h
@@ -1,7 +1,7 @@
/*
* Android Recovery supported header file
*
- * Copyright (C) 2010 Freescale Semiconductor.
+ * Copyright (C) 2010-2012 Freescale Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -27,4 +27,6 @@ struct reco_envs {
char *args;
};
+int check_and_clean_recovery_flag(void);
+
#endif
diff --git a/board/freescale/mx6q_sabrelite/mx6q_sabrelite.c b/board/freescale/mx6q_sabrelite/mx6q_sabrelite.c
index c9de1d38c0..09f34dd524 100644
--- a/board/freescale/mx6q_sabrelite/mx6q_sabrelite.c
+++ b/board/freescale/mx6q_sabrelite/mx6q_sabrelite.c
@@ -492,84 +492,11 @@ struct reco_envs supported_reco_envs[BOOT_DEV_NUM] = {
int check_recovery_cmd_file(void)
{
- disk_partition_t info;
int button_pressed = 0;
- ulong part_length;
- int filelen = 0;
- char *env;
+ int recovery_mode = 0;
u32 reg;
- int i;
-
- /* For test only */
- /* When detecting android_recovery_switch,
- * enter recovery mode directly */
- env = getenv("android_recovery_switch");
- if (!strcmp(env, "1")) {
- printf("Env recovery detected!\nEnter recovery mode!\n");
- return 1;
- }
-
- printf("Checking for recovery command file...\n");
- switch (get_boot_device()) {
- case MMC_BOOT:
- case SD_BOOT:
- case SPI_NOR_BOOT:
- case I2C_BOOT:
- {
- for (i = 0; i < 3; i++) {
- block_dev_desc_t *dev_desc = NULL;
- struct mmc *mmc = find_mmc_device(i);
-
- dev_desc = get_dev("mmc", i);
-
- if (NULL == dev_desc) {
- printf("** Block device MMC %d not supported\n", i);
- continue;
- }
-
- mmc_init(mmc);
-
- if (get_partition_info(dev_desc,
- CONFIG_ANDROID_CACHE_PARTITION_MMC,
- &info)) {
- printf("** Bad partition %d **\n",
- CONFIG_ANDROID_CACHE_PARTITION_MMC);
- continue;
- }
-
- part_length = ext2fs_set_blk_dev(dev_desc,
- CONFIG_ANDROID_CACHE_PARTITION_MMC);
- if (part_length == 0) {
- printf("** Bad partition - mmc %d:%d **\n", i,
- CONFIG_ANDROID_CACHE_PARTITION_MMC);
- ext2fs_close();
- continue;
- }
-
- if (!ext2fs_mount(part_length)) {
- printf("** Bad ext2 partition or "
- "disk - mmc %d:%d **\n",
- i, CONFIG_ANDROID_CACHE_PARTITION_MMC);
- ext2fs_close();
- continue;
- }
-
- filelen = ext2fs_open(CONFIG_ANDROID_RECOVERY_CMD_FILE);
-
- ext2fs_close();
- break;
- }
- }
- break;
- case NAND_BOOT:
- return 0;
- break;
- case UNKNOWN_BOOT:
- default:
- return 0;
- break;
- }
+ recovery_mode = check_and_clean_recovery_flag();
/* Check Recovery Combo Button press or not. */
mxc_iomux_v3_setup_pad(MX6Q_PAD_GPIO_19__GPIO_4_5);
@@ -582,7 +509,7 @@ int check_recovery_cmd_file(void)
printf("Recovery key pressed\n");
}
- return (filelen > 0 || button_pressed);
+ return recovery_mode || button_pressed;
}
#endif
diff --git a/board/freescale/mx6q_sabresd/mx6q_sabresd.c b/board/freescale/mx6q_sabresd/mx6q_sabresd.c
index d785fe2fce..2af4f6ff85 100644
--- a/board/freescale/mx6q_sabresd/mx6q_sabresd.c
+++ b/board/freescale/mx6q_sabresd/mx6q_sabresd.c
@@ -678,7 +678,6 @@ int i2c_bus_recovery(void)
void setup_pmic_voltages(void)
{
unsigned char value = 0 ;
- unsigned int val = 0;
i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
if (!i2c_probe(0x8)) {
if (i2c_read(0x8, 0, 1, &value, 1))
@@ -1229,72 +1228,11 @@ struct reco_envs supported_reco_envs[BOOT_DEV_NUM] = {
int check_recovery_cmd_file(void)
{
- disk_partition_t info;
int button_pressed = 0;
- ulong part_length;
- int filelen = 0;
+ int recovery_mode = 0;
u32 reg;
- int i = 0;
-
- printf("Checking for recovery command file...\n");
- switch (get_boot_device()) {
- case MMC_BOOT:
- case SD_BOOT:
- case SPI_NOR_BOOT:
- case I2C_BOOT:
- {
- block_dev_desc_t *dev_desc = NULL;
- struct mmc *mmc = find_mmc_device(CONFIG_ANDROID_MAIN_MMC_BUS);
-
- dev_desc = get_dev("mmc", CONFIG_ANDROID_MAIN_MMC_BUS);
-
- if (NULL == dev_desc) {
- printf("** Block device MMC %d not supported\n", i);
- break;
- }
-
- mmc_init(mmc);
-
- if (get_partition_info(dev_desc,
- CONFIG_ANDROID_CACHE_PARTITION_MMC,
- &info)) {
- printf("** Bad partition %d **\n",
- CONFIG_ANDROID_CACHE_PARTITION_MMC);
- break;
- }
-
- part_length = ext2fs_set_blk_dev(dev_desc,
- CONFIG_ANDROID_CACHE_PARTITION_MMC);
- if (part_length == 0) {
- printf("** Bad partition - mmc %d:%d **\n", i,
- CONFIG_ANDROID_CACHE_PARTITION_MMC);
- ext2fs_close();
- break;
- }
-
- if (!ext2fs_mount(part_length)) {
- printf("** Bad ext2 partition or "
- "disk - mmc %d:%d **\n",
- i, CONFIG_ANDROID_CACHE_PARTITION_MMC);
- ext2fs_close();
- break;
- }
-
- filelen = ext2fs_open(CONFIG_ANDROID_RECOVERY_CMD_FILE);
-
- ext2fs_close();
- break;
- }
- break;
- case NAND_BOOT:
- return 0;
- break;
- case UNKNOWN_BOOT:
- default:
- return 0;
- break;
- }
+ recovery_mode = check_and_clean_recovery_flag();
/* Check Recovery Combo Button press or not. */
#if defined CONFIG_MX6Q
@@ -1311,7 +1249,7 @@ int check_recovery_cmd_file(void)
printf("Recovery key pressed\n");
}
- return (filelen > 0 || button_pressed);
+ return recovery_mode || button_pressed;
}
#endif
diff --git a/common/cmd_fastboot.c b/common/cmd_fastboot.c
index eb91763a2d..c28f6dfd63 100644
--- a/common/cmd_fastboot.c
+++ b/common/cmd_fastboot.c
@@ -1014,15 +1014,14 @@ static int rx_handler (const unsigned char *buffer, unsigned int buffer_size)
(CFG_FASTBOOT_MKBOOTIMAGE_PAGE_SIZE <
download_bytes)) {
char start[32];
- char *go[3] = { "go", NULL, NULL, };
char *booti_args[4] = {"booti", NULL, "boot", NULL};
/*
* Use this later to determine if a command line was passed
* for the kernel.
*/
- struct fastboot_boot_img_hdr *fb_hdr =
- (struct fastboot_boot_img_hdr *) interface.transfer_buffer;
+ /* struct fastboot_boot_img_hdr *fb_hdr = */
+ /* (struct fastboot_boot_img_hdr *) interface.transfer_buffer; */
/* Skip the mkbootimage header */
/* image_header_t *hdr = */
diff --git a/cpu/arm_cortexa8/mx6/generic.c b/cpu/arm_cortexa8/mx6/generic.c
index 9294be0a41..bcbaf640cb 100644
--- a/cpu/arm_cortexa8/mx6/generic.c
+++ b/cpu/arm_cortexa8/mx6/generic.c
@@ -1101,6 +1101,50 @@ void set_usboh3_clk(void)
}
#endif
+#ifdef CONFIG_ANDROID_RECOVERY
+#define ANDROID_RECOVERY_BOOT (1 << 7)
+/* check if the recovery bit is set by kernel, it can be set by kernel
+ * issue a command '# reboot recovery' */
+int check_and_clean_recovery_flag()
+{
+ int flag_set = 0;
+ u32 reg;
+ reg = readl(SRC_BASE_ADDR + SRC_GPR10);
+
+ flag_set = !!(reg & ANDROID_RECOVERY_BOOT);
+
+ /* clean it in case looping infinite here.... */
+ if (flag_set) {
+ reg &= ~ANDROID_RECOVERY_BOOT;
+ writel(reg, SRC_BASE_ADDR + SRC_GPR10);
+ }
+
+ return flag_set;
+}
+#endif
+
+#ifdef CONFIG_FASTBOOT
+#define ANDROID_FASTBOOT_BOOT (1 << 8)
+/* check if the recovery bit is set by kernel, it can be set by kernel
+ * issue a command '# reboot fastboot' */
+int fastboot_check_and_clean_flag()
+{
+ int flag_set = 0;
+ u32 reg;
+ reg = readl(SRC_BASE_ADDR + SRC_GPR10);
+
+ flag_set = !!(reg & ANDROID_FASTBOOT_BOOT);
+
+ /* clean it in case looping infinite here.... */
+ if (flag_set) {
+ reg &= ~ANDROID_FASTBOOT_BOOT;
+ writel(reg, SRC_BASE_ADDR + SRC_GPR10);
+ }
+
+ return flag_set;
+}
+#endif
+
#ifdef CONFIG_CMD_IMX_DOWNLOAD_MODE
#define PERSIST_WATCHDOG_RESET_BOOT (0x10000000)
/*BOOT_CFG1[7..4] = 0x3 Boot from Serial ROM (I2C/SPI)*/
diff --git a/drivers/fastboot/fastboot.c b/drivers/fastboot/fastboot.c
index e405a76705..3558ab5642 100644
--- a/drivers/fastboot/fastboot.c
+++ b/drivers/fastboot/fastboot.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
+ * Copyright (C) 2010-2012 Freescale Semiconductor, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -255,8 +255,6 @@ static int get_mmc_no(char *env_str)
*/
int fastboot_init(struct cmd_fastboot_interface *interface)
{
- char *fastboot_env;
-
printf("fastboot is in init......");
fastboot_interface = interface;
fastboot_interface->product_name = CONFIG_FASTBOOT_PRODUCT_NAME_STR;
@@ -281,6 +279,34 @@ int fastboot_init(struct cmd_fastboot_interface *interface)
}
#ifdef CONFIG_FASTBOOT_STORAGE_EMMC_SATA
+/**
+ @mmc_dos_partition_index: the partition index in mbr.
+ @mmc_partition_index: the boot partition or user partition index,
+ not related to the partition table.
+ */
+static int setup_ptable_mmc_partition(int ptable_index,
+ int mmc_dos_partition_index,
+ int mmc_partition_index,
+ const char *name,
+ block_dev_desc_t *dev_desc,
+ fastboot_ptentry *ptable)
+{
+ disk_partition_t info;
+ strcpy(ptable[ptable_index].name, name);
+
+ if (get_partition_info(dev_desc,
+ mmc_dos_partition_index, &info)) {
+ printf("Bad partition index:%d for partition:%s\n",
+ mmc_dos_partition_index, name);
+ return -1;
+ } else {
+ ptable[ptable_index].start = info.start;
+ ptable[ptable_index].length = info.size;
+ ptable[ptable_index].partition_id = mmc_partition_index;
+ }
+ return 0;
+}
+
static int fastboot_init_mmc_sata_ptable(void)
{
int i, sata_device_no;
@@ -289,7 +315,6 @@ static int fastboot_init_mmc_sata_ptable(void)
* default is no partition, for emmc default user part, except emmc*/
struct mmc *mmc;
block_dev_desc_t *dev_desc;
- disk_partition_t info;
char *fastboot_env;
fastboot_ptentry ptable[PTN_RECOVERY_INDEX + 1];
@@ -353,43 +378,18 @@ static int fastboot_init_mmc_sata_ptable(void)
ptable[PTN_BOOTLOADER_INDEX].length =
ANDROID_BOOTLOADER_SIZE / dev_desc->blksz;
ptable[PTN_BOOTLOADER_INDEX].partition_id = boot_partition;
- /* kernel */
- strcpy(ptable[PTN_KERNEL_INDEX].name, "kernel");
- ptable[PTN_KERNEL_INDEX].start =
- ANDROID_KERNEL_OFFSET / dev_desc->blksz;
- ptable[PTN_KERNEL_INDEX].length =
- ANDROID_KERNEL_SIZE / dev_desc->blksz;
- ptable[PTN_KERNEL_INDEX].partition_id = user_partition;
- /* uramdisk */
- strcpy(ptable[PTN_URAMDISK_INDEX].name, "uramdisk");
- ptable[PTN_URAMDISK_INDEX].start =
- ANDROID_URAMDISK_OFFSET / dev_desc->blksz;
- ptable[PTN_URAMDISK_INDEX].length =
- ANDROID_URAMDISK_SIZE / dev_desc->blksz;
- ptable[PTN_URAMDISK_INDEX].partition_id = user_partition;
-
- /* system partition */
- strcpy(ptable[PTN_SYSTEM_INDEX].name, "system");
- if (get_partition_info(dev_desc,
- CONFIG_ANDROID_SYSTEM_PARTITION_MMC, &info))
- printf("Bad partition index:%d\n",
- CONFIG_ANDROID_SYSTEM_PARTITION_MMC);
- else {
- ptable[PTN_SYSTEM_INDEX].start = info.start;
- ptable[PTN_SYSTEM_INDEX].length = info.size;
- ptable[PTN_SYSTEM_INDEX].partition_id = user_partition;
- }
- /* recovery partition */
- strcpy(ptable[PTN_RECOVERY_INDEX].name, "recovery");
- if (get_partition_info(dev_desc,
- CONFIG_ANDROID_RECOVERY_PARTITION_MMC, &info))
- printf("Bad partition index:%d\n",
- CONFIG_ANDROID_RECOVERY_PARTITION_MMC);
- else {
- ptable[PTN_RECOVERY_INDEX].start = info.start;
- ptable[PTN_RECOVERY_INDEX].length = info.size;
- ptable[PTN_RECOVERY_INDEX].partition_id = user_partition;
- }
+
+ setup_ptable_mmc_partition(PTN_KERNEL_INDEX,
+ CONFIG_ANDROID_BOOT_PARTITION_MMC,
+ user_partition, "boot", dev_desc, ptable);
+ setup_ptable_mmc_partition(PTN_RECOVERY_INDEX,
+ CONFIG_ANDROID_RECOVERY_PARTITION_MMC,
+ user_partition,
+ "recovery", dev_desc, ptable);
+ setup_ptable_mmc_partition(PTN_SYSTEM_INDEX,
+ CONFIG_ANDROID_SYSTEM_PARTITION_MMC,
+ user_partition,
+ "system", dev_desc, ptable);
for (i = 0; i <= PTN_RECOVERY_INDEX; i++)
fastboot_flash_add_ptn(&ptable[i]);
@@ -771,3 +771,9 @@ int fastboot_cdc_setup(struct usb_device_request *request, struct urb *urb)
return 0;
}
+/* export to lib_arm/board.c */
+void check_fastboot_mode(void)
+{
+ if (fastboot_check_and_clean_flag())
+ do_fastboot(NULL, 0, 0, 0);
+}
diff --git a/drivers/usb/gadget/imx_udc.c b/drivers/usb/gadget/imx_udc.c
index b3f4008962..7745760941 100644
--- a/drivers/usb/gadget/imx_udc.c
+++ b/drivers/usb/gadget/imx_udc.c
@@ -297,7 +297,7 @@ static int mxc_ep_xfer_is_working(mxc_ep_t *ep, u32 in)
temp = readl(USB_USBCMD);
writel(temp|USB_CMD_ATDTW, USB_USBCMD);
tstat = readl(USB_ENDPTSTAT) & bitmask;
- } while (!readl(USB_USBCMD) & USB_CMD_ATDTW);
+ } while (!(readl(USB_USBCMD) & USB_CMD_ATDTW));
writel(temp & (~USB_CMD_ATDTW), USB_USBCMD);
if (tstat)
@@ -542,7 +542,7 @@ static void mxc_udc_read_setup_pkt(setup_packet *s)
writel(temp, USB_USBCMD);
memcpy((void *)s,
(void *)mxc_udc.mxc_ep[0].ep_qh->setup_data, 8);
- } while (!readl(USB_USBCMD) & USB_CMD_SUTW);
+ } while (!(readl(USB_USBCMD) & USB_CMD_SUTW));
DBG("handle_setup s.type=%x req=%x len=%x\n",
s->bmRequestType, s->bRequest, s->wLength);
diff --git a/include/fastboot.h b/include/fastboot.h
index b0bcaef3b3..dfca793281 100644
--- a/include/fastboot.h
+++ b/include/fastboot.h
@@ -3,7 +3,7 @@
* Windriver, <www.windriver.com>
* Tom Rix <Tom.Rix@windriver.com>
*
- * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
+ * Copyright (C) 2010-2012 Freescale Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -326,6 +326,9 @@ int fastboot_flash_read_ext(fastboot_ptentry *ptn,
int fastboot_flash_write(fastboot_ptentry *ptn, unsigned extra_per_page,
const void *data, unsigned bytes);
+/* Check the board special boot mode reboot to fastboot mode. */
+int fastboot_check_and_clean_flag(void);
+int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
#else
@@ -350,6 +353,7 @@ int fastboot_flash_write(fastboot_ptentry *ptn, unsigned extra_per_page,
#define fastboot_flash_read_ext(a, b, c, d, e) 0
#define fastboot_flash_read(a, b, c, d, e) 0
#define fastboot_flash_write(a, b, c, d) 0
+#define do_fastboot(a, b, c, d) 0
#endif /* CONFIG_FASTBOOT */
#endif /* FASTBOOT_H */
diff --git a/include/usb/imx_udc.h b/include/usb/imx_udc.h
index ca751ffe10..4e89d688b5 100644
--- a/include/usb/imx_udc.h
+++ b/include/usb/imx_udc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
+ * Copyright (C) 2010-2012 Freescale Semiconductor, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -483,7 +483,8 @@ void udc_setup_ep(struct usb_device_instance *device,
int udc_endpoint_write(struct usb_endpoint_instance *epi);
void udc_irq(void);
void usb_shutdown(void);
-
+void mxc_udc_rxqueue_update(u8 ep, u32 len);
int is_usb_disconnected(void);
+void reset_usb_phy1();
#endif
diff --git a/lib_arm/board.c b/lib_arm/board.c
index d97d37bb2b..a9b87b5d9c 100644
--- a/lib_arm/board.c
+++ b/lib_arm/board.c
@@ -483,6 +483,9 @@ extern void davinci_eth_set_mac_addr (const u_int8_t *addr);
reset_phy();
#endif
#endif
+#ifdef CONFIG_FASTBOOT
+ check_fastboot_mode();
+#endif
/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;) {
main_loop ();