![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Example
Dependencies: FXAS21002 FXOS8700Q
Diff: simple-mbed-cloud-client/storage-helper/storage-helper.h
- Revision:
- 0:11cc2b7889af
diff -r 000000000000 -r 11cc2b7889af simple-mbed-cloud-client/storage-helper/storage-helper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simple-mbed-cloud-client/storage-helper/storage-helper.h Tue Nov 19 09:49:38 2019 +0000 @@ -0,0 +1,189 @@ +// ---------------------------------------------------------------------------- +// Copyright 2016-2018 ARM Ltd. +// +// SPDX-License-Identifier: Apache-2.0 +// +// 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 SIMPLEMBEDCLOUDCLIENT_STORAGEHELPER_H_ +#define SIMPLEMBEDCLOUDCLIENT_STORAGEHELPER_H_ + +#include "mbed.h" +#include "BlockDevice.h" +#include "FileSystem.h" +#include "factory_configurator_client.h" + +// This is for single or dual partition mode. This is supposed to be used with storage for data e.g. SD card. +// Enable by 1/disable by 0. +#ifndef MCC_PLATFORM_PARTITION_MODE +#define MCC_PLATFORM_PARTITION_MODE 0 +#endif + +#include "pal.h" +#if (MCC_PLATFORM_PARTITION_MODE == 1) +#include "MBRBlockDevice.h" +#include "FATFileSystem.h" + +// Set to 1 for enabling automatic partitioning storage if required. This is effective only if MCC_PLATFORM_PARTITION_MODE is defined to 1. +// Partioning will be triggered only if initialization of available partitions fail. +#ifndef MCC_PLATFORM_AUTO_PARTITION +#define MCC_PLATFORM_AUTO_PARTITION 0 +#endif + +#ifndef PRIMARY_PARTITION_NUMBER +#define PRIMARY_PARTITION_NUMBER 1 +#endif + +#ifndef PRIMARY_PARTITION_START +#define PRIMARY_PARTITION_START 0 +#endif + +#ifndef PRIMARY_PARTITION_SIZE +#define PRIMARY_PARTITION_SIZE 1024*1024*1024 // default partition size 1GB +#endif + +#ifndef SECONDARY_PARTITION_NUMBER +#define SECONDARY_PARTITION_NUMBER 2 +#endif + +#ifndef SECONDARY_PARTITION_START +#define SECONDARY_PARTITION_START PRIMARY_PARTITION_SIZE +#endif + +#ifndef SECONDARY_PARTITION_SIZE +#define SECONDARY_PARTITION_SIZE 1024*1024*1024 // default partition size 1GB +#endif + +#ifndef NUMBER_OF_PARTITIONS +#define NUMBER_OF_PARTITIONS PAL_NUMBER_OF_PARTITIONS +#endif + +#ifndef MOUNT_POINT_PRIMARY +#define MOUNT_POINT_PRIMARY PAL_FS_MOUNT_POINT_PRIMARY +#endif + +#ifndef MOUNT_POINT_SECONDARY +#define MOUNT_POINT_SECONDARY PAL_FS_MOUNT_POINT_SECONDARY +#endif + +#endif // MCC_PLATFORM_PARTITION_MODE + +// Include this only for Developer mode and device which doesn't have in-built TRNG support +#if MBED_CONF_DEVICE_MANAGEMENT_DEVELOPER_MODE == 1 +#ifdef PAL_USER_DEFINED_CONFIGURATION +#define FCC_ROT_SIZE 16 +const uint8_t MBED_CLOUD_DEV_ROT[FCC_ROT_SIZE] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; +#if !PAL_USE_HW_TRNG +#define FCC_ENTROPY_SIZE 48 +const uint8_t MBED_CLOUD_DEV_ENTROPY[FCC_ENTROPY_SIZE] = { 0xf6, 0xd6, 0xc0, 0x09, 0x9e, 0x6e, 0xf2, 0x37, 0xdc, 0x29, 0x88, 0xf1, 0x57, 0x32, 0x7d, 0xde, 0xac, 0xb3, 0x99, 0x8c, 0xb9, 0x11, 0x35, 0x18, 0xeb, 0x48, 0x29, 0x03, 0x6a, 0x94, 0x6d, 0xe8, 0x40, 0xc0, 0x28, 0xcc, 0xe4, 0x04, 0xc3, 0x1f, 0x4b, 0xc2, 0xe0, 0x68, 0xa0, 0x93, 0xe6, 0x3a }; +#endif // PAL_USE_HW_TRNG = 0 +#endif // PAL_USER_DEFINED_CONFIGURATION +#endif // #if MBED_CONF_DEVICE_MANAGEMENT_DEVELOPER_MODE == 1 + +class StorageHelper { +public: + /** + * Initializes a new StorageHelper. + * StorageHelper manages storage across multiple partitions, + * initializes SOTP, and can format the storage. + * + * @param bd An un-initialized block device to back the file system + * @param fs An un-mounted file system + */ + StorageHelper(BlockDevice *bd, FileSystem *fs); + + /** + * Initialize the storage helper, this initializes and mounts + * both the block device and file system + * + * @returns 0 if successful, non-0 when not successful + */ + int init(); + + /** + * Initialize the factory configurator client, sets entropy, + * and reads root of trust. + * + * @returns 0 if successful, non-0 when not successful + */ + int sotp_init(); + + /** + * Format the block device, and remount the filesystem + * + * @returns 0 if successful, non-0 when not successful + */ + int reformat_storage(void); + + /** + * Initialize and format a blockdevice and file system + */ + static int format(FileSystem *fs, BlockDevice *bd); + +private: +#if (MCC_PLATFORM_PARTITION_MODE == 1) + // for checking that PRIMARY_PARTITION_SIZE and SECONDARY_PARTITION_SIZE do not overflow. + bd_size_t mcc_platform_storage_size; + + /** + * Initialize and mount the partition on the file system + * The block device must be initialized before calling this function. + * + * @param fs Pointer to an array of file systems, one per partition + * @param part Pointer to an array of block devices, one per partition. + * All these need to be initialized. + * @param number_of_partitions Total number of partitions + * @param mount_point Mount point + * + * @returns 0 if successful, non-0 when not successful + */ + int init_and_mount_partition(FileSystem **fs, BlockDevice** part, int number_of_partition, const char* mount_point); +#endif + +#if ((MCC_PLATFORM_PARTITION_MODE == 1) && (MCC_PLATFORM_AUTO_PARTITION == 1)) + int create_partitions(void); +#endif + /** + * Reformat a single partition + * + * @param fs A file system + * @param part A block device + * + * @returns 0 if successful, non-0 when not successful + */ + int reformat_partition(FileSystem *fs, BlockDevice* part); + + /** + * Test whether the file system is functional. + * This unmounts, then mounts the file system against the block device + * + * If the file system cannot be unmounted, this will be ignored. + * + * @param fs A file system + * @param part A block device + * + * @returns 0 if successful, non-0 when not successful + */ + int test_filesystem(FileSystem *fs, BlockDevice* part); + + BlockDevice *_bd; + FileSystem *_fs; + + FileSystem *fs1; + FileSystem *fs2; + BlockDevice *part1; + BlockDevice *part2; +}; + +#endif // SIMPLEMBEDCLOUDCLIENT_STORAGEHELPER_H_