Mbed OS and Pelion Device Management example over WIFI for DISCO_L475VG_IOT01 board

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

DEPRECATED

This example application is not maintained and not recommended. It uses an old version of Mbed OS, Pelion DM and Arm toolchain. It doesn't work with Mbed Studio.

Please use: https://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-pelion/

This example is known to work on the following platforms:

DISCO_L475E_IOT01A

Follow the Quick-Start instructions: https://cloud.mbed.com/quick-start

Example functionality

This example showcases the following device functionality:

  • Read onboard temperature and humidity sensors, and report them as Pelion LWM2M resources (see image below).
  • On user button click, increment Pelion LWM2M button resource.
  • Allow the user to change the state of the board LED from Pelion LWM2M led_state resource and PUT request.
  • Uses all onboard sensors and reports them as Pelion LWM2M resources.

/media/uploads/screamer/pelion_st_humidity_reading.png?v=2

Use this example with Mbed CLI

1. Import the application into your desktop:

mbed import https://os.mbed.com/teams/ST/code/pelion-example-disco-iot01

cd pelion-example-disco-iot01

2. Install the CLOUD_SDK_API_KEY

mbed config -G CLOUD_SDK_API_KEY <PELION_DM_API_KEY>

For instructions on how to generate your API key, please see the documentation.

3. Initialize firmware credentials (done once per repository). You can use the following command:

mbed dm init -d "<your company name in Pelion DM>" --model-name "<product model identifier>" -q --force

If above command do not work for your Mbed CLI, please consider upgrading Mbed CLI to version 1.8.x or above.

4. Compile and program:

mbed compile -t <toolchain> -m DISCO_L475VG_IOT01A

(supported toolchains : GCC_ARM / ARM / IAR)

5. You can connect on a virtual terminal/COM port to the platform using:

mbed sterm -b 115200

This should give you an output similar to:

[BOOT] Mbed Bootloader
[BOOT] ARM: 00000000000000000000
[BOOT] OEM: 00000000000000000000
[BOOT] Layout: 0 80096F4
[BOOT] Active firmware integrity check:
[BOOT] SHA256: 0660E360D432225D5251461998FD8617B017098C5F1F90D5FB607BF8C27ED530
[BOOT] Version: 1553615309
[BOOT] Slot 0 is empty
[BOOT] Active firmware up-to-date
[BOOT] Application's start address: 0x8010400
[BOOT] Application's jump address: 0x8011041
[BOOT] Application's stack address: 0x20018000
[BOOT] Forwarding to application...

Starting Simple Pelion Device Management Client example
You can hold the user button during boot to format the storage and change the device identity.

Sensors configuration:
Invalid new address!
HTS221  humidity & temperature    = 0xBC
LPS22HB pressure & temperature    = 0xB1
LIS3MDL magnetometer              = 0x3D
LSM6DSL accelerometer & gyroscope = 0x6A

Connecting to the network using Wifi...
Connected to the network successfully. IP address: 192.168.1.3
Initializing Pelion Device Management Client...
Initialized Pelion Client. Registering...
Registered to Pelion Device Management. Endpoint Name: 0169********************001002d5

ADC temp:     23.0037 C,  vref:      0.3661 V
HTS221 temp:   28.700 C,  humidity:   31.90 %
LPS22HB temp:  29.600 C,  pressure: 1032.01 mbar
LIS3MDL mag:    0.217 x,  -0.284 y,  -0.053 z [gauss]
LSM6DSL acc:    0.005 x,  -0.014 y,   1.029 z [g]
LSM6DSL gyro:   0.910 x,  -0.910 y,   1.120 z [dps]
VL53L0X dist:    1855 mm
Committer:
screamer
Date:
Mon Mar 11 11:28:07 2019 +0000
Revision:
31:da14aa77f977
Parent:
10:b27c962b3c3f
Revert back to Mbed OS 5.10.4 due to issues to fit in RAM2 on GCC_ARM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 10:b27c962b3c3f 1 /* mbed Microcontroller Library
screamer 10:b27c962b3c3f 2 * Copyright (c) 2018 ARM Limited
screamer 10:b27c962b3c3f 3 *
screamer 10:b27c962b3c3f 4 * Licensed under the Apache License, Version 2.0 (the "License");
screamer 10:b27c962b3c3f 5 * you may not use this file except in compliance with the License.
screamer 10:b27c962b3c3f 6 * You may obtain a copy of the License at
screamer 10:b27c962b3c3f 7 *
screamer 10:b27c962b3c3f 8 * http://www.apache.org/licenses/LICENSE-2.0
screamer 10:b27c962b3c3f 9 *
screamer 10:b27c962b3c3f 10 * Unless required by applicable law or agreed to in writing, software
screamer 10:b27c962b3c3f 11 * distributed under the License is distributed on an "AS IS" BASIS,
screamer 10:b27c962b3c3f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 10:b27c962b3c3f 13 * See the License for the specific language governing permissions and
screamer 10:b27c962b3c3f 14 * limitations under the License.
screamer 10:b27c962b3c3f 15 */
screamer 10:b27c962b3c3f 16 #ifndef MBED_QSPIF_BLOCK_DEVICE_H
screamer 10:b27c962b3c3f 17 #define MBED_QSPIF_BLOCK_DEVICE_H
screamer 10:b27c962b3c3f 18
screamer 10:b27c962b3c3f 19 #include "QSPI.h"
screamer 10:b27c962b3c3f 20 #include "BlockDevice.h"
screamer 10:b27c962b3c3f 21
screamer 10:b27c962b3c3f 22 /** Enum qspif standard error codes
screamer 10:b27c962b3c3f 23 *
screamer 10:b27c962b3c3f 24 * @enum qspif_bd_error
screamer 10:b27c962b3c3f 25 */
screamer 10:b27c962b3c3f 26 enum qspif_bd_error {
screamer 10:b27c962b3c3f 27 QSPIF_BD_ERROR_OK = 0, /*!< no error */
screamer 10:b27c962b3c3f 28 QSPIF_BD_ERROR_DEVICE_ERROR = BD_ERROR_DEVICE_ERROR, /*!< device specific error -4001 */
screamer 10:b27c962b3c3f 29 QSPIF_BD_ERROR_PARSING_FAILED = -4002, /* SFDP Parsing failed */
screamer 10:b27c962b3c3f 30 QSPIF_BD_ERROR_READY_FAILED = -4003, /* Wait for Mem Ready failed */
screamer 10:b27c962b3c3f 31 QSPIF_BD_ERROR_WREN_FAILED = -4004, /* Write Enable Failed */
screamer 10:b27c962b3c3f 32 QSPIF_BD_ERROR_INVALID_ERASE_PARAMS = -4005, /* Erase command not on sector aligned addresses or exceeds device size */
screamer 10:b27c962b3c3f 33 QSPIF_BD_ERROR_DEVICE_NOT_UNIQE = -4006, /* Only one instance per csel is allowed */
screamer 10:b27c962b3c3f 34 QSPIF_BD_ERROR_DEVICE_MAX_EXCEED = -4007 /* Max active QSPIF devices exceeded */
screamer 10:b27c962b3c3f 35 };
screamer 10:b27c962b3c3f 36
screamer 10:b27c962b3c3f 37 /** Enum qspif polarity mode
screamer 10:b27c962b3c3f 38 *
screamer 10:b27c962b3c3f 39 * @enum qspif_polarity_mode
screamer 10:b27c962b3c3f 40 */
screamer 10:b27c962b3c3f 41 enum qspif_polarity_mode {
screamer 10:b27c962b3c3f 42 QSPIF_POLARITY_MODE_0 = 0, /* CPOL=0, CPHA=0 */
screamer 10:b27c962b3c3f 43 QSPIF_POLARITY_MODE_1 /* CPOL=1, CPHA=1 */
screamer 10:b27c962b3c3f 44 };
screamer 10:b27c962b3c3f 45
screamer 10:b27c962b3c3f 46 #define QSPIF_MAX_REGIONS 10
screamer 10:b27c962b3c3f 47 #define MAX_NUM_OF_ERASE_TYPES 4
screamer 10:b27c962b3c3f 48 #define QSPIF_MAX_ACTIVE_FLASH_DEVICES 10
screamer 10:b27c962b3c3f 49
screamer 10:b27c962b3c3f 50 /** BlockDevice for SFDP based flash devices over QSPI bus
screamer 10:b27c962b3c3f 51 *
screamer 10:b27c962b3c3f 52 * @code
screamer 10:b27c962b3c3f 53 * // Here's an example using QSPI flash device on DISCO_L476VG target
screamer 10:b27c962b3c3f 54 * #include "mbed.h"
screamer 10:b27c962b3c3f 55 * #include "QSPIFBlockDevice.h"
screamer 10:b27c962b3c3f 56 *
screamer 10:b27c962b3c3f 57 * QSPIFBlockDevice block_device(QSPI_FLASH1_IO0, QSPI_FLASH1_IO1, QSPI_FLASH1_IO2, QSPI_FLASH1_IO3,
screamer 10:b27c962b3c3f 58 * QSPI_FLASH1_SCK, QSPI_FLASH1_CSN, QSPIF_POLARITY_MODE_0, MBED_CONF_QSPIF_QSPI_FREQ);
screamer 10:b27c962b3c3f 59 *
screamer 10:b27c962b3c3f 60 * int main()
screamer 10:b27c962b3c3f 61 * {
screamer 10:b27c962b3c3f 62 * printf("QSPI SFDP Flash Block Device example\n");
screamer 10:b27c962b3c3f 63 *
screamer 10:b27c962b3c3f 64 * // Initialize the SPI flash device and print the memory layout
screamer 10:b27c962b3c3f 65 * block_device.init();
screamer 10:b27c962b3c3f 66 * bd_size_t sector_size_at_address_0 = block_device.get_erase_size(0);
screamer 10:b27c962b3c3f 67 *
screamer 10:b27c962b3c3f 68 * printf("QSPIF BD size: %llu\n", block_device.size());
screamer 10:b27c962b3c3f 69 * printf("QSPIF BD read size: %llu\n", block_device.get_read_size());
screamer 10:b27c962b3c3f 70 * printf("QSPIF BD program size: %llu\n", block_device.get_program_size());
screamer 10:b27c962b3c3f 71 * printf("QSPIF BD erase size (at address 0): %llu\n", sector_size_at_address_0);
screamer 10:b27c962b3c3f 72 *
screamer 10:b27c962b3c3f 73 * // Write "Hello World!" to the first block
screamer 10:b27c962b3c3f 74 * char *buffer = (char *) malloc(sector_size_at_address_0);
screamer 10:b27c962b3c3f 75 * sprintf(buffer, "Hello World!\n");
screamer 10:b27c962b3c3f 76 * block_device.erase(0, sector_size_at_address_0);
screamer 10:b27c962b3c3f 77 * block_device.program(buffer, 0, sector_size_at_address_0);
screamer 10:b27c962b3c3f 78 *
screamer 10:b27c962b3c3f 79 * // Read back what was stored
screamer 10:b27c962b3c3f 80 * block_device.read(buffer, 0, sector_size_at_address_0);
screamer 10:b27c962b3c3f 81 * printf("%s", buffer);
screamer 10:b27c962b3c3f 82 *
screamer 10:b27c962b3c3f 83 * // Deinitialize the device
screamer 10:b27c962b3c3f 84 * block_device.deinit();
screamer 10:b27c962b3c3f 85 * }
screamer 10:b27c962b3c3f 86 * @endcode
screamer 10:b27c962b3c3f 87 */
screamer 10:b27c962b3c3f 88 class QSPIFBlockDevice : public BlockDevice {
screamer 10:b27c962b3c3f 89 public:
screamer 10:b27c962b3c3f 90 /** Create QSPIFBlockDevice - An SFDP based Flash Block Device over QSPI bus
screamer 10:b27c962b3c3f 91 *
screamer 10:b27c962b3c3f 92 * @param io0 1st IO pin used for sending/receiving data during data phase of a transaction
screamer 10:b27c962b3c3f 93 * @param io1 2nd IO pin used for sending/receiving data during data phase of a transaction
screamer 10:b27c962b3c3f 94 * @param io2 3rd IO pin used for sending/receiving data during data phase of a transaction
screamer 10:b27c962b3c3f 95 * @param io3 4th IO pin used for sending/receiving data during data phase of a transaction
screamer 10:b27c962b3c3f 96 * @param sclk QSPI Clock pin
screamer 10:b27c962b3c3f 97 * @param csel QSPI chip select pin
screamer 10:b27c962b3c3f 98 * @param clock_mode specifies the QSPI Clock Polarity mode (QSPIF_POLARITY_MODE_0/QSPIF_POLARITY_MODE_1)
screamer 10:b27c962b3c3f 99 * default value = 0
screamer 10:b27c962b3c3f 100 * @param freq Clock frequency of the QSPI bus (defaults to 40MHz)
screamer 10:b27c962b3c3f 101 *
screamer 10:b27c962b3c3f 102 */
screamer 10:b27c962b3c3f 103 QSPIFBlockDevice(PinName io0, PinName io1, PinName io2, PinName io3, PinName sclk, PinName csel,
screamer 10:b27c962b3c3f 104 int clock_mode, int freq = MBED_CONF_QSPIF_QSPI_FREQ);
screamer 10:b27c962b3c3f 105
screamer 10:b27c962b3c3f 106 /** Initialize a block device
screamer 10:b27c962b3c3f 107 *
screamer 10:b27c962b3c3f 108 * @return QSPIF_BD_ERROR_OK(0) - success
screamer 10:b27c962b3c3f 109 * QSPIF_BD_ERROR_DEVICE_ERROR - device driver transaction failed
screamer 10:b27c962b3c3f 110 * QSPIF_BD_ERROR_READY_FAILED - Waiting for Memory ready failed or timedout
screamer 10:b27c962b3c3f 111 * QSPIF_BD_ERROR_PARSING_FAILED - unexpected format or values in one of the SFDP tables
screamer 10:b27c962b3c3f 112 */
screamer 10:b27c962b3c3f 113 virtual int init();
screamer 10:b27c962b3c3f 114
screamer 10:b27c962b3c3f 115 /** Deinitialize a block device
screamer 10:b27c962b3c3f 116 *
screamer 10:b27c962b3c3f 117 * @return QSPIF_BD_ERROR_OK(0) - success
screamer 10:b27c962b3c3f 118 * QSPIF_BD_ERROR_DEVICE_ERROR - device driver transaction failed
screamer 10:b27c962b3c3f 119 */
screamer 10:b27c962b3c3f 120 virtual int deinit();
screamer 10:b27c962b3c3f 121
screamer 10:b27c962b3c3f 122 /** Desctruct QSPIFBlockDevie
screamer 10:b27c962b3c3f 123 */
screamer 10:b27c962b3c3f 124 ~QSPIFBlockDevice()
screamer 10:b27c962b3c3f 125 {
screamer 10:b27c962b3c3f 126 deinit();
screamer 10:b27c962b3c3f 127 }
screamer 10:b27c962b3c3f 128
screamer 10:b27c962b3c3f 129 /** Read blocks from a block device
screamer 10:b27c962b3c3f 130 *
screamer 10:b27c962b3c3f 131 * @param buffer Buffer to write blocks to
screamer 10:b27c962b3c3f 132 * @param addr Address of block to begin reading from
screamer 10:b27c962b3c3f 133 * @param size Size to read in bytes, must be a multiple of read block size
screamer 10:b27c962b3c3f 134 * @return QSPIF_BD_ERROR_OK(0) - success
screamer 10:b27c962b3c3f 135 * QSPIF_BD_ERROR_DEVICE_ERROR - device driver transaction failed
screamer 10:b27c962b3c3f 136 */
screamer 10:b27c962b3c3f 137 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
screamer 10:b27c962b3c3f 138
screamer 10:b27c962b3c3f 139 /** Program blocks to a block device
screamer 10:b27c962b3c3f 140 *
screamer 10:b27c962b3c3f 141 * The blocks must have been erased prior to being programmed
screamer 10:b27c962b3c3f 142 *
screamer 10:b27c962b3c3f 143 * @param buffer Buffer of data to write to blocks
screamer 10:b27c962b3c3f 144 * @param addr Address of block to begin writing to
screamer 10:b27c962b3c3f 145 * @param size Size to write in bytes, must be a multiple of program block size
screamer 10:b27c962b3c3f 146 * @return QSPIF_BD_ERROR_OK(0) - success
screamer 10:b27c962b3c3f 147 * QSPIF_BD_ERROR_DEVICE_ERROR - device driver transaction failed
screamer 10:b27c962b3c3f 148 * QSPIF_BD_ERROR_READY_FAILED - Waiting for Memory ready failed or timed out
screamer 10:b27c962b3c3f 149 * QSPIF_BD_ERROR_WREN_FAILED - Write Enable failed
screamer 10:b27c962b3c3f 150 * QSPIF_BD_ERROR_PARSING_FAILED - unexpected format or values in one of the SFDP tables
screamer 10:b27c962b3c3f 151 */
screamer 10:b27c962b3c3f 152 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
screamer 10:b27c962b3c3f 153
screamer 10:b27c962b3c3f 154 /** Erase blocks on a block device
screamer 10:b27c962b3c3f 155 *
screamer 10:b27c962b3c3f 156 * The state of an erased block is undefined until it has been programmed
screamer 10:b27c962b3c3f 157 *
screamer 10:b27c962b3c3f 158 * @param addr Address of block to begin erasing
screamer 10:b27c962b3c3f 159 * @param size Size to erase in bytes, must be a multiple of erase block size
screamer 10:b27c962b3c3f 160 * @return QSPIF_BD_ERROR_OK(0) - success
screamer 10:b27c962b3c3f 161 * QSPIF_BD_ERROR_DEVICE_ERROR - device driver transaction failed
screamer 10:b27c962b3c3f 162 * QSPIF_BD_ERROR_READY_FAILED - Waiting for Memory ready failed or timed out
screamer 10:b27c962b3c3f 163 * QSPIF_BD_ERROR_WREN_FAILED - Write Enable failed
screamer 10:b27c962b3c3f 164 * QSPIF_BD_ERROR_PARSING_FAILED - unexpected format or values in one of the SFDP tables
screamer 10:b27c962b3c3f 165 * QSPIF_BD_ERROR_INVALID_ERASE_PARAMS - Trying to erase unaligned address or size
screamer 10:b27c962b3c3f 166 */
screamer 10:b27c962b3c3f 167 virtual int erase(bd_addr_t addr, bd_size_t size);
screamer 10:b27c962b3c3f 168
screamer 10:b27c962b3c3f 169 /** Get the size of a readable block
screamer 10:b27c962b3c3f 170 *
screamer 10:b27c962b3c3f 171 * @return Size of a readable block in bytes
screamer 10:b27c962b3c3f 172 */
screamer 10:b27c962b3c3f 173 virtual bd_size_t get_read_size() const;
screamer 10:b27c962b3c3f 174
screamer 10:b27c962b3c3f 175 /** Get the size of a programable block
screamer 10:b27c962b3c3f 176 *
screamer 10:b27c962b3c3f 177 * @return Size of a program block size in bytes
screamer 10:b27c962b3c3f 178 * @note Must be a multiple of the read size
screamer 10:b27c962b3c3f 179 */
screamer 10:b27c962b3c3f 180 virtual bd_size_t get_program_size() const;
screamer 10:b27c962b3c3f 181
screamer 10:b27c962b3c3f 182 /** Get the size of a eraseable block
screamer 10:b27c962b3c3f 183 *
screamer 10:b27c962b3c3f 184 * @return Size of a minimal erase block, common to all regions, in bytes
screamer 10:b27c962b3c3f 185 * @note Must be a multiple of the program size
screamer 10:b27c962b3c3f 186 */
screamer 10:b27c962b3c3f 187 virtual bd_size_t get_erase_size() const;
screamer 10:b27c962b3c3f 188
screamer 10:b27c962b3c3f 189 /** Get the size of minimal eraseable sector size of given address
screamer 10:b27c962b3c3f 190 *
screamer 10:b27c962b3c3f 191 * @param addr Any address within block queried for erase sector size (can be any address within flash size offset)
screamer 10:b27c962b3c3f 192 * @return Size of minimal erase sector size, in given address region, in bytes
screamer 10:b27c962b3c3f 193 * @note Must be a multiple of the program size
screamer 10:b27c962b3c3f 194 */
screamer 10:b27c962b3c3f 195 virtual bd_size_t get_erase_size(bd_addr_t addr);
screamer 10:b27c962b3c3f 196
screamer 10:b27c962b3c3f 197 /** Get the value of storage byte after it was erased
screamer 10:b27c962b3c3f 198 *
screamer 10:b27c962b3c3f 199 * If get_erase_value returns a non-negative byte value, the underlying
screamer 10:b27c962b3c3f 200 * storage is set to that value when erased, and storage containing
screamer 10:b27c962b3c3f 201 * that value can be programmed without another erase.
screamer 10:b27c962b3c3f 202 *
screamer 10:b27c962b3c3f 203 * @return The value of storage when erased, or -1 if you can't
screamer 10:b27c962b3c3f 204 * rely on the value of erased storage
screamer 10:b27c962b3c3f 205 */
screamer 10:b27c962b3c3f 206 virtual int get_erase_value() const;
screamer 10:b27c962b3c3f 207
screamer 10:b27c962b3c3f 208 /** Get the total size of the underlying device
screamer 10:b27c962b3c3f 209 *
screamer 10:b27c962b3c3f 210 * @return Size of the underlying device in bytes
screamer 10:b27c962b3c3f 211 */
screamer 10:b27c962b3c3f 212 virtual bd_size_t size() const;
screamer 10:b27c962b3c3f 213
screamer 10:b27c962b3c3f 214 private:
screamer 10:b27c962b3c3f 215 // Internal functions
screamer 10:b27c962b3c3f 216
screamer 10:b27c962b3c3f 217
screamer 10:b27c962b3c3f 218 /********************************/
screamer 10:b27c962b3c3f 219 /* Different Device Csel Mgmt */
screamer 10:b27c962b3c3f 220 /********************************/
screamer 10:b27c962b3c3f 221 // Add a new QSPI device CS to existing devices list.
screamer 10:b27c962b3c3f 222 // Only one QSPIFBlockDevice instance per CS is allowed
screamer 10:b27c962b3c3f 223 int add_new_csel_instance(PinName csel);
screamer 10:b27c962b3c3f 224
screamer 10:b27c962b3c3f 225 // Remove device CS from existing device list upon destroying object (last deinit is called)
screamer 10:b27c962b3c3f 226 int remove_csel_instance(PinName csel);
screamer 10:b27c962b3c3f 227
screamer 10:b27c962b3c3f 228 /********************************/
screamer 10:b27c962b3c3f 229 /* Calls to QSPI Driver APIs */
screamer 10:b27c962b3c3f 230 /********************************/
screamer 10:b27c962b3c3f 231 // Send Program => Write command to Driver
screamer 10:b27c962b3c3f 232 qspi_status_t _qspi_send_program_command(unsigned int prog_instruction, const void *buffer, bd_addr_t addr,
screamer 10:b27c962b3c3f 233 bd_size_t *size);
screamer 10:b27c962b3c3f 234
screamer 10:b27c962b3c3f 235 // Send Read command to Driver
screamer 10:b27c962b3c3f 236 qspi_status_t _qspi_send_read_command(unsigned int read_instruction, void *buffer, bd_addr_t addr, bd_size_t size);
screamer 10:b27c962b3c3f 237
screamer 10:b27c962b3c3f 238 // Send Erase Instruction using command_transfer command to Driver
screamer 10:b27c962b3c3f 239 qspi_status_t _qspi_send_erase_command(unsigned int erase_instruction, bd_addr_t addr, bd_size_t size);
screamer 10:b27c962b3c3f 240
screamer 10:b27c962b3c3f 241 // Send Generic command_transfer command to Driver
screamer 10:b27c962b3c3f 242 qspi_status_t _qspi_send_general_command(unsigned int instruction_int, bd_addr_t addr, const char *tx_buffer,
screamer 10:b27c962b3c3f 243 size_t tx_length, const char *rx_buffer, size_t rx_length);
screamer 10:b27c962b3c3f 244
screamer 10:b27c962b3c3f 245 // Send Bus configure_format command to Driver
screamer 10:b27c962b3c3f 246 qspi_status_t _qspi_configure_format(qspi_bus_width_t inst_width, qspi_bus_width_t address_width,
screamer 10:b27c962b3c3f 247 qspi_address_size_t address_size, qspi_bus_width_t alt_width, qspi_alt_size_t alt_size, qspi_bus_width_t data_width,
screamer 10:b27c962b3c3f 248 int dummy_cycles);
screamer 10:b27c962b3c3f 249
screamer 10:b27c962b3c3f 250 // Send set_frequency command to Driver
screamer 10:b27c962b3c3f 251 qspi_status_t _qspi_set_frequency(int freq);
screamer 10:b27c962b3c3f 252
screamer 10:b27c962b3c3f 253 /*********************************/
screamer 10:b27c962b3c3f 254 /* Flash Configuration Functions */
screamer 10:b27c962b3c3f 255 /*********************************/
screamer 10:b27c962b3c3f 256 // Soft Reset Flash Memory
screamer 10:b27c962b3c3f 257 int _reset_flash_mem();
screamer 10:b27c962b3c3f 258
screamer 10:b27c962b3c3f 259 // Configure Write Enable in Status Register
screamer 10:b27c962b3c3f 260 int _set_write_enable();
screamer 10:b27c962b3c3f 261
screamer 10:b27c962b3c3f 262 // Wait on status register until write not-in-progress
screamer 10:b27c962b3c3f 263 bool _is_mem_ready();
screamer 10:b27c962b3c3f 264
screamer 10:b27c962b3c3f 265 // Enable Fast Mode - for flash chips with low power default
screamer 10:b27c962b3c3f 266 int _enable_fast_mdoe();
screamer 10:b27c962b3c3f 267
screamer 10:b27c962b3c3f 268 /****************************************/
screamer 10:b27c962b3c3f 269 /* SFDP Detection and Parsing Functions */
screamer 10:b27c962b3c3f 270 /****************************************/
screamer 10:b27c962b3c3f 271 // Parse SFDP Headers and retrieve Basic Param and Sector Map Tables (if exist)
screamer 10:b27c962b3c3f 272 int _sfdp_parse_sfdp_headers(uint32_t &basic_table_addr, size_t &basic_table_size,
screamer 10:b27c962b3c3f 273 uint32_t &sector_map_table_addr, size_t &sector_map_table_size);
screamer 10:b27c962b3c3f 274
screamer 10:b27c962b3c3f 275 // Parse and Detect required Basic Parameters from Table
screamer 10:b27c962b3c3f 276 int _sfdp_parse_basic_param_table(uint32_t basic_table_addr, size_t basic_table_size);
screamer 10:b27c962b3c3f 277
screamer 10:b27c962b3c3f 278 // Parse and read information required by Regions Secotr Map
screamer 10:b27c962b3c3f 279 int _sfdp_parse_sector_map_table(uint32_t sector_map_table_addr, size_t sector_map_table_size);
screamer 10:b27c962b3c3f 280
screamer 10:b27c962b3c3f 281 // Detect fastest read Bus mode supported by device
screamer 10:b27c962b3c3f 282 int _sfdp_detect_best_bus_read_mode(uint8_t *basic_param_table_ptr, int basic_param_table_size, bool &set_quad_enable,
screamer 10:b27c962b3c3f 283 bool &is_qpi_mode, unsigned int &read_inst);
screamer 10:b27c962b3c3f 284
screamer 10:b27c962b3c3f 285 // Enable Quad mode if supported (1-1-4, 1-4-4, 4-4-4 bus modes)
screamer 10:b27c962b3c3f 286 int _sfdp_set_quad_enabled(uint8_t *basic_param_table_ptr);
screamer 10:b27c962b3c3f 287
screamer 10:b27c962b3c3f 288 // Enable QPI mode (4-4-4) is supported
screamer 10:b27c962b3c3f 289 int _sfdp_set_qpi_enabled(uint8_t *basic_param_table_ptr);
screamer 10:b27c962b3c3f 290
screamer 10:b27c962b3c3f 291 // Set Page size for program
screamer 10:b27c962b3c3f 292 int _sfdp_detect_page_size(uint8_t *basic_param_table_ptr, int basic_param_table_size);
screamer 10:b27c962b3c3f 293
screamer 10:b27c962b3c3f 294 // Detect all supported erase types
screamer 10:b27c962b3c3f 295 int _sfdp_detect_erase_types_inst_and_size(uint8_t *basic_param_table_ptr, int basic_param_table_size,
screamer 10:b27c962b3c3f 296 unsigned int &erase4k_inst,
screamer 10:b27c962b3c3f 297 unsigned int *erase_type_inst_arr, unsigned int *erase_type_size_arr);
screamer 10:b27c962b3c3f 298
screamer 10:b27c962b3c3f 299 /***********************/
screamer 10:b27c962b3c3f 300 /* Utilities Functions */
screamer 10:b27c962b3c3f 301 /***********************/
screamer 10:b27c962b3c3f 302 // Find the region to which the given offset belong to
screamer 10:b27c962b3c3f 303 int _utils_find_addr_region(bd_size_t offset);
screamer 10:b27c962b3c3f 304
screamer 10:b27c962b3c3f 305 // Iterate on all supported Erase Types of the Region to which the offset belong to.
screamer 10:b27c962b3c3f 306 // Iterates from highest type to lowest
screamer 10:b27c962b3c3f 307 int _utils_iterate_next_largest_erase_type(uint8_t &bitfield, int size, int offset, int boundry);
screamer 10:b27c962b3c3f 308
screamer 10:b27c962b3c3f 309 private:
screamer 10:b27c962b3c3f 310 // Internal Members
screamer 10:b27c962b3c3f 311
screamer 10:b27c962b3c3f 312 // QSPI Driver Object
screamer 10:b27c962b3c3f 313 mbed::QSPI _qspi;
screamer 10:b27c962b3c3f 314
screamer 10:b27c962b3c3f 315 // Static List of different QSPI based Flash devices csel that already exist
screamer 10:b27c962b3c3f 316 // Each QSPI Flash device csel can have only 1 QSPIFBlockDevice instance
screamer 10:b27c962b3c3f 317 // _devices_mutex is used to lock csel list - only one QSPIFBlockDevice instance per csel is allowed
screamer 10:b27c962b3c3f 318 static SingletonPtr<PlatformMutex> _devices_mutex;
screamer 10:b27c962b3c3f 319 static int _number_of_active_qspif_flash_csel;
screamer 10:b27c962b3c3f 320 static PinName *_active_qspif_flash_csel_arr;
screamer 10:b27c962b3c3f 321
screamer 10:b27c962b3c3f 322 int _unique_device_status;
screamer 10:b27c962b3c3f 323 PinName _csel;
screamer 10:b27c962b3c3f 324
screamer 10:b27c962b3c3f 325 // Mutex is used to protect Flash device for some QSPI Driver commands that must be done sequentially with no other commands in between
screamer 10:b27c962b3c3f 326 // e.g. (1)Set Write Enable, (2)Program, (3)Wait Memory Ready
screamer 10:b27c962b3c3f 327 PlatformMutex _mutex;
screamer 10:b27c962b3c3f 328
screamer 10:b27c962b3c3f 329 // Command Instructions
screamer 10:b27c962b3c3f 330 unsigned int _read_instruction;
screamer 10:b27c962b3c3f 331 unsigned int _prog_instruction;
screamer 10:b27c962b3c3f 332 unsigned int _erase_instruction;
screamer 10:b27c962b3c3f 333 unsigned int _erase4k_inst; // Legacy 4K erase instruction (default 0x20h)
screamer 10:b27c962b3c3f 334 unsigned int _write_register_inst; // Write status/config register instruction may vary between chips
screamer 10:b27c962b3c3f 335 unsigned int _read_register_inst; // Read status/config register instruction may vary between chips
screamer 10:b27c962b3c3f 336
screamer 10:b27c962b3c3f 337 // Up To 4 Erase Types are supported by SFDP (each with its own command Instruction and Size)
screamer 10:b27c962b3c3f 338 unsigned int _erase_type_inst_arr[MAX_NUM_OF_ERASE_TYPES];
screamer 10:b27c962b3c3f 339 unsigned int _erase_type_size_arr[MAX_NUM_OF_ERASE_TYPES];
screamer 10:b27c962b3c3f 340
screamer 10:b27c962b3c3f 341 // Sector Regions Map
screamer 10:b27c962b3c3f 342 int _regions_count; //number of regions
screamer 10:b27c962b3c3f 343 int _region_size_bytes[QSPIF_MAX_REGIONS]; //regions size in bytes
screamer 10:b27c962b3c3f 344 bd_size_t _region_high_boundary[QSPIF_MAX_REGIONS]; //region high address offset boundary
screamer 10:b27c962b3c3f 345 //Each Region can support a bit combination of any of the 4 Erase Types
screamer 10:b27c962b3c3f 346 uint8_t _region_erase_types_bitfield[QSPIF_MAX_REGIONS];
screamer 10:b27c962b3c3f 347 unsigned int _min_common_erase_size; // minimal common erase size for all regions (0 if none exists)
screamer 10:b27c962b3c3f 348
screamer 10:b27c962b3c3f 349 unsigned int _page_size_bytes; // Page size - 256 Bytes default
screamer 10:b27c962b3c3f 350 int _freq;
screamer 10:b27c962b3c3f 351 bd_size_t _device_size_bytes;
screamer 10:b27c962b3c3f 352
screamer 10:b27c962b3c3f 353 // Bus speed configuration
screamer 10:b27c962b3c3f 354 qspi_bus_width_t _inst_width; //Bus width for Instruction phase
screamer 10:b27c962b3c3f 355 qspi_bus_width_t _address_width; //Bus width for Address phase
screamer 10:b27c962b3c3f 356 qspi_address_size_t _address_size; // number of bytes for address
screamer 10:b27c962b3c3f 357 qspi_bus_width_t _data_width; //Bus width for Data phase
screamer 10:b27c962b3c3f 358 int _dummy_and_mode_cycles; // Number of Dummy and Mode Bits required by Current Bus Mode
screamer 10:b27c962b3c3f 359
screamer 10:b27c962b3c3f 360 uint32_t _init_ref_count;
screamer 10:b27c962b3c3f 361 bool _is_initialized;
screamer 10:b27c962b3c3f 362 };
screamer 10:b27c962b3c3f 363
screamer 10:b27c962b3c3f 364 #endif