Commit 7bcf9862 authored by Gustavo Henrique Nihei's avatar Gustavo Henrique Nihei Committed by Fabio Utzig
Browse files

boot: Add support for the Apache NuttX RTOS

parent 78e4441b
Loading
Loading
Loading
Loading
+422 −0
Original line number Diff line number Diff line
/****************************************************************************
 * boot/nuttx/include/flash_map_backend/flash_map_backend.h
 *
 * Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd.
 *
 * 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 __BOOT_NUTTX_INCLUDE_FLASH_MAP_BACKEND_FLASH_MAP_BACKEND_H
#define __BOOT_NUTTX_INCLUDE_FLASH_MAP_BACKEND_FLASH_MAP_BACKEND_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <inttypes.h>

/****************************************************************************
 * Public Types
 ****************************************************************************/

/* Structure describing a flash area. */

struct flash_area
{
  /* MCUboot-API fields */

  uint8_t     fa_id;         /* The slot/scratch ID */
  uint8_t     fa_device_id;  /* The device ID (usually there's only one) */
  uint16_t    pad16;         /* Padding */
  uint32_t    fa_off;        /* The flash offset from the beginning */
  uint32_t    fa_size;       /* The size of this sector */

  /* NuttX implementation-specific fields */

  const char *fa_mtd_path;   /* Path for the MTD partition */
};

/* Structure describing a sector within a flash area. */

struct flash_sector
{
  /* Offset of this sector, from the start of its flash area (not device). */

  uint32_t fs_off;

  /* Size of this sector, in bytes. */

  uint32_t fs_size;
};

/****************************************************************************
 * Inline Functions
 ****************************************************************************/

/****************************************************************************
 * Name: flash_area_get_id
 *
 * Description:
 *   Obtain the ID of a given flash area.
 *
 * Input Parameters:
 *   fa - Flash area.
 *
 * Returned Value:
 *   The ID of the requested flash area.
 *
 ****************************************************************************/

static inline uint8_t flash_area_get_id(const struct flash_area *fa)
{
  return fa->fa_id;
}

/****************************************************************************
 * Name: flash_area_get_device_id
 *
 * Description:
 *   Obtain the ID of the device in which a given flash area resides on.
 *
 * Input Parameters:
 *   fa - Flash area.
 *
 * Returned Value:
 *   The device ID of the requested flash area.
 *
 ****************************************************************************/

static inline uint8_t flash_area_get_device_id(const struct flash_area *fa)
{
  return fa->fa_device_id;
}

/****************************************************************************
 * Name: flash_area_get_off
 *
 * Description:
 *   Obtain the offset, from the beginning of a device, where a given flash
 *   area starts at.
 *
 * Input Parameters:
 *   fa - Flash area.
 *
 * Returned Value:
 *   The offset value of the requested flash area.
 *
 ****************************************************************************/

static inline uint32_t flash_area_get_off(const struct flash_area *fa)
{
  return fa->fa_off;
}

/****************************************************************************
 * Name: flash_area_get_size
 *
 * Description:
 *   Obtain the size, from the offset, of a given flash area.
 *
 * Input Parameters:
 *   fa - Flash area.
 *
 * Returned Value:
 *   The size value of the requested flash area.
 *
 ****************************************************************************/

static inline uint32_t flash_area_get_size(const struct flash_area *fa)
{
  return fa->fa_size;
}

/****************************************************************************
 * Name: flash_sector_get_off
 *
 * Description:
 *   Obtain the offset, from the beginning of its flash area, where a given
 *   flash sector starts at.
 *
 * Input Parameters:
 *   fs - Flash sector.
 *
 * Returned Value:
 *   The offset value of the requested flash sector.
 *
 ****************************************************************************/

static inline uint32_t flash_sector_get_off(const struct flash_sector *fs)
{
    return fs->fs_off;
}

/****************************************************************************
 * Name: flash_sector_get_size
 *
 * Description:
 *   Obtain the size, from the offset, of a given flash sector.
 *
 * Input Parameters:
 *   fs - Flash sector.
 *
 * Returned Value:
 *   The size in bytes of the requested flash sector.
 *
 ****************************************************************************/

static inline uint32_t flash_sector_get_size(const struct flash_sector *fs)
{
    return fs->fs_size;
}

/****************************************************************************
 * Public Function Prototypes
 ****************************************************************************/

/****************************************************************************
 * Name: flash_area_open
 *
 * Description:
 *   Retrieve flash area from the flash map for a given partition.
 *
 * Input Parameters:
 *   fa_id - ID of the flash partition.
 *
 * Output Parameters:
 *   fa    - Pointer which will contain the reference to flash_area.
 *           If ID is unknown, it will be NULL on output.
 *
 * Returned Value:
 *   Zero on success, or negative value in case of error.
 *
 ****************************************************************************/

int flash_area_open(uint8_t id, const struct flash_area **fa);

/****************************************************************************
 * Name: flash_area_close
 *
 * Description:
 *   Close a given flash area.
 *
 * Input Parameters:
 *   fa - Flash area to be closed.
 *
 * Returned Value:
 *   None.
 *
 ****************************************************************************/

void flash_area_close(const struct flash_area *fa);

/****************************************************************************
 * Name: flash_area_read
 *
 * Description:
 *   Read data from flash area.
 *   Area readout boundaries are asserted before read request. API has the
 *   same limitation regarding read-block alignment and size as the
 *   underlying flash driver.
 *
 * Input Parameters:
 *   fa  - Flash area to be read.
 *   off - Offset relative from beginning of flash area to be read.
 *   len - Number of bytes to read.
 *
 * Output Parameters:
 *   dst - Buffer to store read data.
 *
 * Returned Value:
 *   Zero on success, or negative value in case of error.
 *
 ****************************************************************************/

int flash_area_read(const struct flash_area *fa, uint32_t off,
                    void *dst, uint32_t len);

/****************************************************************************
 * Name: flash_area_write
 *
 * Description:
 *   Write data to flash area.
 *   Area write boundaries are asserted before write request. API has the
 *   same limitation regarding write-block alignment and size as the
 *   underlying flash driver.
 *
 * Input Parameters:
 *   fa  - Flash area to be written.
 *   off - Offset relative from beginning of flash area to be written.
 *   src - Buffer with data to be written.
 *   len - Number of bytes to write.
 *
 * Returned Value:
 *   Zero on success, or negative value in case of error.
 *
 ****************************************************************************/

int flash_area_write(const struct flash_area *fa, uint32_t off,
                     const void *src, uint32_t len);

/****************************************************************************
 * Name: flash_area_erase
 *
 * Description:
 *   Erase a given flash area range.
 *   Area boundaries are asserted before erase request. API has the same
 *   limitation regarding erase-block alignment and size as the underlying
 *   flash driver.
 *
 * Input Parameters:
 *   fa  - Flash area to be erased.
 *   off - Offset relative from beginning of flash area to be erased.
 *   len - Number of bytes to be erase.
 *
 * Returned Value:
 *   Zero on success, or negative value in case of error.
 *
 ****************************************************************************/

int flash_area_erase(const struct flash_area *fa, uint32_t off,
                     uint32_t len);

/****************************************************************************
 * Name: flash_area_align
 *
 * Description:
 *   Get write block size of the flash area.
 *   Write block size might be treated as read block size, although most
 *   drivers support unaligned readout.
 *
 * Input Parameters:
 *   fa - Flash area.
 *
 * Returned Value:
 *   Alignment restriction for flash writes in the given flash area.
 *
 ****************************************************************************/

uint8_t flash_area_align(const struct flash_area *fa);

/****************************************************************************
 * Name: flash_area_erased_val
 *
 * Description:
 *   Get the value expected to be read when accessing any erased flash byte.
 *   This API is compatible with the MCUboot's porting layer.
 *
 * Input Parameters:
 *   fa - Flash area.
 *
 * Returned Value:
 *   Byte value of erased memory.
 *
 ****************************************************************************/

uint8_t flash_area_erased_val(const struct flash_area *fa);

/****************************************************************************
 * Name: flash_area_get_sectors
 *
 * Description:
 *   Retrieve info about sectors within the area.
 *
 * Input Parameters:
 *   fa_id   - ID of the flash area whose info will be retrieved.
 *   count   - On input, represents the capacity of the sectors buffer.
 *
 * Output Parameters:
 *   count   - On output, it shall contain the number of retrieved sectors.
 *   sectors - Buffer for sectors data.
 *
 * Returned Value:
 *   Zero on success, or negative value in case of error.
 *
 ****************************************************************************/

int flash_area_get_sectors(int fa_id, uint32_t *count,
                           struct flash_sector *sectors);

/****************************************************************************
 * Name: flash_area_id_from_multi_image_slot
 *
 * Description:
 *   Return the flash area ID for a given slot and a given image index
 *   (in case of a multi-image setup).
 *
 * Input Parameters:
 *   image_index - Index of the image.
 *   slot        - Image slot, which may be 0 (primary) or 1 (secondary).
 *
 * Returned Value:
 *   Flash area ID (0 or 1), or negative value in case the requested slot
 *   is invalid.
 *
 ****************************************************************************/

int flash_area_id_from_multi_image_slot(int image_index, int slot);

/****************************************************************************
 * Name: flash_area_id_from_image_slot
 *
 * Description:
 *   Return the flash area ID for a given slot.
 *
 * Input Parameters:
 *   slot - Image slot, which may be 0 (primary) or 1 (secondary).
 *
 * Returned Value:
 *   Flash area ID (0 or 1), or negative value in case the requested slot
 *   is invalid.
 *
 ****************************************************************************/

int flash_area_id_from_image_slot(int slot);

/****************************************************************************
 * Name: flash_area_id_to_multi_image_slot
 *
 * Description:
 *   Convert the specified flash area ID and image index (in case of a
 *   multi-image setup) to an image slot index.
 *
 * Input Parameters:
 *   image_index - Index of the image.
 *   fa_id       - Image slot, which may be 0 (primary) or 1 (secondary).
 *
 * Returned Value:
 *   Image slot index (0 or 1), or negative value in case ID doesn't
 *   correspond to an image slot.
 *
 ****************************************************************************/

int flash_area_id_to_multi_image_slot(int image_index, int fa_id);

/****************************************************************************
 * Name: flash_area_id_from_image_offset
 *
 * Description:
 *   Return the flash area ID for a given image offset.
 *
 * Input Parameters:
 *   offset - Image offset.
 *
 * Returned Value:
 *   Flash area ID (0 or 1), or negative value in case the requested slot
 *   is invalid.
 *
 ****************************************************************************/

int flash_area_id_from_image_offset(uint32_t offset);

#endif /* __BOOT_NUTTX_INCLUDE_FLASH_MAP_BACKEND_FLASH_MAP_BACKEND_H */
+179 −0
Original line number Diff line number Diff line
/****************************************************************************
 * boot/nuttx/include/mcuboot_config/mcuboot_config.h
 *
 * Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd.
 *
 * 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 __BOOT_NUTTX_INCLUDE_MCUBOOT_CONFIG_MCUBOOT_CONFIG_H
#define __BOOT_NUTTX_INCLUDE_MCUBOOT_CONFIG_MCUBOOT_CONFIG_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#ifdef CONFIG_MCUBOOT_WATCHDOG
#include "watchdog/watchdog.h"
#endif

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

/* Signature types
 *
 * You must choose exactly one signature type.
 */

/* Uncomment for RSA signature support */

/* #define MCUBOOT_SIGN_RSA */

/* Uncomment for ECDSA signatures using curve P-256. */

/* #define MCUBOOT_SIGN_EC256 */

/* Upgrade mode
 *
 * The default is to support A/B image swapping with rollback.  Other modes
 * with simpler code path, which only supports overwriting the existing image
 * with the update image or running the newest image directly from its flash
 * partition, are also available.
 *
 * You can enable only one mode at a time from the list below to override
 * the default upgrade mode.
 */

/* Uncomment to enable the overwrite-only code path. */

/* #define MCUBOOT_OVERWRITE_ONLY */

#ifdef MCUBOOT_OVERWRITE_ONLY

/* Uncomment to only erase and overwrite those primary slot sectors needed
 * to install the new image, rather than the entire image slot.
 */

/* #define MCUBOOT_OVERWRITE_ONLY_FAST */

#endif

/* Uncomment to enable the direct-xip code path. */

/* #define MCUBOOT_DIRECT_XIP */

/* Uncomment to enable the ram-load code path. */

/* #define MCUBOOT_RAM_LOAD */

/* Cryptographic settings
 *
 * You must choose between mbedTLS and Tinycrypt as source of
 * cryptographic primitives. Other cryptographic settings are also
 * available.
 */

/* Uncomment to use ARM's mbedTLS cryptographic primitives */

#define MCUBOOT_USE_MBED_TLS

/* Uncomment to use Tinycrypt's. */

/* #define MCUBOOT_USE_TINYCRYPT */

/* Always check the signature of the image in the primary slot before
 * booting, even if no upgrade was performed. This is recommended if the boot
 * time penalty is acceptable.
 */

#define MCUBOOT_VALIDATE_PRIMARY_SLOT

/* Flash abstraction */

/* Uncomment if your flash map API supports flash_area_get_sectors().
 * See the flash APIs for more details.
 */

#define MCUBOOT_USE_FLASH_AREA_GET_SECTORS

/* Default maximum number of flash sectors per image slot; change
 * as desirable.
 */

#define MCUBOOT_MAX_IMG_SECTORS 512

/* Default number of separately updateable images; change in case of
 * multiple images.
 */

#define MCUBOOT_IMAGE_NUMBER 1

/* Logging */

/* If logging is enabled the following functions must be defined by the
 * platform:
 *
 *    MCUBOOT_LOG_MODULE_REGISTER(domain)
 *      Register a new log module and add the current C file to it.
 *
 *    MCUBOOT_LOG_MODULE_DECLARE(domain)
 *      Add the current C file to an existing log module.
 *
 *    MCUBOOT_LOG_ERR(...)
 *    MCUBOOT_LOG_WRN(...)
 *    MCUBOOT_LOG_INF(...)
 *    MCUBOOT_LOG_DBG(...)
 *
 * The function priority is:
 *
 *    MCUBOOT_LOG_ERR > MCUBOOT_LOG_WRN > MCUBOOT_LOG_INF > MCUBOOT_LOG_DBG
 */

#ifdef CONFIG_MCUBOOT_ENABLE_LOGGING
#  define MCUBOOT_HAVE_LOGGING
#endif

/* Assertions */

/* Uncomment if your platform has its own mcuboot_config/mcuboot_assert.h.
 * If so, it must provide an ASSERT macro for use by bootutil. Otherwise,
 * "assert" is used.
 */

/* #define MCUBOOT_HAVE_ASSERT_H 1 */

/* Watchdog feeding */

/* This macro might be implemented if the OS / HW watchdog is enabled while
 * doing a swap upgrade and the time it takes for a swapping is long enough
 * to cause an unwanted reset. If implementing this, the OS main.c must also
 * enable the watchdog (if required)!
 */

#ifdef CONFIG_MCUBOOT_WATCHDOG
#  define MCUBOOT_WATCHDOG_FEED()       do                           \
                                          {                          \
                                            mcuboot_watchdog_feed(); \
                                          }                          \
                                        while (0)

#else
#  define MCUBOOT_WATCHDOG_FEED()       do                           \
                                          {                          \
                                          }                          \
                                        while (0)
#endif

#endif /* __BOOT_NUTTX_INCLUDE_MCUBOOT_CONFIG_MCUBOOT_CONFIG_H */
+45 −0
Original line number Diff line number Diff line
/****************************************************************************
 * boot/nuttx/include/mcuboot_config/mcuboot_logging.h
 *
 * Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd.
 *
 * 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 __BOOT_NUTTX_INCLUDE_MCUBOOT_CONFIG_MCUBOOT_LOGGING_H
#define __BOOT_NUTTX_INCLUDE_MCUBOOT_CONFIG_MCUBOOT_LOGGING_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <syslog.h>

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

#define MCUBOOT_LOG_ERR(format, ...) \
    syslog(LOG_ERR, "%s: " format "\n", __FUNCTION__, ##__VA_ARGS__)

#define MCUBOOT_LOG_WRN(format, ...) \
    syslog(LOG_WARNING, "%s: " format "\n", __FUNCTION__, ##__VA_ARGS__)

#define MCUBOOT_LOG_INF(format, ...) \
    syslog(LOG_INFO, "%s: " format "\n", __FUNCTION__, ##__VA_ARGS__)

#define MCUBOOT_LOG_DBG(format, ...) \
    syslog(LOG_DEBUG, "%s: " format "\n", __FUNCTION__, ##__VA_ARGS__)

#endif /* __BOOT_NUTTX_INCLUDE_MCUBOOT_CONFIG_MCUBOOT_LOGGING_H */
+29 −0
Original line number Diff line number Diff line
/****************************************************************************
 * boot/nuttx/include/os/os_malloc.h
 *
 * Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd.
 *
 * 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 __BOOT_NUTTX_INCLUDE_OS_OS_MALLOC_H
#define __BOOT_NUTTX_INCLUDE_OS_OS_MALLOC_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <stdlib.h>

#endif /* __BOOT_NUTTX_INCLUDE_OS_OS_MALLOC_H */
+35 −0
Original line number Diff line number Diff line
/****************************************************************************
 * boot/nuttx/include/sysflash/sysflash.h
 *
 * Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd.
 *
 * 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 __BOOT_NUTTX_INCLUDE_SYSFLASH_SYSFLASH_H
#define __BOOT_NUTTX_INCLUDE_SYSFLASH_SYSFLASH_H

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

#define PRIMARY_ID      0
#define SECONDARY_ID    1
#define SCRATCH_ID      2

#define FLASH_AREA_IMAGE_PRIMARY(x)    PRIMARY_ID
#define FLASH_AREA_IMAGE_SECONDARY(x)  SECONDARY_ID
#define FLASH_AREA_IMAGE_SCRATCH       SCRATCH_ID

#endif /* __BOOT_NUTTX_INCLUDE_SYSFLASH_SYSFLASH_H */
Loading