diff options
| -rw-r--r-- | ports/stm32/mboot/fsload.c | 30 | ||||
| -rw-r--r-- | ports/stm32/mboot/gzstream.c | 2 | ||||
| -rw-r--r-- | ports/stm32/mboot/main.c | 6 | ||||
| -rw-r--r-- | ports/stm32/mboot/mboot.h | 31 | ||||
| -rw-r--r-- | ports/stm32/mboot/pack.c | 22 | ||||
| -rw-r--r-- | ports/stm32/mboot/vfs_fat.c | 4 | ||||
| -rw-r--r-- | ports/stm32/mboot/vfs_lfs.c | 13 | 
7 files changed, 74 insertions, 34 deletions
| diff --git a/ports/stm32/mboot/fsload.c b/ports/stm32/mboot/fsload.c index fe98426be..9ecc25b0b 100644 --- a/ports/stm32/mboot/fsload.c +++ b/ports/stm32/mboot/fsload.c @@ -80,18 +80,18 @@ static int fsload_program_file(bool write_to_flash) {      // Read file header, <5sBIB      int res = input_stream_read(11, buf);      if (res != 11) { -        return -1; +        return -MBOOT_ERRNO_DFU_READ_ERROR;      }      file_offset = 11;      // Validate header, version 1      if (memcmp(buf, "DfuSe\x01", 6) != 0) { -        return -1; +        return -MBOOT_ERRNO_DFU_INVALID_HEADER;      }      // Must have only 1 target      if (buf[10] != 1) { -        return -2; +        return -MBOOT_ERRNO_DFU_TOO_MANY_TARGETS;      }      // Get total size @@ -100,13 +100,13 @@ static int fsload_program_file(bool write_to_flash) {      // Read target header, <6sBi255sII      res = input_stream_read(274, buf);      if (res != 274) { -        return -1; +        return -MBOOT_ERRNO_DFU_READ_ERROR;      }      file_offset += 274;      // Validate target header, with alt being 0      if (memcmp(buf, "Target\x00", 7) != 0) { -        return -1; +        return -MBOOT_ERRNO_DFU_INVALID_TARGET;      }      // Get target size and number of elements @@ -120,7 +120,7 @@ static int fsload_program_file(bool write_to_flash) {          // Read element header, <II          res = input_stream_read(8, buf);          if (res != 8) { -            return -1; +            return -MBOOT_ERRNO_DFU_READ_ERROR;          }          file_offset += 8; @@ -149,12 +149,12 @@ static int fsload_program_file(bool write_to_flash) {              }              res = input_stream_read(l, buf);              if (res != l) { -                return -1; +                return -MBOOT_ERRNO_DFU_READ_ERROR;              }              if (write_to_flash) {                  res = do_write(elem_addr, buf, l);                  if (res != 0) { -                    return -1; +                    return res;                  }                  elem_addr += l;              } @@ -165,17 +165,17 @@ static int fsload_program_file(bool write_to_flash) {      }      if (target_size != file_offset - file_offset_target) { -        return -1; +        return -MBOOT_ERRNO_DFU_INVALID_SIZE;      }      if (total_size != file_offset) { -        return -1; +        return -MBOOT_ERRNO_DFU_INVALID_SIZE;      }      // Read trailing info      res = input_stream_read(16, buf);      if (res != 16) { -        return -1; +        return -MBOOT_ERRNO_DFU_READ_ERROR;      }      // TODO validate CRC32 @@ -205,7 +205,7 @@ static int fsload_validate_and_program_file(void *stream, const stream_methods_t  int fsload_process(void) {      const uint8_t *elem = elem_search(ELEM_DATA_START, ELEM_TYPE_FSLOAD);      if (elem == NULL || elem[-1] < 2) { -        return -1; +        return -MBOOT_ERRNO_FSLOAD_NO_FSLOAD;      }      // Get mount point id and create null-terminated filename @@ -220,7 +220,7 @@ int fsload_process(void) {          elem = elem_search(elem, ELEM_TYPE_MOUNT);          if (elem == NULL) {              // End of elements. -            return -1; +            return -MBOOT_ERRNO_FSLOAD_NO_MOUNT;          }          uint32_t block_size;          if (elem[-1] == 10) { @@ -231,7 +231,7 @@ int fsload_process(void) {              block_size = get_le32(&elem[10]);          } else {              // Invalid MOUNT element. -            return -1; +            return -MBOOT_ERRNO_FSLOAD_INVALID_MOUNT;          }          if (elem[0] == mount_point) {              uint32_t base_addr = get_le32(&elem[2]); @@ -270,7 +270,7 @@ int fsload_process(void) {              #endif              {                  // Unknown filesystem type -                return -1; +                return -MBOOT_ERRNO_FSLOAD_INVALID_MOUNT;              }              if (ret == 0) { diff --git a/ports/stm32/mboot/gzstream.c b/ports/stm32/mboot/gzstream.c index 6530539f4..652302e42 100644 --- a/ports/stm32/mboot/gzstream.c +++ b/ports/stm32/mboot/gzstream.c @@ -80,7 +80,7 @@ int gz_stream_init_from_stream(void *stream_data, stream_read_t stream_read) {      int st = uzlib_gzip_parse_header(&gz_stream.tinf);      if (st != TINF_OK) { -        return -1; +        return -MBOOT_ERRNO_GUNZIP_FAILED;      }      uzlib_uncompress_init(&gz_stream.tinf, gz_stream.dict, DICT_SIZE); diff --git a/ports/stm32/mboot/main.c b/ports/stm32/mboot/main.c index 1395949f2..4407ca9da 100644 --- a/ports/stm32/mboot/main.c +++ b/ports/stm32/mboot/main.c @@ -489,7 +489,7 @@ static int mboot_flash_page_erase(uint32_t addr, uint32_t *next_addr) {          dfu_context.status = DFU_STATUS_ERROR_ADDRESS;          dfu_context.error = (sector == 0) ? MBOOT_ERROR_STR_OVERWRITE_BOOTLOADER_IDX                                            : MBOOT_ERROR_STR_INVALID_ADDRESS_IDX; -        return -1; +        return -MBOOT_ERRNO_FLASH_ERASE_DISALLOWED;      }      *next_addr = sector_start + sector_size; @@ -503,7 +503,7 @@ static int mboot_flash_page_erase(uint32_t addr, uint32_t *next_addr) {      // Check the erase set bits to 1, at least for the first 256 bytes      for (int i = 0; i < 64; ++i) {          if (((volatile uint32_t*)sector_start)[i] != 0xffffffff) { -            return -2; +            return -MBOOT_ERRNO_FLASH_ERASE_FAILED;          }      } @@ -517,7 +517,7 @@ static int mboot_flash_write(uint32_t addr, const uint8_t *src8, size_t len) {          dfu_context.status = DFU_STATUS_ERROR_ADDRESS;          dfu_context.error = (sector == 0) ? MBOOT_ERROR_STR_OVERWRITE_BOOTLOADER_IDX                                            : MBOOT_ERROR_STR_INVALID_ADDRESS_IDX; -        return -1; +        return -MBOOT_ERRNO_FLASH_WRITE_DISALLOWED;      }      const uint32_t *src = (const uint32_t*)src8; diff --git a/ports/stm32/mboot/mboot.h b/ports/stm32/mboot/mboot.h index 853a86968..8f8a8afdd 100644 --- a/ports/stm32/mboot/mboot.h +++ b/ports/stm32/mboot/mboot.h @@ -40,6 +40,37 @@  #define MP_ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))  enum { +    MBOOT_ERRNO_FLASH_ERASE_DISALLOWED = 200, +    MBOOT_ERRNO_FLASH_ERASE_FAILED, +    MBOOT_ERRNO_FLASH_WRITE_DISALLOWED, + +    MBOOT_ERRNO_DFU_INVALID_HEADER = 210, +    MBOOT_ERRNO_DFU_INVALID_TARGET, +    MBOOT_ERRNO_DFU_INVALID_SIZE, +    MBOOT_ERRNO_DFU_TOO_MANY_TARGETS, +    MBOOT_ERRNO_DFU_READ_ERROR, + +    MBOOT_ERRNO_FSLOAD_NO_FSLOAD = 220, +    MBOOT_ERRNO_FSLOAD_NO_MOUNT, +    MBOOT_ERRNO_FSLOAD_INVALID_MOUNT, + +    MBOOT_ERRNO_PACK_INVALID_ADDR = 230, +    MBOOT_ERRNO_PACK_INVALID_CHUNK, +    MBOOT_ERRNO_PACK_INVALID_VERSION, +    MBOOT_ERRNO_PACK_DECRYPT_FAILED, +    MBOOT_ERRNO_PACK_SIGN_FAILED, + +    MBOOT_ERRNO_VFS_FAT_MOUNT_FAILED = 240, +    MBOOT_ERRNO_VFS_FAT_OPEN_FAILED, +    MBOOT_ERRNO_VFS_LFS1_MOUNT_FAILED, +    MBOOT_ERRNO_VFS_LFS1_OPEN_FAILED, +    MBOOT_ERRNO_VFS_LFS2_MOUNT_FAILED, +    MBOOT_ERRNO_VFS_LFS2_OPEN_FAILED, + +    MBOOT_ERRNO_GUNZIP_FAILED = 250, +}; + +enum {      ELEM_TYPE_END = 1,      ELEM_TYPE_MOUNT,      ELEM_TYPE_FSLOAD, diff --git a/ports/stm32/mboot/pack.c b/ports/stm32/mboot/pack.c index 63f98fed1..63ab93ea3 100644 --- a/ports/stm32/mboot/pack.c +++ b/ports/stm32/mboot/pack.c @@ -112,7 +112,7 @@ static int mboot_pack_commit_chunk(uint32_t addr, uint8_t *data, size_t len) {  // Handle a chunk with the full firmware signature.  static int mboot_pack_handle_full_sig(void) {      if (firmware_chunk_buf.header.length < hydro_sign_BYTES) { -        return -1; +        return -MBOOT_ERRNO_PACK_INVALID_CHUNK;      }      uint8_t *full_sig = &firmware_chunk_buf.data[firmware_chunk_buf.header.length - hydro_sign_BYTES]; @@ -138,7 +138,7 @@ static int mboot_pack_handle_full_sig(void) {              }              int ret = hydro_sign_update(&sign_state, buf, l);              if (ret != 0) { -                return -1; +                return -MBOOT_ERRNO_PACK_SIGN_FAILED;              }              addr += l;              len -= l; @@ -150,7 +150,7 @@ static int mboot_pack_handle_full_sig(void) {      if (ret != 0) {          dfu_context.status = DFU_STATUS_ERROR_VERIFY;          dfu_context.error = MBOOT_ERROR_STR_INVALID_SIG_IDX; -        return -1; +        return -MBOOT_ERRNO_PACK_SIGN_FAILED;      }      // Full firmware passed the signature check. @@ -167,7 +167,7 @@ static int mboot_pack_handle_firmware(void) {      if (hydro_secretbox_decrypt(decrypted_buf, fw_data, fw_len, 0, MBOOT_PACK_HYDRO_CONTEXT, mboot_pack_secretbox_key) != 0) {          dfu_context.status = DFU_STATUS_ERROR_VERIFY;          dfu_context.error = MBOOT_ERROR_STR_INVALID_SIG_IDX; -        return -1; +        return -MBOOT_ERRNO_PACK_DECRYPT_FAILED;      }      // Use the decrypted message contents going formward. @@ -182,7 +182,7 @@ static int mboot_pack_handle_firmware(void) {              if (read == 0) {                  return 0; // finished decompressing              } else if (read < 0) { -                return -1; // error reading +                return -MBOOT_ERRNO_GUNZIP_FAILED; // error reading              }              int ret = mboot_pack_commit_chunk(addr, uncompressed_buf, read);              if (ret != 0) { @@ -210,14 +210,14 @@ int mboot_pack_write(uint32_t addr, const uint8_t *src8, size_t len) {      if (addr < firmware_chunk_base_addr) {          // Address out of range.          firmware_chunk_base_addr = 0; -        return -1; +        return -MBOOT_ERRNO_PACK_INVALID_ADDR;      }      size_t offset = addr - firmware_chunk_base_addr;      if (offset + len > sizeof(firmware_chunk_buf)) {          // Address/length out of range.          firmware_chunk_base_addr = 0; -        return -1; +        return -MBOOT_ERRNO_PACK_INVALID_ADDR;      }      // Copy in the new data piece into the chunk buffer. @@ -232,14 +232,14 @@ int mboot_pack_write(uint32_t addr, const uint8_t *src8, size_t len) {          // Chunk header has the wrong version.          dfu_context.status = DFU_STATUS_ERROR_FILE;          dfu_context.error = MBOOT_ERROR_STR_INVALID_SIG_IDX; -        return -1; +        return -MBOOT_ERRNO_PACK_INVALID_VERSION;      }      if (firmware_chunk_buf.header.address != firmware_chunk_base_addr) {          // Chunk address doesn't agree with dfu address, abort.          dfu_context.status = DFU_STATUS_ERROR_ADDRESS;          dfu_context.error = MBOOT_ERROR_STR_INVALID_SIG_IDX; -        return -1; +        return -MBOOT_ERRNO_PACK_INVALID_ADDR;      }      if (offset + len < sizeof(firmware_chunk_buf.header) + firmware_chunk_buf.header.length + sizeof(firmware_chunk_buf.signature)) { @@ -260,7 +260,7 @@ int mboot_pack_write(uint32_t addr, const uint8_t *src8, size_t len) {          // Signature failed          dfu_context.status = DFU_STATUS_ERROR_VERIFY;          dfu_context.error = MBOOT_ERROR_STR_INVALID_SIG_IDX; -        return -1; +        return -MBOOT_ERRNO_PACK_SIGN_FAILED;      }      // Signature passed, we have valid chunk. @@ -275,7 +275,7 @@ int mboot_pack_write(uint32_t addr, const uint8_t *src8, size_t len) {          return mboot_pack_handle_firmware();      } else {          // Unsupported contents. -        return -1; +        return -MBOOT_ERRNO_PACK_INVALID_CHUNK;      }  } diff --git a/ports/stm32/mboot/vfs_fat.c b/ports/stm32/mboot/vfs_fat.c index 5120bdb10..cfa30fb12 100644 --- a/ports/stm32/mboot/vfs_fat.c +++ b/ports/stm32/mboot/vfs_fat.c @@ -84,7 +84,7 @@ int vfs_fat_mount(vfs_fat_context_t *ctx, uint32_t base_addr, uint32_t byte_len)      ctx->fatfs.drv = ctx;      FRESULT res = f_mount(&ctx->fatfs);      if (res != FR_OK) { -        return -1; +        return -MBOOT_ERRNO_VFS_FAT_MOUNT_FAILED;      }      return 0;  } @@ -93,7 +93,7 @@ static int vfs_fat_stream_open(void *stream_in, const char *fname) {      vfs_fat_context_t *stream = stream_in;      FRESULT res = f_open(&stream->fatfs, &stream->fp, fname, FA_READ);      if (res != FR_OK) { -        return -1; +        return -MBOOT_ERRNO_VFS_FAT_OPEN_FAILED;      }      return 0;  } diff --git a/ports/stm32/mboot/vfs_lfs.c b/ports/stm32/mboot/vfs_lfs.c index 3e4c9caf1..e7fd8ce63 100644 --- a/ports/stm32/mboot/vfs_lfs.c +++ b/ports/stm32/mboot/vfs_lfs.c @@ -37,6 +37,9 @@  #error Unsupported  #endif +#define MBOOT_ERRNO_VFS_LFS_MOUNT_FAILED MBOOT_ERRNO_VFS_LFS1_MOUNT_FAILED +#define MBOOT_ERRNO_VFS_LFS_OPEN_FAILED MBOOT_ERRNO_VFS_LFS1_OPEN_FAILED +  #define LFSx_MACRO(s) LFS1##s  #define LFSx_API(x) lfs1_ ## x  #define VFS_LFSx_CONTEXT_T vfs_lfs1_context_t @@ -49,6 +52,9 @@ static uint8_t lfs_lookahead_buffer[LFS_LOOKAHEAD_SIZE / 8];  #else +#define MBOOT_ERRNO_VFS_LFS_MOUNT_FAILED MBOOT_ERRNO_VFS_LFS2_MOUNT_FAILED +#define MBOOT_ERRNO_VFS_LFS_OPEN_FAILED MBOOT_ERRNO_VFS_LFS2_OPEN_FAILED +  #define LFSx_MACRO(s) LFS2##s  #define LFSx_API(x) lfs2_ ## x  #define VFS_LFSx_CONTEXT_T vfs_lfs2_context_t @@ -116,7 +122,7 @@ int VFS_LFSx_MOUNT(VFS_LFSx_CONTEXT_T *ctx, uint32_t base_addr, uint32_t byte_le      int ret = LFSx_API(mount)(&ctx->lfs, &ctx->config);      if (ret < 0) { -        return -1; +        return -MBOOT_ERRNO_VFS_LFS_MOUNT_FAILED;      }      return 0;  } @@ -126,7 +132,10 @@ static int vfs_lfs_stream_open(void *stream_in, const char *fname) {      memset(&ctx->file, 0, sizeof(ctx->file));      memset(&ctx->filecfg, 0, sizeof(ctx->filecfg));      ctx->filecfg.buffer = &ctx->filebuf[0]; -    LFSx_API(file_opencfg)(&ctx->lfs, &ctx->file, fname, LFSx_MACRO(_O_RDONLY), &ctx->filecfg); +    int ret = LFSx_API(file_opencfg)(&ctx->lfs, &ctx->file, fname, LFSx_MACRO(_O_RDONLY), &ctx->filecfg); +    if (ret < 0) { +        return -MBOOT_ERRNO_VFS_LFS_OPEN_FAILED; +    }      return 0;  } | 
