RTEMS 7.0-rc1
Loading...
Searching...
No Matches
zynq-qspi-flash.h
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/*
4 * Copyright (C) 2024 Contemporary Software
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#if !defined(_ZYNQ_QSPI_FLASH_H_)
29#define _ZYNQ_QSPI_FLASH_H_
30
31#include <stdbool.h>
32#include <stdlib.h>
33
34/*
35 * Driver configuration.
36 */
37#define ZQSPI_FLASH_COMMAND_OFFSET (0) /* FLASH instruction */
38#define ZQSPI_FLASH_ADDRESS_1_OFFSET (1) /* Bits 31-24 of the address */
39#define ZQSPI_FLASH_ADDRESS_2_OFFSET (2) /* Bits 23-16 of the address */
40#define ZQSPI_FLASH_ADDRESS_3_OFFSET (3) /* Bits 16-8 of the address */
41#define ZQSPI_FLASH_ADDRESS_4_OFFSET (4) /* Bits 8-0 of the address */
42#define ZQSPI_FLASH_SPI_MAX_PADDING (4) /* Maximum amount of padding. */
43
44#define ZQSPI_FLASH_TX_TRANS 0
45#define ZQSPI_FLASH_RX_TRANS 1
46
47#define ZQSPI_FLASH_BUFFER_SIZE 0x1008
48
49#define ZQPSI_ZYNQ_QSPI_IRQ 51
50
51#define ZQSPI_TIMEOUT_US 5000000U
52#define ZQSPI_TIMEOUT_TICKS (ZQSPI_TIMEOUT_US \
53 / rtems_configuration_get_microseconds_per_tick())
54
55
56/*
57 * Zynq QSPI Flash driver errors.
58 */
59typedef enum
60{
61 ZQSPI_FLASH_NO_ERROR = 0,
62 ZQSPI_FLASH_NOT_OPEN,
63 ZQSPI_FLASH_ALREADY_OPEN,
64 ZQSPI_FLASH_NO_MEMORY,
65 ZQSPI_FLASH_4BYTE_ADDR_NOT_SUPPORTED,
66 ZQSPI_FLASH_BUFFER_OVERFLOW,
67 ZQSPI_FLASH_BUFFER_UNDERFLOW,
68 ZQSPI_FLASH_BAD_ADDRESS,
69 ZQSPI_FLASH_NOT_BLANK,
70 ZQSPI_FLASH_ERASE_FAILURE,
71 ZQSPI_FLASH_READ_ONLY,
72 ZQSPI_FLASH_WRITE_LATCH_CLEAR_FAIL,
73 ZQSPI_FLASH_WRITE_LOCK_FAIL,
74 ZQSPI_FLASH_WRITE_ACROSS_SECTION,
75 ZQSPI_FLASH_WRITE_ERASE_CMD_FAIL,
76 ZQSPI_FLASH_LOCK_FAIL,
77 ZQSPI_FLASH_INVALID_DEVICE,
78 ZQPSI_FLASH_TRANSFER_FAILED,
79 ZQSPI_FLASH_RTEMS_INTR
80} zqspi_error;
81
82/*
83 * A transfer buffer.
84 */
85typedef struct
86{
87 size_t size;
88 size_t length;
89 size_t padding;
90 size_t in;
91 size_t out;
92 uint32_t trans_dir;
93 uint32_t command_len;
94 uint8_t *buffer;
95 uint32_t *tx_data;
96 uint32_t *rx_data;
97 size_t tx_length;
98 size_t rx_length;
99 size_t sending;
100 bool start;
102
103typedef struct
104{
105 uint8_t fast_read;
106 uint8_t read;
107 uint8_t page_program;
108 uint8_t sector_erase;
110
111/*
112 * A flash driver instance
113 */
114typedef struct
115{
117 zqspi_flash_commands commands;
118 bool initialised;
119 bool addr_4_byte;
120 uint32_t jedec_id;
121 uint64_t flash_size;
122 uint32_t flash_read_dummies;
123 uint32_t flash_erase_sector_size;
124 uint32_t flash_page_size;
125} zqspiflash;
126
134zqspi_error zqspi_init(zqspiflash *driver);
135
141void zqspi_close(zqspiflash *driver);
142
153zqspi_error zqspi_read(
154 zqspiflash *driver,
155 uint32_t address,
156 void* buffer,
157 size_t length
158);
159
170zqspi_error zqspi_write(
171 zqspiflash *driver,
172 uint32_t address,
173 const void* buffer,
174 size_t length
175);
176
186zqspi_error zqspi_erase(
187 zqspiflash *driver,
188 uint32_t address,
189 size_t length
190);
191
201zqspi_error zqspi_blank(
202 zqspiflash *driver,
203 uint32_t address,
204 size_t length
205);
206
215zqspi_error zqspi_erase_sector(
216 zqspiflash *driver,
217 uint32_t address
218);
219
229zqspi_error zqspi_write_sector(
230 zqspiflash *driver,
231 uint32_t address,
232 const void* buffer,
233 size_t length
234);
235
243zqspi_error zqspi_erase_device(zqspiflash *driver);
244
254zqspi_error zqspi_readid(zqspiflash *driver, uint32_t *jedec_id);
255
263size_t zqspi_device_size(zqspiflash *driver);
264
272size_t zqspi_device_sector_erase_size(zqspiflash *driver);
273
280void zqspi_transfer_trace(
281 const char* message,
282 const zqspi_transfer_buffer* transfer
283);
284
291void qspi_reg_write(uint32_t reg, uint32_t value);
292
300uint32_t qspi_reg_read(uint32_t reg);
301
310zqspi_error zqspi_transfer_buffer_skip(
311 zqspi_transfer_buffer* transfer,
312 const size_t size
313);
314
315#endif /* _ZYNQ_QSPI_FLASH_H_ */
ssize_t read(int fd, void *buffer, size_t count)
Definition: read.c:46
Definition: media-server.c:46
Definition: zynq-qspi-flash.h:104
Definition: zynq-qspi-flash.h:86
Definition: zynq-qspi-flash.h:115