Simulated product dispenser

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Committer:
JimCarver
Date:
Thu Oct 25 14:00:12 2018 +0000
Revision:
4:e518dde96e59
Parent:
0:6b753f761943
Simulated dispenser

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JimCarver 0:6b753f761943 1 /* mbed Microcontroller Library
JimCarver 0:6b753f761943 2 * Copyright (c) 2016 ARM Limited
JimCarver 0:6b753f761943 3 *
JimCarver 0:6b753f761943 4 * Licensed under the Apache License, Version 2.0 (the "License");
JimCarver 0:6b753f761943 5 * you may not use this file except in compliance with the License.
JimCarver 0:6b753f761943 6 * You may obtain a copy of the License at
JimCarver 0:6b753f761943 7 *
JimCarver 0:6b753f761943 8 * http://www.apache.org/licenses/LICENSE-2.0
JimCarver 0:6b753f761943 9 *
JimCarver 0:6b753f761943 10 * Unless required by applicable law or agreed to in writing, software
JimCarver 0:6b753f761943 11 * distributed under the License is distributed on an "AS IS" BASIS,
JimCarver 0:6b753f761943 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
JimCarver 0:6b753f761943 13 * See the License for the specific language governing permissions and
JimCarver 0:6b753f761943 14 * limitations under the License.
JimCarver 0:6b753f761943 15 */
JimCarver 0:6b753f761943 16 #ifndef MBED_QSPIF_BLOCK_DEVICE_H
JimCarver 0:6b753f761943 17 #define MBED_QSPIF_BLOCK_DEVICE_H
JimCarver 0:6b753f761943 18
JimCarver 0:6b753f761943 19
JimCarver 0:6b753f761943 20 #define DEVICE_QSPI 1
JimCarver 0:6b753f761943 21
JimCarver 0:6b753f761943 22 #include <mbed.h>
JimCarver 0:6b753f761943 23 #include "BlockDevice.h"
JimCarver 0:6b753f761943 24 #include "QSPI.h"
JimCarver 0:6b753f761943 25
JimCarver 0:6b753f761943 26 #define QSPIF_MAX_REGIONS 4
JimCarver 0:6b753f761943 27
JimCarver 0:6b753f761943 28 class QSPIFBlockDevice : public BlockDevice {
JimCarver 0:6b753f761943 29 public:
JimCarver 0:6b753f761943 30 /** Creates a QSPIFBlockDevice on a SPI bus specified by pins
JimCarver 0:6b753f761943 31 *
JimCarver 0:6b753f761943 32 * @param mosi SPI master out, slave in pin
JimCarver 0:6b753f761943 33 * @param miso SPI master in, slave out pin
JimCarver 0:6b753f761943 34 * @param sclk SPI clock pin
JimCarver 0:6b753f761943 35 * @param csel SPI chip select pin
JimCarver 0:6b753f761943 36 * @param freq Clock speed of the SPI bus (defaults to 40MHz)
JimCarver 0:6b753f761943 37 */
JimCarver 0:6b753f761943 38
JimCarver 0:6b753f761943 39 /** Creates a QSPIFBlockDevice on an SPI bus specified by pins
JimCarver 0:6b753f761943 40 *
JimCarver 0:6b753f761943 41 * io0-io3 is used to specify the Pins used for Quad SPI mode
JimCarver 0:6b753f761943 42 *
JimCarver 0:6b753f761943 43 * @param io0 1st IO pin used for sending/receiving data during data phase of a transaction
JimCarver 0:6b753f761943 44 * @param io1 2nd IO pin used for sending/receiving data during data phase of a transaction
JimCarver 0:6b753f761943 45 * @param io2 3rd IO pin used for sending/receiving data during data phase of a transaction
JimCarver 0:6b753f761943 46 * @param io3 4th IO pin used for sending/receiving data during data phase of a transaction
JimCarver 0:6b753f761943 47 * @param sclk QSPI Clock pin
JimCarver 0:6b753f761943 48 * @param csel QSPI chip select pin
JimCarver 0:6b753f761943 49 * @param clock_mode specifies the SPI Clock Polarity mode(Mode=0 uses CPOL=0, CPHA=0, Mode=1 uses CPOL=1, CPHA=1)
JimCarver 0:6b753f761943 50 * default value = 0
JimCarver 0:6b753f761943 51 * @param freq Clock frequency of the SPI bus (defaults to 40MHz)
JimCarver 0:6b753f761943 52 *
JimCarver 0:6b753f761943 53 */
JimCarver 0:6b753f761943 54 QSPIFBlockDevice(PinName io0, PinName io1, PinName io2, PinName io3, PinName sclk, PinName csel, int clock_mode,
JimCarver 0:6b753f761943 55 int freq = 40000000);
JimCarver 0:6b753f761943 56
JimCarver 0:6b753f761943 57 /** Initialize a block device
JimCarver 0:6b753f761943 58 *
JimCarver 0:6b753f761943 59 * @return 0 on success or a negative error code on failure
JimCarver 0:6b753f761943 60 */
JimCarver 0:6b753f761943 61 virtual int init();
JimCarver 0:6b753f761943 62
JimCarver 0:6b753f761943 63 /** Deinitialize a block device
JimCarver 0:6b753f761943 64 *
JimCarver 0:6b753f761943 65 * @return 0 on success or a negative error code on failure
JimCarver 0:6b753f761943 66 */
JimCarver 0:6b753f761943 67 virtual int deinit();
JimCarver 0:6b753f761943 68
JimCarver 0:6b753f761943 69 /** Read blocks from a block device
JimCarver 0:6b753f761943 70 *
JimCarver 0:6b753f761943 71 * @param buffer Buffer to write blocks to
JimCarver 0:6b753f761943 72 * @param addr Address of block to begin reading from
JimCarver 0:6b753f761943 73 * @param size Size to read in bytes, must be a multiple of read block size
JimCarver 0:6b753f761943 74 * @return 0 on success, negative error code on failure
JimCarver 0:6b753f761943 75 */
JimCarver 0:6b753f761943 76 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
JimCarver 0:6b753f761943 77
JimCarver 0:6b753f761943 78 /** Program blocks to a block device
JimCarver 0:6b753f761943 79 *
JimCarver 0:6b753f761943 80 * The blocks must have been erased prior to being programmed
JimCarver 0:6b753f761943 81 *
JimCarver 0:6b753f761943 82 * @param buffer Buffer of data to write to blocks
JimCarver 0:6b753f761943 83 * @param addr Address of block to begin writing to
JimCarver 0:6b753f761943 84 * @param size Size to write in bytes, must be a multiple of program block size
JimCarver 0:6b753f761943 85 * @return 0 on success, negative error code on failure
JimCarver 0:6b753f761943 86 */
JimCarver 0:6b753f761943 87 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
JimCarver 0:6b753f761943 88
JimCarver 0:6b753f761943 89 /** Erase blocks on a block device
JimCarver 0:6b753f761943 90 *
JimCarver 0:6b753f761943 91 * The state of an erased block is undefined until it has been programmed
JimCarver 0:6b753f761943 92 *
JimCarver 0:6b753f761943 93 * @param addr Address of block to begin erasing
JimCarver 0:6b753f761943 94 * @param size Size to erase in bytes, must be a multiple of erase block size
JimCarver 0:6b753f761943 95 * @return 0 on success, negative error code on failure
JimCarver 0:6b753f761943 96 */
JimCarver 0:6b753f761943 97 virtual int erase(bd_addr_t addr, bd_size_t size);
JimCarver 0:6b753f761943 98
JimCarver 0:6b753f761943 99 /** Get the size of a readable block
JimCarver 0:6b753f761943 100 *
JimCarver 0:6b753f761943 101 * @return Size of a readable block in bytes
JimCarver 0:6b753f761943 102 */
JimCarver 0:6b753f761943 103 virtual bd_size_t get_read_size() const;
JimCarver 0:6b753f761943 104
JimCarver 0:6b753f761943 105 /** Get the size of a programable block
JimCarver 0:6b753f761943 106 *
JimCarver 0:6b753f761943 107 * @return Size of a programable block in bytes
JimCarver 0:6b753f761943 108 * @note Must be a multiple of the read size
JimCarver 0:6b753f761943 109 */
JimCarver 0:6b753f761943 110 virtual bd_size_t get_program_size() const;
JimCarver 0:6b753f761943 111
JimCarver 0:6b753f761943 112 /** Get the size of a eraseable block
JimCarver 0:6b753f761943 113 *
JimCarver 0:6b753f761943 114 * @return Size of a eraseable block in bytes
JimCarver 0:6b753f761943 115 * @note Must be a multiple of the program size
JimCarver 0:6b753f761943 116 */
JimCarver 0:6b753f761943 117 virtual bd_size_t get_erase_size() const;
JimCarver 0:6b753f761943 118
JimCarver 0:6b753f761943 119 /** Get the size of a eraseable block
JimCarver 0:6b753f761943 120 *
JimCarver 0:6b753f761943 121 * @param addr Address of block queried for erase sector size
JimCarver 0:6b753f761943 122 * @return Size of a eraseable sector in bytes
JimCarver 0:6b753f761943 123 * @note Must be a multiple of the program size
JimCarver 0:6b753f761943 124 */
JimCarver 0:6b753f761943 125 bd_size_t get_erase_size(bd_addr_t addr);
JimCarver 0:6b753f761943 126
JimCarver 0:6b753f761943 127 /** Get the total size of the underlying device
JimCarver 0:6b753f761943 128 *
JimCarver 0:6b753f761943 129 * @return Size of the underlying device in bytes
JimCarver 0:6b753f761943 130 */
JimCarver 0:6b753f761943 131 virtual bd_size_t size() const;
JimCarver 0:6b753f761943 132
JimCarver 0:6b753f761943 133 private:
JimCarver 0:6b753f761943 134 // Internal functions
JimCarver 0:6b753f761943 135
JimCarver 0:6b753f761943 136 /********************************/
JimCarver 0:6b753f761943 137 /* Calls to QSPI Driver APIs */
JimCarver 0:6b753f761943 138 /********************************/
JimCarver 0:6b753f761943 139 // Send Program => Write command to Driver
JimCarver 0:6b753f761943 140 qspi_status_t _qspiSendProgramCommand(unsigned int progInstruction, const void *buffer, bd_addr_t addr,
JimCarver 0:6b753f761943 141 bd_size_t *size);
JimCarver 0:6b753f761943 142
JimCarver 0:6b753f761943 143 // Send Read command to Driver
JimCarver 0:6b753f761943 144 qspi_status_t _qspiSendReadCommand(unsigned int readInstruction, void *buffer, bd_addr_t addr, bd_size_t size);
JimCarver 0:6b753f761943 145
JimCarver 0:6b753f761943 146 // Send Erase => command_transfer command to Driver
JimCarver 0:6b753f761943 147 qspi_status_t _qspiSendEraseCommand(unsigned int eraseInstruction, bd_addr_t addr, bd_size_t size);
JimCarver 0:6b753f761943 148
JimCarver 0:6b753f761943 149 // Send Generic command_transfer command to Driver
JimCarver 0:6b753f761943 150 qspi_status_t _qspiSendGeneralCommand(unsigned int instructionint, bd_addr_t addr, const char *tx_buffer,
JimCarver 0:6b753f761943 151 size_t tx_length, const char *rx_buffer, size_t rx_length);
JimCarver 0:6b753f761943 152
JimCarver 0:6b753f761943 153 // Send Bus configure_format command to Driver
JimCarver 0:6b753f761943 154 qspi_status_t _qspiConfiureFormat(qspi_bus_width_t inst_width, qspi_bus_width_t address_width,
JimCarver 0:6b753f761943 155 qspi_address_size_t address_size, qspi_bus_width_t alt_width, qspi_alt_size_t alt_size, qspi_bus_width_t data_width,
JimCarver 0:6b753f761943 156 int dummy_cycles);
JimCarver 0:6b753f761943 157
JimCarver 0:6b753f761943 158 // Send set_frequency command to Driver
JimCarver 0:6b753f761943 159 qspi_status_t _qspiSetFrequency(int freq);
JimCarver 0:6b753f761943 160 /********************************/
JimCarver 0:6b753f761943 161
JimCarver 0:6b753f761943 162
JimCarver 0:6b753f761943 163 // Verify registers and Reset Flash Memory
JimCarver 0:6b753f761943 164 int _resetFlashMem();
JimCarver 0:6b753f761943 165
JimCarver 0:6b753f761943 166 // Configure Write Enable in Status Register
JimCarver 0:6b753f761943 167 int _setWriteEnable();
JimCarver 0:6b753f761943 168
JimCarver 0:6b753f761943 169 // Wait on status register until write not-in-progress
JimCarver 0:6b753f761943 170 bool _isMemReady();
JimCarver 0:6b753f761943 171
JimCarver 0:6b753f761943 172
JimCarver 0:6b753f761943 173 /* SFDP Detection and Parsing Functions */
JimCarver 0:6b753f761943 174 /****************************************/
JimCarver 0:6b753f761943 175 int _sfdpParseSFDPHeaders(uint32_t& basic_table_addr, size_t& basic_table_size,
JimCarver 0:6b753f761943 176 uint32_t& sector_map_table_addr, size_t& sector_map_table_size);
JimCarver 0:6b753f761943 177 int _sfdpParseBasicParamTable(uint32_t basic_table_addr, size_t basic_table_size);
JimCarver 0:6b753f761943 178 int _sfdpParseSectorMapTable(uint32_t sector_map_table_addr, size_t sector_map_table_size);
JimCarver 0:6b753f761943 179 int _sfdpDetectBestBusReadMode(uint8_t *basicParamTablePtr, bool& setQuadEnable, bool& isQPIMode,
JimCarver 0:6b753f761943 180 unsigned int& readInst);
JimCarver 0:6b753f761943 181 int _sfdpSetQuadEnabled(uint8_t *basicParamTablePtr);
JimCarver 0:6b753f761943 182 int _sfdpSetQPIEnabled(uint8_t *basicParamTablePtr);
JimCarver 0:6b753f761943 183 int _sfdpDetectPageSize(uint8_t *basicParamTablePtr);
JimCarver 0:6b753f761943 184 int _sfdpDetectEraseTypesInstAndSize(uint8_t *basicParamTablePtr, unsigned int& erase4KInst,
JimCarver 0:6b753f761943 185 unsigned int *eraseTypeInstArr, unsigned int *eraseTypeSizeArr);
JimCarver 0:6b753f761943 186
JimCarver 0:6b753f761943 187 /* Utilities Functions */
JimCarver 0:6b753f761943 188 /***********************/
JimCarver 0:6b753f761943 189 int _utilsFindAddrRegion(int offset);
JimCarver 0:6b753f761943 190 int _utilsIterateNextLargestEraseType(uint8_t& bitfield, int size, int offset, int boundry);
JimCarver 0:6b753f761943 191 int _utilsMathPower(int base, int exp);
JimCarver 0:6b753f761943 192
JimCarver 0:6b753f761943 193 private:
JimCarver 0:6b753f761943 194
JimCarver 0:6b753f761943 195 // QSPI Driver Object
JimCarver 0:6b753f761943 196 QSPI _qspi;
JimCarver 0:6b753f761943 197 //DigitalOut _cs;
JimCarver 0:6b753f761943 198 bool is_initialized;
JimCarver 0:6b753f761943 199 static SingletonPtr<PlatformMutex> _mutex;
JimCarver 0:6b753f761943 200
JimCarver 0:6b753f761943 201 // Command Instructions
JimCarver 0:6b753f761943 202 unsigned int _readInstruction;
JimCarver 0:6b753f761943 203 unsigned int _progInstruction;
JimCarver 0:6b753f761943 204 unsigned int _eraseInstruction;
JimCarver 0:6b753f761943 205 unsigned int _erase4KInst;
JimCarver 0:6b753f761943 206 unsigned int _eraseTypeInstArr[4];
JimCarver 0:6b753f761943 207 unsigned int _eraseTypeSizeArr[4];
JimCarver 0:6b753f761943 208
JimCarver 0:6b753f761943 209 // Sector Regions Map
JimCarver 0:6b753f761943 210 int _regions_count; //number of regions
JimCarver 0:6b753f761943 211 int _region_size_bytes[QSPIF_MAX_REGIONS]; //regions size
JimCarver 0:6b753f761943 212 int _region_high_boundary[QSPIF_MAX_REGIONS]; //region high address offset boundary
JimCarver 0:6b753f761943 213 uint8_t _region_erase_types[QSPIF_MAX_REGIONS]; //region erase type
JimCarver 0:6b753f761943 214 int _minCommonEraseType; // minimal common erase size for all regions (-1 if none)
JimCarver 0:6b753f761943 215 int _minCommonEraseSize; // minimal common erase size for all regions
JimCarver 0:6b753f761943 216
JimCarver 0:6b753f761943 217 int _pageSizeBytes; // Page size - 256 Bytes default
JimCarver 0:6b753f761943 218 bd_size_t _deviceSizeBytes;
JimCarver 0:6b753f761943 219
JimCarver 0:6b753f761943 220 // Bus speed configuration
JimCarver 0:6b753f761943 221 qspi_bus_width_t _inst_width; //Bus width for Instruction phase
JimCarver 0:6b753f761943 222 qspi_bus_width_t _address_width; //Bus width for Address phase
JimCarver 0:6b753f761943 223 qspi_address_size_t _address_size;
JimCarver 0:6b753f761943 224 qspi_bus_width_t _alt_width; //Bus width for Alt phase
JimCarver 0:6b753f761943 225 qspi_alt_size_t _alt_size;
JimCarver 0:6b753f761943 226 qspi_bus_width_t _data_width; //Bus width for Data phase
JimCarver 0:6b753f761943 227 int _dummy_and_mode_cycles;
JimCarver 0:6b753f761943 228
JimCarver 0:6b753f761943 229
JimCarver 0:6b753f761943 230 };
JimCarver 0:6b753f761943 231
JimCarver 0:6b753f761943 232 #endif