140 lines
4.4 KiB
C
140 lines
4.4 KiB
C
/*
|
||
* Copyright (C) 2008 The Android Open Source Project
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
|
||
#ifndef _RECOVERY_BOOTLOADER_H
|
||
#define _RECOVERY_BOOTLOADER_H
|
||
|
||
#include "common.h"
|
||
|
||
static const int BOOTLOADER_MESSAGE_OFFSET_IN_MISC = 16 * 1024;
|
||
#define MISC_OFFSET 2048 //A,B 结构体在偏移2K 的位置
|
||
#define MISC_OFFSET_CMDLINE 6144 //擦除命令,在偏移4K 的位置,配合挂载脚本使用
|
||
#define MISC_OFFSET_CUSTOM (10 * 1024) //CUSTOM, 8K (10K), length 1K
|
||
|
||
#define MISC_PAGES_AB 2 // A,B 结构体存在 2 PAGE内
|
||
#define MISC_COMMAND_PAGE_AB 1 // A,B 结构体存在 1 PAGE处,即2k
|
||
|
||
#define AB_SLOT_NUM 2
|
||
|
||
/* Magic for the A/B struct when serialized. */
|
||
#define AVB_AB_MAGIC "\0AB0"
|
||
#define AVB_AB_MAGIC_LEN 4
|
||
|
||
/* Versioning for the on-disk A/B metadata - keep in sync with avbtool. */
|
||
#define AVB_AB_MAJOR_VERSION 1
|
||
#define AVB_AB_MINOR_VERSION 0
|
||
|
||
/* Size of AvbABData struct. */
|
||
#define AVB_AB_DATA_SIZE 32
|
||
|
||
/* Maximum values for slot data */
|
||
#define AVB_AB_MAX_PRIORITY 15
|
||
#define AVB_AB_MAX_TRIES_REMAINING 7
|
||
|
||
#define CMD_WIPE_USERDATA "cmd_wipe_userdata"
|
||
|
||
/* 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.
|
||
*
|
||
* The systemFlag field is used for the system to send a message to recovery.
|
||
*/
|
||
struct bootloader_message {
|
||
char command[32];
|
||
char status[32];
|
||
char recovery[768];
|
||
char needupdate[4];
|
||
char systemFlag[252];
|
||
};
|
||
|
||
/* Read and write the bootloader command from the "misc" partition.
|
||
* These return zero on success.
|
||
*/
|
||
int get_bootloader_message(struct bootloader_message *out);
|
||
int set_bootloader_message(const struct bootloader_message *in);
|
||
|
||
typedef struct AvbABSlotData {
|
||
/* Slot priority. Valid values range from 0 to AVB_AB_MAX_PRIORITY,
|
||
* both inclusive with 1 being the lowest and AVB_AB_MAX_PRIORITY
|
||
* being the highest. The special value 0 is used to indicate the
|
||
* slot is unbootable.
|
||
*/
|
||
unsigned char priority;//0,14,15
|
||
|
||
/* Number of times left attempting to boot this slot ranging from 0
|
||
* to AVB_AB_MAX_TRIES_REMAINING.
|
||
*/
|
||
unsigned char tries_remaining;//7--,成功启动,设为0
|
||
|
||
/* Non-zero if this slot has booted successfully, 0 otherwise. */
|
||
unsigned char successful_boot;//0,1
|
||
|
||
/* Reserved for future use. */
|
||
unsigned char reserved[1];
|
||
} AvbABSlotData;
|
||
|
||
/* Struct used for recording A/B metadata.
|
||
*
|
||
* When serialized, data is stored in network byte-order.
|
||
*/
|
||
typedef struct AvbABData {
|
||
/* Magic number used for identification - see AVB_AB_MAGIC. */
|
||
unsigned char magic[AVB_AB_MAGIC_LEN];
|
||
|
||
/* Version of on-disk struct - see AVB_AB_{MAJOR,MINOR}_VERSION. */
|
||
unsigned char version_major; //AVB_AB_MAJOR_VERSION
|
||
unsigned char version_minor; //AVB_AB_MINOR_VERSION
|
||
|
||
/* Padding to ensure |slots| field start eight bytes in. */
|
||
unsigned char reserved1[2];
|
||
|
||
/* Per-slot metadata. */
|
||
AvbABSlotData slots[2];
|
||
|
||
/* Reserved for future use. */
|
||
unsigned char last_boot;//默认a,上一次成功启动slot的标志位,0-->a,1-->b
|
||
unsigned char reserved2[11];
|
||
|
||
/* CRC32 of all 28 bytes preceding this field. */
|
||
unsigned int crc32;
|
||
} AvbABData;
|
||
|
||
int setSlotActivity();
|
||
int setSlotSucceed();
|
||
void miscDisplay() ;
|
||
int wipe_userdata(int auto_reboot);
|
||
int writeCustomMiscCmdline(void);
|
||
int readCustomMiscCmdline(void);
|
||
int cleanCustomMiscCmdline(void);
|
||
|
||
//bool wipe_userdata(bool auto_reboot);
|
||
|
||
#endif
|