69 lines
1.8 KiB
C
69 lines
1.8 KiB
C
/*
|
|
* Copyright (C) 2015 Hardkernel Co,. Ltd
|
|
* Dongjin Kim <[email protected]>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <asm/errno.h>
|
|
#include <usb/fastboot.h>
|
|
|
|
/* Bootloader Message
|
|
*
|
|
* This structure describes the content of a block in flash
|
|
* that is used for recovery and the bootloader to talk to
|
|
* each other.
|
|
*
|
|
* The command field is updated by linux when it wants to
|
|
* reboot into recovery or to update radio or bootloader firmware.
|
|
* It is also updated by the bootloader when firmware update
|
|
* is complete (to boot into recovery for any final cleanup)
|
|
*
|
|
* The status field is written by the bootloader after the
|
|
* completion of an "update-radio" or "update-hboot" command.
|
|
*
|
|
* The recovery field is only written by linux and used
|
|
* for the system to send a message to recovery or the
|
|
* other way around.
|
|
*/
|
|
struct bootloader_message {
|
|
char command[32];
|
|
char status[32];
|
|
char recovery[1024];
|
|
};
|
|
|
|
static const char *bcb_name = "bcb";
|
|
static const char *bcb_magic = "recovery";
|
|
static struct bootloader_message bcb;
|
|
|
|
int board_get_recovery_message(void)
|
|
{
|
|
block_dev_desc_t *dev_desc;
|
|
fastboot_ptentry *ptn;
|
|
unsigned int offset;
|
|
|
|
dev_desc = mmc_get_dev(0);
|
|
if (NULL == dev_desc)
|
|
return ODROID_REBOOT_CMD_UNKNOWN;
|
|
|
|
ptn = fastboot_flash_find_ptn(bcb_name);
|
|
if (NULL == ptn)
|
|
return ODROID_REBOOT_CMD_UNKNOWN;
|
|
|
|
offset = ptn->start;
|
|
|
|
dev_desc->block_read(dev_desc->dev, offset,
|
|
(sizeof(struct bootloader_message)
|
|
+ (dev_desc->blksz - 1)) / dev_desc->blksz, &bcb);
|
|
|
|
bcb.recovery[strlen(bcb_magic)] = 0;
|
|
if (0 == strncmp(bcb.recovery, bcb_magic, strlen(bcb_magic))) {
|
|
do_format();
|
|
printf("Default Android partition is created...\n");
|
|
return ODROID_REBOOT_CMD_RECOVERY;
|
|
}
|
|
|
|
return ODROID_REBOOT_CMD_UNKNOWN;
|
|
}
|