Generic Pelion Device Management example for various U-blox-based boards.

Dependencies:   ublox-at-cellular-interface ublox-cellular-base

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 great on the following platforms:

For Odin-W2 please go to Repository link

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

UBLOX_C030_U201

UBLOX_C030_R412M

Example functionality

This example showcases the following device functionality:

  • 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.
  • (currently disabled) Read ADC temperature and ADC vref, and report them as Pelion LWM2M resources.

Use this example with Mbed CLI

1. Import the application into your desktop:

mbed import https://os.mbed.com/teams/ublox/code/pelion-example-common

cd pelion-example-common

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 <TARGET_BOARD>

(supported toolchains : GCC_ARM / ARM / IAR)

Committer:
screamer
Date:
Mon Dec 10 21:58:43 2018 +0000
Revision:
0:a076a1bbe630
Initial revision

Who changed what in which revision?

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