da30a87b81
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
127 lines
4.0 KiB
C
127 lines
4.0 KiB
C
/****************************************************************************
|
|
* apps/examples/mcuboot/swap_test/version_main.c
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
#include <endian.h>
|
|
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
|
|
#include <bootutil/bootutil_public.h>
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
#define BOOT_HEADER_MAGIC_V1 0x96f3b83d
|
|
#define BOOT_HEADER_SIZE_V1 32
|
|
|
|
/****************************************************************************
|
|
* Private Types
|
|
****************************************************************************/
|
|
|
|
begin_packed_struct struct mcuboot_raw_version_v1_s
|
|
{
|
|
uint8_t major;
|
|
uint8_t minor;
|
|
uint16_t revision;
|
|
uint32_t build_num;
|
|
} end_packed_struct;
|
|
|
|
begin_packed_struct struct mcuboot_raw_header_v1_s
|
|
{
|
|
uint32_t header_magic;
|
|
uint32_t image_load_address;
|
|
uint16_t header_size;
|
|
uint16_t pad;
|
|
uint32_t image_size;
|
|
uint32_t image_flags;
|
|
struct mcuboot_raw_version_v1_s version;
|
|
uint32_t pad2;
|
|
} end_packed_struct;
|
|
|
|
/****************************************************************************
|
|
* Private Functions
|
|
****************************************************************************/
|
|
|
|
static int boot_read_v1_header(uint8_t area_id,
|
|
struct mcuboot_raw_header_v1_s *raw_header)
|
|
{
|
|
const struct flash_area *fa;
|
|
int rc;
|
|
|
|
rc = flash_area_open(area_id, &fa);
|
|
if (rc)
|
|
{
|
|
return rc;
|
|
}
|
|
|
|
rc = flash_area_read(fa, 0, raw_header,
|
|
sizeof(struct mcuboot_raw_header_v1_s));
|
|
flash_area_close(fa);
|
|
if (rc)
|
|
{
|
|
return rc;
|
|
}
|
|
|
|
raw_header->header_magic = le32toh(raw_header->header_magic);
|
|
raw_header->image_load_address = le32toh(raw_header->image_load_address);
|
|
raw_header->header_size = le16toh(raw_header->header_size);
|
|
raw_header->image_size = le32toh(raw_header->image_size);
|
|
raw_header->image_flags = le32toh(raw_header->image_flags);
|
|
raw_header->version.revision = le16toh(raw_header->version.revision);
|
|
raw_header->version.build_num = le32toh(raw_header->version.build_num);
|
|
|
|
if ((raw_header->header_magic != BOOT_HEADER_MAGIC_V1)
|
|
|| (raw_header->header_size < BOOT_HEADER_SIZE_V1))
|
|
{
|
|
return -EIO;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* mcuboot_version_main
|
|
****************************************************************************/
|
|
|
|
int main(int argc, FAR char *argv[])
|
|
{
|
|
int rc;
|
|
struct mcuboot_raw_header_v1_s raw_header;
|
|
|
|
rc = boot_read_v1_header(0, &raw_header);
|
|
if (rc)
|
|
{
|
|
printf("Only header version 1 can be read. Abort!\n");
|
|
return rc;
|
|
}
|
|
|
|
printf("Image version %d.%d.%d.%" PRId32 "\n",
|
|
raw_header.version.major, raw_header.version.minor,
|
|
raw_header.version.revision, raw_header.version.build_num);
|
|
|
|
return 0;
|
|
}
|