QSPI external flash block device for file system on external flash for DISCO_L475VG_IOT01

Dependencies:   BSP_B-L475E-IOT01

Committer:
DoronRaifman
Date:
Thu Apr 26 09:27:12 2018 +0000
Revision:
1:2baccc030920
Parent:
0:0ca082ff5da6
QSPI external flash block device for file system on external flash;  for DISCO_L475VG_IOT01

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DoronRaifman 0:0ca082ff5da6 1 /* QSPIExtFlashBlockDevice.cpp
DoronRaifman 1:2baccc030920 2 * QSPI external flash block device for file system on external flash
DoronRaifman 0:0ca082ff5da6 3 * for DISCO_L475VG_IOT01
DoronRaifman 0:0ca082ff5da6 4 *
DoronRaifman 0:0ca082ff5da6 5 * Doron Raifman, draifman@gmail.com
DoronRaifman 0:0ca082ff5da6 6 */
DoronRaifman 0:0ca082ff5da6 7
DoronRaifman 0:0ca082ff5da6 8 #include "QSPIExtFlashBlockDevice.h"
DoronRaifman 0:0ca082ff5da6 9
DoronRaifman 0:0ca082ff5da6 10
DoronRaifman 0:0ca082ff5da6 11
DoronRaifman 0:0ca082ff5da6 12
DoronRaifman 0:0ca082ff5da6 13 QSPIExtFlashBlockDevice::QSPIExtFlashBlockDevice()
DoronRaifman 0:0ca082ff5da6 14 {
DoronRaifman 0:0ca082ff5da6 15 }
DoronRaifman 0:0ca082ff5da6 16
DoronRaifman 0:0ca082ff5da6 17
DoronRaifman 0:0ca082ff5da6 18 QSPIExtFlashBlockDevice::~QSPIExtFlashBlockDevice()
DoronRaifman 0:0ca082ff5da6 19 {
DoronRaifman 0:0ca082ff5da6 20 }
DoronRaifman 0:0ca082ff5da6 21
DoronRaifman 0:0ca082ff5da6 22
DoronRaifman 0:0ca082ff5da6 23 int QSPIExtFlashBlockDevice::init()
DoronRaifman 0:0ca082ff5da6 24 {
DoronRaifman 0:0ca082ff5da6 25 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 26
DoronRaifman 0:0ca082ff5da6 27 #if QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 28 printf("QSPIExtFlashBlockDevice::init\n");
DoronRaifman 0:0ca082ff5da6 29 #endif // QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 30 nRc = _SyncLock();
DoronRaifman 0:0ca082ff5da6 31 // Todo: Allocate semaphore
DoronRaifman 0:0ca082ff5da6 32 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 33 {
DoronRaifman 0:0ca082ff5da6 34 int nTrc = BSP_QSPI_Init();
DoronRaifman 0:0ca082ff5da6 35 if(nTrc != QSPI_OK)
DoronRaifman 0:0ca082ff5da6 36 {
DoronRaifman 0:0ca082ff5da6 37 nRc = RC_QSPIExtFlash_ErrBadDevice;
DoronRaifman 0:0ca082ff5da6 38 #if QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 39 error("QSPIExtFlashBlockDevice QSPI init FAILED with err %d\n", nTrc);
DoronRaifman 0:0ca082ff5da6 40
DoronRaifman 0:0ca082ff5da6 41 #endif // QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 42 }
DoronRaifman 0:0ca082ff5da6 43 }
DoronRaifman 0:0ca082ff5da6 44
DoronRaifman 0:0ca082ff5da6 45 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 46 {
DoronRaifman 0:0ca082ff5da6 47 BSP_QSPI_GetInfo(&m_sQSPIExtFlash_Info);
DoronRaifman 0:0ca082ff5da6 48 #if QSPIExtFlashBlockDevice_DEBUG
DoronRaifman 0:0ca082ff5da6 49 printf("QSPI flash informations: FlashSize=0x0%X %d...\n",
DoronRaifman 0:0ca082ff5da6 50 m_sQSPIExtFlash_Info.FlashSize, m_sQSPIExtFlash_Info.FlashSize);
DoronRaifman 0:0ca082ff5da6 51 printf("...EraseSectorSize=%d, ProgPageSize=%d\n",
DoronRaifman 0:0ca082ff5da6 52 m_sQSPIExtFlash_Info.EraseSectorSize,
DoronRaifman 0:0ca082ff5da6 53 m_sQSPIExtFlash_Info.ProgPageSize);
DoronRaifman 0:0ca082ff5da6 54 printf("...EraseSectorsNumber=%d, ProgPagesNumber=%d\n",
DoronRaifman 0:0ca082ff5da6 55 m_sQSPIExtFlash_Info.EraseSectorsNumber,
DoronRaifman 0:0ca082ff5da6 56 m_sQSPIExtFlash_Info.ProgPagesNumber);
DoronRaifman 0:0ca082ff5da6 57 #endif // QSPIExtFlashBlockDevice_DEBUG
DoronRaifman 0:0ca082ff5da6 58 }
DoronRaifman 0:0ca082ff5da6 59 if(nRc != 0)
DoronRaifman 0:0ca082ff5da6 60 {
DoronRaifman 0:0ca082ff5da6 61 // Cleanup
DoronRaifman 0:0ca082ff5da6 62 // Todo: delete semaphore
DoronRaifman 0:0ca082ff5da6 63 }
DoronRaifman 0:0ca082ff5da6 64 _SyncUnlock();
DoronRaifman 0:0ca082ff5da6 65 return nRc;
DoronRaifman 0:0ca082ff5da6 66 }
DoronRaifman 0:0ca082ff5da6 67
DoronRaifman 0:0ca082ff5da6 68
DoronRaifman 0:0ca082ff5da6 69 int QSPIExtFlashBlockDevice::deinit()
DoronRaifman 0:0ca082ff5da6 70 {
DoronRaifman 0:0ca082ff5da6 71 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 72
DoronRaifman 0:0ca082ff5da6 73 #if QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 74 printf("QSPIExtFlashBlockDevice::deinit\n");
DoronRaifman 0:0ca082ff5da6 75 #endif // QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 76
DoronRaifman 0:0ca082ff5da6 77 nRc = _SyncLock();
DoronRaifman 0:0ca082ff5da6 78 // Cleanup
DoronRaifman 0:0ca082ff5da6 79 int nTrc = BSP_QSPI_DeInit();
DoronRaifman 0:0ca082ff5da6 80 #if QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 81 if(nTrc)
DoronRaifman 0:0ca082ff5da6 82 {
DoronRaifman 0:0ca082ff5da6 83 error("BSP_QSPI_DeInit err%d\n", nTrc);
DoronRaifman 0:0ca082ff5da6 84 }
DoronRaifman 0:0ca082ff5da6 85 #endif // QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 86 _SyncUnlock();
DoronRaifman 0:0ca082ff5da6 87 // Todo: delete semaphore
DoronRaifman 0:0ca082ff5da6 88 return nRc;
DoronRaifman 0:0ca082ff5da6 89 }
DoronRaifman 0:0ca082ff5da6 90
DoronRaifman 0:0ca082ff5da6 91
DoronRaifman 0:0ca082ff5da6 92 int QSPIExtFlashBlockDevice::_SyncLock() const
DoronRaifman 0:0ca082ff5da6 93 {
DoronRaifman 0:0ca082ff5da6 94 int nRc = RC_QSPIExtFlash_ErrTimeout;
DoronRaifman 0:0ca082ff5da6 95
DoronRaifman 0:0ca082ff5da6 96 for (int i = 0; i < QSPIExtFlashBlockDeviceTimeout; i++)
DoronRaifman 0:0ca082ff5da6 97 {
DoronRaifman 0:0ca082ff5da6 98 if(1) // Todo: handle semaphore
DoronRaifman 0:0ca082ff5da6 99 {
DoronRaifman 0:0ca082ff5da6 100 nRc = 0;
DoronRaifman 0:0ca082ff5da6 101 break;
DoronRaifman 0:0ca082ff5da6 102 }
DoronRaifman 0:0ca082ff5da6 103 wait_ms(1);
DoronRaifman 0:0ca082ff5da6 104 }
DoronRaifman 0:0ca082ff5da6 105 #if QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 106 if(nRc != 0)
DoronRaifman 0:0ca082ff5da6 107 {
DoronRaifman 0:0ca082ff5da6 108 error("QSPIExtFlashBlockDevice _SyncLock FAILED\n");
DoronRaifman 0:0ca082ff5da6 109 }
DoronRaifman 0:0ca082ff5da6 110 #endif // QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 111 return nRc;
DoronRaifman 0:0ca082ff5da6 112 }
DoronRaifman 0:0ca082ff5da6 113
DoronRaifman 0:0ca082ff5da6 114
DoronRaifman 0:0ca082ff5da6 115 int QSPIExtFlashBlockDevice::_SyncUnlock() const
DoronRaifman 0:0ca082ff5da6 116 {
DoronRaifman 0:0ca082ff5da6 117 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 118
DoronRaifman 0:0ca082ff5da6 119 // Todo: Unlock semaphore
DoronRaifman 0:0ca082ff5da6 120 return(nRc);
DoronRaifman 0:0ca082ff5da6 121 }
DoronRaifman 0:0ca082ff5da6 122
DoronRaifman 0:0ca082ff5da6 123 int QSPIExtFlashBlockDevice::_WaitForWrite(const char *ptCaller)
DoronRaifman 0:0ca082ff5da6 124 {
DoronRaifman 0:0ca082ff5da6 125 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 126 uint8_t nStatus = 0;
DoronRaifman 0:0ca082ff5da6 127
DoronRaifman 0:0ca082ff5da6 128 nRc = RC_QSPIExtFlash_ErrTimeout;
DoronRaifman 0:0ca082ff5da6 129 for (int i = 0; i < QSPIExtFlashBlockDeviceTimeout; i++)
DoronRaifman 0:0ca082ff5da6 130 {
DoronRaifman 0:0ca082ff5da6 131 nStatus = BSP_QSPI_GetStatus();
DoronRaifman 0:0ca082ff5da6 132 if(nStatus == 0)
DoronRaifman 0:0ca082ff5da6 133 {
DoronRaifman 0:0ca082ff5da6 134 nRc = 0;
DoronRaifman 0:0ca082ff5da6 135 break;
DoronRaifman 0:0ca082ff5da6 136 }
DoronRaifman 0:0ca082ff5da6 137 /*
DoronRaifman 0:0ca082ff5da6 138 else
DoronRaifman 0:0ca082ff5da6 139 {
DoronRaifman 0:0ca082ff5da6 140 printf("Status inside=%d\n", nStatus);
DoronRaifman 0:0ca082ff5da6 141 }
DoronRaifman 0:0ca082ff5da6 142 */
DoronRaifman 0:0ca082ff5da6 143 wait_us(100);
DoronRaifman 0:0ca082ff5da6 144 }
DoronRaifman 0:0ca082ff5da6 145 #if QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 146 if(nRc)
DoronRaifman 0:0ca082ff5da6 147 {
DoronRaifman 0:0ca082ff5da6 148 printf("Timeout on waiting for status ready for %s\n", ptCaller);
DoronRaifman 0:0ca082ff5da6 149 }
DoronRaifman 0:0ca082ff5da6 150 #endif // QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 151 return(nRc);
DoronRaifman 0:0ca082ff5da6 152 }
DoronRaifman 0:0ca082ff5da6 153
DoronRaifman 0:0ca082ff5da6 154
DoronRaifman 0:0ca082ff5da6 155
DoronRaifman 0:0ca082ff5da6 156 int QSPIExtFlashBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
DoronRaifman 0:0ca082ff5da6 157 {
DoronRaifman 0:0ca082ff5da6 158 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 159
DoronRaifman 0:0ca082ff5da6 160 #if QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 161 printf("QSPIExtFlashBlockDevice::read address:%lld, size:%lld\n", addr, size);
DoronRaifman 0:0ca082ff5da6 162 #endif // QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 163 nRc = _SyncLock();
DoronRaifman 0:0ca082ff5da6 164 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 165 {
DoronRaifman 0:0ca082ff5da6 166 nRc = _WaitForWrite((const char *) "QSPIExtFlashBlockDevice::read");
DoronRaifman 0:0ca082ff5da6 167 }
DoronRaifman 0:0ca082ff5da6 168 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 169 {
DoronRaifman 0:0ca082ff5da6 170 int nTrc = BSP_QSPI_Read((uint8_t *) buffer, (uint32_t) addr, size);
DoronRaifman 0:0ca082ff5da6 171 if(nTrc != QSPI_OK)
DoronRaifman 0:0ca082ff5da6 172 {
DoronRaifman 0:0ca082ff5da6 173 nRc = RC_QSPIExtFlash_ErrIO;
DoronRaifman 0:0ca082ff5da6 174 #if QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 175 error("QSPIExtFlashBlockDevice Read FAILED with err %d\n", nTrc);
DoronRaifman 0:0ca082ff5da6 176 #endif // QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 177 }
DoronRaifman 0:0ca082ff5da6 178 }
DoronRaifman 0:0ca082ff5da6 179 _SyncUnlock();
DoronRaifman 0:0ca082ff5da6 180 return nRc;
DoronRaifman 0:0ca082ff5da6 181 }
DoronRaifman 0:0ca082ff5da6 182
DoronRaifman 0:0ca082ff5da6 183
DoronRaifman 0:0ca082ff5da6 184 int QSPIExtFlashBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size)
DoronRaifman 0:0ca082ff5da6 185 {
DoronRaifman 0:0ca082ff5da6 186 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 187
DoronRaifman 0:0ca082ff5da6 188 #if QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 189 printf("QSPIExtFlashBlockDevice::program address:%lld, size:%lld\n", addr, size);
DoronRaifman 0:0ca082ff5da6 190 #endif // QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 191 nRc = _SyncLock();
DoronRaifman 0:0ca082ff5da6 192 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 193 {
DoronRaifman 0:0ca082ff5da6 194 nRc = _WaitForWrite((const char *) "QSPIExtFlashBlockDevice::program");
DoronRaifman 0:0ca082ff5da6 195 }
DoronRaifman 0:0ca082ff5da6 196 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 197 {
DoronRaifman 0:0ca082ff5da6 198 int nTrc = BSP_QSPI_Write((uint8_t *) buffer, (uint32_t) addr, size);
DoronRaifman 0:0ca082ff5da6 199 if(nTrc != QSPI_OK)
DoronRaifman 0:0ca082ff5da6 200 {
DoronRaifman 0:0ca082ff5da6 201 nRc = RC_QSPIExtFlash_ErrIO;
DoronRaifman 0:0ca082ff5da6 202 #if QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 203 error("QSPIExtFlashBlockDevice Write FAILED with err %d\n", nTrc);
DoronRaifman 0:0ca082ff5da6 204 #endif // QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 205 }
DoronRaifman 0:0ca082ff5da6 206 }
DoronRaifman 0:0ca082ff5da6 207 _SyncUnlock();
DoronRaifman 0:0ca082ff5da6 208 return nRc;
DoronRaifman 0:0ca082ff5da6 209 }
DoronRaifman 0:0ca082ff5da6 210
DoronRaifman 0:0ca082ff5da6 211
DoronRaifman 0:0ca082ff5da6 212 int QSPIExtFlashBlockDevice::erase(bd_addr_t addr, bd_size_t size)
DoronRaifman 0:0ca082ff5da6 213 {
DoronRaifman 0:0ca082ff5da6 214 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 215
DoronRaifman 0:0ca082ff5da6 216 #if QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 217 printf("QSPIExtFlashBlockDevice::erase address:%lld, size:%lld\n", addr, size);
DoronRaifman 0:0ca082ff5da6 218 #endif // QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 219 nRc = _SyncLock();
DoronRaifman 0:0ca082ff5da6 220 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 221 {
DoronRaifman 0:0ca082ff5da6 222 nRc = _WaitForWrite((const char *) "QSPIExtFlashBlockDevice::erase");
DoronRaifman 0:0ca082ff5da6 223 }
DoronRaifman 0:0ca082ff5da6 224 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 225 {
DoronRaifman 0:0ca082ff5da6 226 int nTrc = BSP_QSPI_Erase_Sector(((uint32_t) addr) / MX25R6435F_SECTOR_SIZE);
DoronRaifman 0:0ca082ff5da6 227 //int nTrc = BSP_QSPI_Erase_Block((uint32_t) addr);
DoronRaifman 0:0ca082ff5da6 228 if(nTrc != QSPI_OK)
DoronRaifman 0:0ca082ff5da6 229 {
DoronRaifman 0:0ca082ff5da6 230 nRc = RC_QSPIExtFlash_ErrIO;
DoronRaifman 0:0ca082ff5da6 231 #if QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 232 error("QSPIExtFlashBlockDevice Erase FAILED with err %d\n", nTrc);
DoronRaifman 0:0ca082ff5da6 233 #endif // QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 234 }
DoronRaifman 0:0ca082ff5da6 235 else
DoronRaifman 0:0ca082ff5da6 236 {
DoronRaifman 0:0ca082ff5da6 237 // Wait for erase to complete
DoronRaifman 0:0ca082ff5da6 238 nRc = _WaitForWrite((const char *) "QSPIExtFlashBlockDevice::erase wait for complete");
DoronRaifman 0:0ca082ff5da6 239 }
DoronRaifman 0:0ca082ff5da6 240 }
DoronRaifman 0:0ca082ff5da6 241 _SyncUnlock();
DoronRaifman 0:0ca082ff5da6 242 return nRc;
DoronRaifman 0:0ca082ff5da6 243 }
DoronRaifman 0:0ca082ff5da6 244
DoronRaifman 0:0ca082ff5da6 245
DoronRaifman 0:0ca082ff5da6 246 int QSPIExtFlashBlockDevice::EraseAllFlashMemory()
DoronRaifman 0:0ca082ff5da6 247 {
DoronRaifman 0:0ca082ff5da6 248 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 249
DoronRaifman 0:0ca082ff5da6 250 #if QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 251 printf("QSPIExtFlashBlockDevice::EraseAllFlashMemory\n");
DoronRaifman 0:0ca082ff5da6 252 #endif // QSPIExtFlashBlockDevice_VERBOSE
DoronRaifman 0:0ca082ff5da6 253 nRc = _SyncLock();
DoronRaifman 0:0ca082ff5da6 254 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 255 {
DoronRaifman 0:0ca082ff5da6 256 nRc = _WaitForWrite((const char *) "QSPIExtFlashBlockDevice::EraseAllFlashMemory");
DoronRaifman 0:0ca082ff5da6 257 #if QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 258 if(nRc)
DoronRaifman 0:0ca082ff5da6 259 {
DoronRaifman 0:0ca082ff5da6 260 error("QSPIExtFlashBlockDevice EraseAllFlashMemory _WaitForWrite err with err %d\n", nRc);
DoronRaifman 0:0ca082ff5da6 261 }
DoronRaifman 0:0ca082ff5da6 262 #endif // QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 263 }
DoronRaifman 0:0ca082ff5da6 264 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 265 {
DoronRaifman 0:0ca082ff5da6 266 int nTrc = BSP_QSPI_Erase_Chip();
DoronRaifman 0:0ca082ff5da6 267 if(nTrc != QSPI_OK)
DoronRaifman 0:0ca082ff5da6 268 {
DoronRaifman 0:0ca082ff5da6 269 nRc = RC_QSPIExtFlash_ErrIO;
DoronRaifman 0:0ca082ff5da6 270 #if QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 271 error("QSPIExtFlashBlockDevice EraseAllFlashMemory FAILED with err %d\n", nTrc);
DoronRaifman 0:0ca082ff5da6 272 #endif // QSPIExtFlashBlockDevice_ERRORS
DoronRaifman 0:0ca082ff5da6 273 }
DoronRaifman 0:0ca082ff5da6 274 }
DoronRaifman 0:0ca082ff5da6 275 _SyncUnlock();
DoronRaifman 0:0ca082ff5da6 276 return nRc;
DoronRaifman 0:0ca082ff5da6 277 }
DoronRaifman 0:0ca082ff5da6 278
DoronRaifman 0:0ca082ff5da6 279
DoronRaifman 0:0ca082ff5da6 280 bd_size_t QSPIExtFlashBlockDevice::get_read_size() const
DoronRaifman 0:0ca082ff5da6 281 {
DoronRaifman 0:0ca082ff5da6 282 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 283 bd_size_t nSize = 0;
DoronRaifman 0:0ca082ff5da6 284
DoronRaifman 0:0ca082ff5da6 285 nRc = _SyncLock();
DoronRaifman 0:0ca082ff5da6 286 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 287 {
DoronRaifman 0:0ca082ff5da6 288 nSize = m_sQSPIExtFlash_Info.ProgPageSize;
DoronRaifman 0:0ca082ff5da6 289 }
DoronRaifman 0:0ca082ff5da6 290 _SyncUnlock();
DoronRaifman 0:0ca082ff5da6 291 return nSize;
DoronRaifman 0:0ca082ff5da6 292 }
DoronRaifman 0:0ca082ff5da6 293
DoronRaifman 0:0ca082ff5da6 294 bd_size_t QSPIExtFlashBlockDevice::get_program_size() const
DoronRaifman 0:0ca082ff5da6 295 {
DoronRaifman 0:0ca082ff5da6 296 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 297
DoronRaifman 0:0ca082ff5da6 298 nRc = _SyncLock();
DoronRaifman 0:0ca082ff5da6 299 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 300 {
DoronRaifman 0:0ca082ff5da6 301 nRc = m_sQSPIExtFlash_Info.ProgPageSize;
DoronRaifman 0:0ca082ff5da6 302 }
DoronRaifman 0:0ca082ff5da6 303 _SyncUnlock();
DoronRaifman 0:0ca082ff5da6 304 return nRc;
DoronRaifman 0:0ca082ff5da6 305 }
DoronRaifman 0:0ca082ff5da6 306
DoronRaifman 0:0ca082ff5da6 307
DoronRaifman 0:0ca082ff5da6 308 bd_size_t QSPIExtFlashBlockDevice::get_erase_size() const
DoronRaifman 0:0ca082ff5da6 309 {
DoronRaifman 0:0ca082ff5da6 310 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 311
DoronRaifman 0:0ca082ff5da6 312 nRc = _SyncLock();
DoronRaifman 0:0ca082ff5da6 313 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 314 {
DoronRaifman 0:0ca082ff5da6 315 nRc = m_sQSPIExtFlash_Info.EraseSectorSize;
DoronRaifman 0:0ca082ff5da6 316 }
DoronRaifman 0:0ca082ff5da6 317 _SyncUnlock();
DoronRaifman 0:0ca082ff5da6 318 return nRc;
DoronRaifman 0:0ca082ff5da6 319 }
DoronRaifman 0:0ca082ff5da6 320
DoronRaifman 0:0ca082ff5da6 321
DoronRaifman 0:0ca082ff5da6 322 bd_size_t QSPIExtFlashBlockDevice::size() const
DoronRaifman 0:0ca082ff5da6 323 {
DoronRaifman 0:0ca082ff5da6 324 int nRc = 0;
DoronRaifman 0:0ca082ff5da6 325
DoronRaifman 0:0ca082ff5da6 326 nRc = _SyncLock();
DoronRaifman 0:0ca082ff5da6 327 if(nRc == 0)
DoronRaifman 0:0ca082ff5da6 328 {
DoronRaifman 0:0ca082ff5da6 329 nRc = m_sQSPIExtFlash_Info.FlashSize;
DoronRaifman 0:0ca082ff5da6 330 }
DoronRaifman 0:0ca082ff5da6 331 _SyncUnlock();
DoronRaifman 0:0ca082ff5da6 332 return nRc;
DoronRaifman 0:0ca082ff5da6 333 }
DoronRaifman 0:0ca082ff5da6 334
DoronRaifman 0:0ca082ff5da6 335