1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
23
24
25
26
27
31
32
37
38
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
100
101
102
105
106
107
108
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
134
135
136
137
138
139
140
151
152
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
180
181
182
183
184
185
188
189
190
191
192
193
196
197
198
201
202
203
204
205
206
207
208
209
210
211
212
213
214
217
218
#include <string.h>
#include <stdlib.h>
#include "hal/spi_flash_hal.h"
#include "hal/assert.h"
#include "soc/soc_caps.h"
#include "soc/chip_revision.h"
#include "hal/efuse_hal.h"
#include "sdkconfig.h"8 includes
#define ADDRESS_MASK_24BIT 0xFFFFFF
#define COMPUTE_DUMMY_CYCLELEN(host, base) ((base) + ((spi_flash_hal_context_t*)host)->extra_dummy)
static inline spi_dev_t *get_spi_dev(spi_flash_host_inst_t *host)
{
return ((spi_flash_hal_context_t*)host)->spi;
}{ ... }
static inline int get_host_id(spi_flash_host_inst_t* host)
{
spi_dev_t *dev = get_spi_dev(host);
return spi_flash_ll_hw_get_id(dev);
}{ ... }
void spi_flash_hal_poll_cmd_done(spi_flash_host_inst_t *host)
{
while (!spi_flash_ll_cmd_is_done(get_spi_dev(host))) {
}{...}
}{ ... }
esp_err_t spi_flash_hal_device_config(spi_flash_host_inst_t *host)
{
spi_flash_hal_context_t* ctx = (spi_flash_hal_context_t*)host;
spi_dev_t *dev = get_spi_dev(host);
spi_flash_ll_reset(dev);
spi_flash_ll_set_cs_pin(dev, ctx->cs_num);
spi_flash_ll_set_clock(dev, &ctx->clock_conf);
int cs_hold = ctx->cs_hold;
spi_flash_ll_set_hold(dev, cs_hold);
spi_flash_ll_set_cs_setup(dev, ctx->cs_setup);
#ifndef GPSPI_BUILD
#if SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND
if ((ctx->flags & SPI_FLASH_HOST_CONTEXT_FLAG_AUTO_SUSPEND) != 0) {
spi_flash_hal_setup_auto_suspend_mode(host);
}{...} else {
spi_flash_hal_disable_auto_suspend_mode(host);
}{...}
if ((ctx->flags & SPI_FLASH_HOST_CONTEXT_FLAG_AUTO_RESUME) != 0) {
spi_flash_hal_setup_auto_resume_mode(host);
}{...} else {
spi_flash_hal_disable_auto_resume_mode(host);
}{...}
#endif/* ... */
#if SOC_SPI_MEM_SUPPORT_TIMING_TUNING
spimem_flash_ll_set_extra_dummy((spi_mem_dev_t*)dev, 0);/* ... */
#endif/* ... */
#else
gpspi_flash_ll_set_hold_pol(dev, 1);
#endif
return ESP_OK;
}{ ... }
esp_err_t spi_flash_hal_configure_host_io_mode(
spi_flash_host_inst_t *host,
uint32_t command,
uint32_t addr_bitlen,
int dummy_cyclelen_base,
esp_flash_io_mode_t io_mode)
{
spi_dev_t *dev = get_spi_dev(host);
int host_id = spi_flash_ll_hw_get_id(dev);
uint32_t extra_bits = io_mode & 0xFFFF0000;
io_mode = io_mode & 0xFFFF;
/* ... */
bool conf_required = ((extra_bits & SPI_FLASH_CONFIG_CONF_BITS) != 0);
if (!SOC_SPI_PERIPH_SUPPORT_MULTILINE_MODE(host_id) && io_mode > SPI_FLASH_FASTRD) {
return ESP_ERR_NOT_SUPPORTED;
}{...}
#ifndef GPSPI_BUILD
#if SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT
spi_flash_ll_set_dummy_out(dev, (conf_required? 1: 0), 1);/* ... */
#else
/* ... */
if (conf_required) {
int line_width = (io_mode == SPI_FLASH_DIO? 2: 4);
dummy_cyclelen_base -= SPI_FLASH_LL_CONTINUOUS_MODE_BIT_NUMS / line_width;
addr_bitlen += SPI_FLASH_LL_CONTINUOUS_MODE_BIT_NUMS;
spi_flash_ll_set_extra_address(dev, 0);
}{...}
#endif/* ... */
/* ... */#else
gpspi_flash_ll_set_dummy_out(dev, (conf_required? 1: 0), 1);
#endif
#if CONFIG_IDF_TARGET_ESP32P4
unsigned chip_version = efuse_hal_chip_revision();
if (unlikely(!ESP_CHIP_REV_ABOVE(chip_version, 1))) {
if (conf_required) {
int line_width = (io_mode == SPI_FLASH_DIO? 2: 4);
dummy_cyclelen_base -= SPI_FLASH_LL_CONTINUOUS_MODE_BIT_NUMS / line_width;
addr_bitlen += SPI_FLASH_LL_CONTINUOUS_MODE_BIT_NUMS;
spi_flash_ll_set_extra_address(dev, 0);
}{...}
}{...}
#endif/* ... */
if (command >= 0x100) {
spi_flash_ll_set_command(dev, command, 16);
}{...} else {
spi_flash_ll_set_command(dev, command, 8);
}{...}
spi_flash_ll_set_addr_bitlen(dev, addr_bitlen);
spi_flash_ll_set_dummy(dev, COMPUTE_DUMMY_CYCLELEN(host, dummy_cyclelen_base));
spi_flash_ll_set_miso_bitlen(dev, 0);
spi_flash_ll_set_mosi_bitlen(dev, 0);
spi_flash_ll_set_read_mode(dev, io_mode);
return ESP_OK;
}{ ... }
esp_err_t spi_flash_hal_common_command(spi_flash_host_inst_t *host, spi_flash_trans_t *trans)
{
spi_dev_t *dev = get_spi_dev(host);
esp_flash_io_mode_t io_mode = ((spi_flash_hal_context_t*)host)->base_io_mode;
uint16_t command;
uint8_t dummy_bitlen;
bool pe_ops = false;
command = trans->command;
dummy_bitlen = trans->dummy_bitlen;
if ((trans->flags & SPI_FLASH_TRANS_FLAG_IGNORE_BASEIO) != 0) {
io_mode = trans->io_mode;
}{...}
host->driver->configure_host_io_mode(host, command, trans->address_bitlen, dummy_bitlen, io_mode);
spi_flash_ll_set_usr_address(dev, trans->address, trans->address_bitlen);
if (trans->miso_len == 0) {
spi_flash_ll_set_dummy(dev, dummy_bitlen);
}{...}
spi_flash_ll_set_mosi_bitlen(dev, trans->mosi_len * 8);
spi_flash_ll_set_buffer_data(dev, trans->mosi_data, trans->mosi_len);
spi_flash_ll_set_miso_bitlen(dev, trans->miso_len * 8);
if ((trans->flags & SPI_FLASH_TRANS_FLAG_PE_CMD) != 0) {
pe_ops = true;
}{...}
spi_flash_ll_user_start(dev, pe_ops);
host->driver->poll_cmd_done(host);
if (trans->miso_len > 0) {
spi_flash_ll_get_buffer_data(dev, trans->miso_data, trans->miso_len);
}{...}
return ESP_OK;
}{ ... }
esp_err_t spi_flash_hal_read(spi_flash_host_inst_t *host, void *buffer, uint32_t address, uint32_t read_len)
{
spi_dev_t *dev = get_spi_dev(host);
int bitlen = spi_flash_ll_get_addr_bitlen(dev);
spi_flash_ll_set_usr_address(dev, address, bitlen & (~7));
spi_flash_ll_set_miso_bitlen(dev, read_len * 8);
spi_flash_ll_user_start(dev, false);
host->driver->poll_cmd_done(host);
if (read_len > 0) {
spi_flash_ll_get_buffer_data(dev, buffer, read_len);
}{...}
return ESP_OK;
}{ ... }