@@ -153,6 +153,7 @@ struct spi_nor_config {
153
153
bool wp_gpios_exist :1 ;
154
154
bool hold_gpios_exist :1 ;
155
155
bool has_flsr : 1 ;
156
+ bool use_fast_read : 1 ;
156
157
};
157
158
158
159
/**
@@ -359,6 +360,10 @@ static inline void delay_until_exit_dpd_ok(const struct device *const dev)
359
360
*/
360
361
#define NOR_ACCESS_32BIT_ADDR BIT(2)
361
362
363
+ /* Indicates that a dummy byte is to be sent following the address.
364
+ */
365
+ #define NOR_ACCESS_DUMMY_BYTE BIT(3)
366
+
362
367
/* Indicates that an access command is performing a write. If not
363
368
* provided access is a read.
364
369
*/
@@ -384,7 +389,8 @@ static int spi_nor_access(const struct device *const dev,
384
389
struct spi_nor_data * const driver_data = dev -> data ;
385
390
bool is_addressed = (access & NOR_ACCESS_ADDRESSED ) != 0U ;
386
391
bool is_write = (access & NOR_ACCESS_WRITE ) != 0U ;
387
- uint8_t cmd_buf [5 ] = {opcode };
392
+ bool has_dummy = (access & NOR_ACCESS_DUMMY_BYTE ) != 0U ;
393
+ uint8_t cmd_buf [6 ] = {opcode };
388
394
struct spi_buf spi_buf_tx [2 ] = {{
389
395
.buf = cmd_buf ,
390
396
.len = 1 ,
@@ -419,6 +425,10 @@ static int spi_nor_access(const struct device *const dev,
419
425
spi_buf_rx [0 ].len += 3 ;
420
426
}
421
427
};
428
+ if (has_dummy ) {
429
+ spi_buf_tx [0 ].len ++ ;
430
+ spi_buf_rx [0 ].len ++ ;
431
+ }
422
432
423
433
const struct spi_buf_set tx_set = {
424
434
.buffers = spi_buf_tx ,
@@ -447,6 +457,17 @@ static int spi_nor_access(const struct device *const dev,
447
457
#define spi_nor_cmd_addr_read_4b (dev , opcode , addr , dest , length ) \
448
458
spi_nor_access(dev, opcode, NOR_ACCESS_32BIT_ADDR | NOR_ACCESS_ADDRESSED, addr, dest, \
449
459
length)
460
+ #define spi_nor_cmd_addr_fast_read (dev , opcode , addr , dest , length ) \
461
+ spi_nor_access(dev, opcode, NOR_ACCESS_ADDRESSED | NOR_ACCESS_DUMMY_BYTE, addr, dest, \
462
+ length)
463
+ #define spi_nor_cmd_addr_fast_read_3b (dev , opcode , addr , dest , length ) \
464
+ spi_nor_access(dev, opcode, \
465
+ NOR_ACCESS_24BIT_ADDR | NOR_ACCESS_ADDRESSED | NOR_ACCESS_DUMMY_BYTE, addr, \
466
+ dest, length)
467
+ #define spi_nor_cmd_addr_fast_read_4b (dev , opcode , addr , dest , length ) \
468
+ spi_nor_access(dev, opcode, \
469
+ NOR_ACCESS_32BIT_ADDR | NOR_ACCESS_ADDRESSED | NOR_ACCESS_DUMMY_BYTE, addr, \
470
+ dest, length)
450
471
#define spi_nor_cmd_write (dev , opcode ) \
451
472
spi_nor_access(dev, opcode, NOR_ACCESS_WRITE, 0, NULL, 0)
452
473
#define spi_nor_cmd_addr_write (dev , opcode , addr , src , length ) \
@@ -834,6 +855,7 @@ static int mxicy_configure(const struct device *dev, const uint8_t *jedec_id)
834
855
static int spi_nor_read (const struct device * dev , off_t addr , void * dest ,
835
856
size_t size )
836
857
{
858
+ const struct spi_nor_config * cfg = dev -> config ;
837
859
const size_t flash_size = dev_flash_size (dev );
838
860
int ret ;
839
861
@@ -849,14 +871,31 @@ static int spi_nor_read(const struct device *dev, off_t addr, void *dest,
849
871
850
872
acquire_device (dev );
851
873
852
- if (IS_ENABLED (ANY_INST_USE_4B_ADDR_OPCODES ) && DEV_CFG ( dev ) -> use_4b_addr_opcodes ) {
874
+ if (IS_ENABLED (ANY_INST_USE_4B_ADDR_OPCODES ) && cfg -> use_4b_addr_opcodes ) {
853
875
if (addr > SPI_NOR_3B_ADDR_MAX ) {
854
- ret = spi_nor_cmd_addr_read_4b (dev , SPI_NOR_CMD_READ_4B , addr , dest , size );
876
+ if (cfg -> use_fast_read ) {
877
+ ret = spi_nor_cmd_addr_fast_read_4b (dev , SPI_NOR_CMD_READ_FAST_4B ,
878
+ addr , dest , size );
879
+ } else {
880
+ ret = spi_nor_cmd_addr_read_4b (dev , SPI_NOR_CMD_READ_4B , addr , dest ,
881
+ size );
882
+ }
855
883
} else {
856
- ret = spi_nor_cmd_addr_read_3b (dev , SPI_NOR_CMD_READ , addr , dest , size );
884
+ if (cfg -> use_fast_read ) {
885
+ ret = spi_nor_cmd_addr_fast_read_3b (dev , SPI_NOR_CMD_READ_FAST ,
886
+ addr , dest , size );
887
+ } else {
888
+ ret = spi_nor_cmd_addr_read_3b (dev , SPI_NOR_CMD_READ , addr , dest ,
889
+ size );
890
+ }
857
891
}
858
892
} else {
859
- ret = spi_nor_cmd_addr_read (dev , SPI_NOR_CMD_READ , addr , dest , size );
893
+ if (cfg -> use_fast_read ) {
894
+ ret = spi_nor_cmd_addr_fast_read (dev , SPI_NOR_CMD_READ_FAST , addr , dest ,
895
+ size );
896
+ } else {
897
+ ret = spi_nor_cmd_addr_read (dev , SPI_NOR_CMD_READ , addr , dest , size );
898
+ }
860
899
}
861
900
862
901
release_device (dev );
@@ -1856,6 +1895,7 @@ static DEVICE_API(flash, spi_nor_api) = {
1856
1895
.hold_gpios_exist = DT_INST_NODE_HAS_PROP(idx, hold_gpios), \
1857
1896
.use_4b_addr_opcodes = DT_INST_PROP(idx, use_4b_addr_opcodes), \
1858
1897
.has_flsr = DT_INST_PROP(idx, use_flag_status_register), \
1898
+ .use_fast_read = DT_INST_PROP(idx, use_fast_read), \
1859
1899
IF_ENABLED(INST_HAS_LOCK(idx), (.has_lock = DT_INST_PROP(idx, has_lock),)) \
1860
1900
IF_ENABLED(ANY_INST_HAS_DPD, (INIT_T_ENTER_DPD(idx),)) \
1861
1901
IF_ENABLED(UTIL_AND(ANY_INST_HAS_DPD, ANY_INST_HAS_T_EXIT_DPD), \
0 commit comments