File indexing completed on 2025-05-11 08:23:39
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #if !defined(_ZYNQ_QSPI_FLASH_H_)
0027 #define _ZYNQ_QSPI_FLASH_H_
0028
0029 #include <stdbool.h>
0030 #include <stdlib.h>
0031
0032
0033
0034
0035 #define ZQSPI_FLASH_4BYTE_ADDRESSING 1
0036 #define ZQSPI_FLASH_FAST_READ 1
0037
0038 #define ZQSPI_FLASH_COMMAND_OFFSET (0)
0039 #define ZQSPI_FLASH_ADDRESS_1_OFFSET (1)
0040 #define ZQSPI_FLASH_ADDRESS_2_OFFSET (2)
0041 #define ZQSPI_FLASH_ADDRESS_3_OFFSET (3)
0042 #if ZQSPI_FLASH_4BYTE_ADDRESSING
0043 #define ZQSPI_FLASH_ADDRESS_4_OFFSET (4)
0044 #define ZQSPI_FLASH_DATA_OFFSET (5)
0045 #else
0046 #define ZQSPI_FLASH_DATA_OFFSET (4)
0047 #endif
0048 #define ZQSPI_FLASH_SPI_MAX_PADDING (4)
0049
0050 #define ZQSPI_FLASH_TX_TRANS 0
0051 #define ZQSPI_FLASH_RX_TRANS 1
0052
0053 #define ZQSPI_FLASH_BUFFER_SIZE 0x1008
0054
0055 #define ZQPSI_ZYNQ_QSPI_IRQ 51
0056
0057 #define ZQSPI_TIMEOUT_US 5000000U
0058 #define ZQSPI_TIMEOUT_TICKS (ZQSPI_TIMEOUT_US \
0059 / rtems_configuration_get_microseconds_per_tick())
0060
0061
0062
0063
0064
0065 typedef enum
0066 {
0067 ZQSPI_FLASH_NO_ERROR = 0,
0068 ZQSPI_FLASH_NOT_OPEN,
0069 ZQSPI_FLASH_ALREADY_OPEN,
0070 ZQSPI_FLASH_NO_MEMORY,
0071 ZQSPI_FLASH_4BYTE_ADDR_NOT_SUPPORTED,
0072 ZQSPI_FLASH_BUFFER_OVERFLOW,
0073 ZQSPI_FLASH_BUFFER_UNDERFLOW,
0074 ZQSPI_FLASH_BAD_ADDRESS,
0075 ZQSPI_FLASH_NOT_BLANK,
0076 ZQSPI_FLASH_ERASE_FAILURE,
0077 ZQSPI_FLASH_READ_ONLY,
0078 ZQSPI_FLASH_WRITE_LATCH_CLEAR_FAIL,
0079 ZQSPI_FLASH_WRITE_LOCK_FAIL,
0080 ZQSPI_FLASH_WRITE_ACROSS_SECTION,
0081 ZQSPI_FLASH_WRITE_ERASE_CMD_FAIL,
0082 ZQSPI_FLASH_LOCK_FAIL,
0083 ZQSPI_FLASH_INVALID_DEVICE,
0084 ZQPSI_FLASH_TRANSFER_FAILED,
0085 ZQSPI_FLASH_RTEMS_INTR
0086 } zqspi_error;
0087
0088
0089
0090
0091 typedef struct
0092 {
0093 size_t size;
0094 size_t length;
0095 size_t padding;
0096 size_t in;
0097 size_t out;
0098 uint32_t trans_dir;
0099 uint32_t command_len;
0100 uint8_t *buffer;
0101 uint32_t *tx_data;
0102 uint32_t *rx_data;
0103 size_t tx_length;
0104 size_t rx_length;
0105 size_t sending;
0106 bool start;
0107 } zqspi_transfer_buffer;
0108
0109
0110
0111
0112 typedef struct
0113 {
0114 zqspi_transfer_buffer buf;
0115 bool initialised;
0116 uint32_t jedec_id;
0117 uint64_t flash_size;
0118 uint32_t flash_read_dummies;
0119 uint32_t flash_erase_sector_size;
0120 uint32_t flash_page_size;
0121 } zqspiflash;
0122
0123
0124
0125
0126
0127
0128
0129
0130 zqspi_error zqspi_init(zqspiflash *driver);
0131
0132
0133
0134
0135
0136
0137 void zqspi_close(zqspiflash *driver);
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149 zqspi_error zqspi_read(
0150 zqspiflash *driver,
0151 uint32_t address,
0152 void* buffer,
0153 size_t length
0154 );
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166 zqspi_error zqspi_write(
0167 zqspiflash *driver,
0168 uint32_t address,
0169 const void* buffer,
0170 size_t length
0171 );
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182 zqspi_error zqspi_erase(
0183 zqspiflash *driver,
0184 uint32_t address,
0185 size_t length
0186 );
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197 zqspi_error zqspi_blank(
0198 zqspiflash *driver,
0199 uint32_t address,
0200 size_t length
0201 );
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211 zqspi_error zqspi_erase_sector(
0212 zqspiflash *driver,
0213 uint32_t address
0214 );
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225 zqspi_error zqspi_write_sector(
0226 zqspiflash *driver,
0227 uint32_t address,
0228 const void* buffer,
0229 size_t length
0230 );
0231
0232
0233
0234
0235
0236
0237
0238
0239 zqspi_error zqspi_erase_device(zqspiflash *driver);
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250 zqspi_error zqspi_readid(zqspiflash *driver, uint32_t *jedec_id);
0251
0252
0253
0254
0255
0256
0257
0258
0259 size_t zqspi_device_size(zqspiflash *driver);
0260
0261
0262
0263
0264
0265
0266
0267
0268 size_t zqspi_device_sector_erase_size(zqspiflash *driver);
0269
0270
0271
0272
0273
0274
0275
0276 void zqspi_transfer_trace(
0277 const char* message,
0278 const zqspi_transfer_buffer* transfer
0279 );
0280
0281
0282
0283
0284
0285
0286
0287 void qspi_reg_write(uint32_t reg, uint32_t value);
0288
0289
0290
0291
0292
0293
0294
0295
0296 uint32_t qspi_reg_read(uint32_t reg);
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306 zqspi_error zqspi_transfer_buffer_skip(
0307 zqspi_transfer_buffer* transfer,
0308 const size_t size
0309 );
0310
0311 #endif