2222LOG_MODULE_REGISTER (flash_flexspi_nor , CONFIG_FLASH_LOG_LEVEL );
2323
2424enum {
25- /* SPI instructions */
26- READ_ID ,
27- READ_STATUS_REG ,
28- WRITE_STATUS_REG ,
25+ /* Instructions matching with XIP layout */
26+ READ_FAST_QUAD_OUTPUT ,
27+ READ_FAST_OUTPUT ,
28+ READ_NORMAL_OUTPUT ,
29+ READ_STATUS ,
2930 WRITE_ENABLE ,
3031 ERASE_SECTOR ,
31- ERASE_CHIP ,
32-
33- /* Quad SPI instructions */
34- READ_FAST_QUAD_OUTPUT ,
32+ PAGE_PROGRAM_INPUT ,
3533 PAGE_PROGRAM_QUAD_INPUT ,
34+ READ_ID ,
35+ WRITE_STATUS_REG ,
3636 ENTER_QPI ,
37+ EXIT_QPI ,
38+ READ_STATUS_REG ,
39+ ERASE_CHIP ,
3740};
3841
3942struct flash_flexspi_nor_config {
@@ -86,6 +89,32 @@ static const uint32_t flash_flexspi_nor_lut[][4] = {
8689 kFLEXSPI_Command_READ_SDR , kFLEXSPI_4PAD , 0x04 ),
8790 },
8891
92+ [READ_FAST_OUTPUT ] = {
93+ FLEXSPI_LUT_SEQ (kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , 0x0B ,
94+ kFLEXSPI_Command_RADDR_SDR , kFLEXSPI_1PAD , 0x18 ),
95+ FLEXSPI_LUT_SEQ (kFLEXSPI_Command_DUMMY_SDR , kFLEXSPI_1PAD , 0x08 ,
96+ kFLEXSPI_Command_READ_SDR , kFLEXSPI_1PAD , 0x04 ),
97+ },
98+
99+ [READ_NORMAL_OUTPUT ] = {
100+ FLEXSPI_LUT_SEQ (kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , SPI_NOR_CMD_READ ,
101+ kFLEXSPI_Command_RADDR_SDR , kFLEXSPI_1PAD , 0x18 ),
102+ FLEXSPI_LUT_SEQ (kFLEXSPI_Command_READ_SDR , kFLEXSPI_1PAD , 0x04 ,
103+ kFLEXSPI_Command_STOP , kFLEXSPI_1PAD , 0 ),
104+ },
105+
106+ [READ_STATUS ] = {
107+ FLEXSPI_LUT_SEQ (kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , 0x81 ,
108+ kFLEXSPI_Command_READ_SDR , kFLEXSPI_1PAD , 0x04 ),
109+ },
110+
111+ [PAGE_PROGRAM_INPUT ] = {
112+ FLEXSPI_LUT_SEQ (kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , SPI_NOR_CMD_PP ,
113+ kFLEXSPI_Command_RADDR_SDR , kFLEXSPI_1PAD , 0x18 ),
114+ FLEXSPI_LUT_SEQ (kFLEXSPI_Command_WRITE_SDR , kFLEXSPI_1PAD , 0x04 ,
115+ kFLEXSPI_Command_STOP , kFLEXSPI_1PAD , 0 ),
116+ },
117+
89118 [PAGE_PROGRAM_QUAD_INPUT ] = {
90119 FLEXSPI_LUT_SEQ (kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , 0x32 ,
91120 kFLEXSPI_Command_RADDR_SDR , kFLEXSPI_1PAD , 0x18 ),
@@ -97,6 +126,11 @@ static const uint32_t flash_flexspi_nor_lut[][4] = {
97126 FLEXSPI_LUT_SEQ (kFLEXSPI_Command_SDR , kFLEXSPI_1PAD , 0x35 ,
98127 kFLEXSPI_Command_STOP , kFLEXSPI_1PAD , 0 ),
99128 },
129+
130+ [EXIT_QPI ] = {
131+ FLEXSPI_LUT_SEQ (kFLEXSPI_Command_SDR , kFLEXSPI_4PAD , 0xF5 ,
132+ kFLEXSPI_Command_STOP , kFLEXSPI_1PAD , 0 ),
133+ },
100134};
101135
102136static int flash_flexspi_nor_get_vendor_id (const struct device * dev ,
@@ -300,11 +334,16 @@ static int flash_flexspi_nor_write(const struct device *dev, off_t offset,
300334 size_t size = len ;
301335 uint8_t * src = (uint8_t * ) buffer ;
302336 int i ;
337+ unsigned int key = 0 ;
303338
304339 uint8_t * dst = memc_flexspi_get_ahb_address (data -> controller ,
305340 config -> port ,
306341 offset );
307342
343+ if (memc_flexspi_is_running_xip (data -> controller )) {
344+ key = irq_lock ();
345+ }
346+
308347 while (len ) {
309348 i = MIN (SPI_NOR_PAGE_SIZE , len );
310349 flash_flexspi_nor_write_enable (dev );
@@ -315,6 +354,10 @@ static int flash_flexspi_nor_write(const struct device *dev, off_t offset,
315354 len -= i ;
316355 }
317356
357+ if (memc_flexspi_is_running_xip (data -> controller )) {
358+ irq_unlock (key );
359+ }
360+
318361#ifdef CONFIG_HAS_MCUX_CACHE
319362 DCACHE_InvalidateByRange ((uint32_t ) dst , size );
320363#endif
@@ -329,6 +372,7 @@ static int flash_flexspi_nor_erase(const struct device *dev, off_t offset,
329372 struct flash_flexspi_nor_data * data = dev -> data ;
330373 int num_sectors = size / SPI_NOR_SECTOR_SIZE ;
331374 int i ;
375+ unsigned int key = 0 ;
332376
333377 uint8_t * dst = memc_flexspi_get_ahb_address (data -> controller ,
334378 config -> port ,
@@ -344,6 +388,10 @@ static int flash_flexspi_nor_erase(const struct device *dev, off_t offset,
344388 return - EINVAL ;
345389 }
346390
391+ if (memc_flexspi_is_running_xip (data -> controller )) {
392+ key = irq_lock ();
393+ }
394+
347395 if ((offset == 0 ) && (size == config -> config .flashSize * KB (1 ))) {
348396 flash_flexspi_nor_write_enable (dev );
349397 flash_flexspi_nor_erase_chip (dev );
@@ -359,6 +407,10 @@ static int flash_flexspi_nor_erase(const struct device *dev, off_t offset,
359407 }
360408 }
361409
410+ if (memc_flexspi_is_running_xip (data -> controller )) {
411+ irq_unlock (key );
412+ }
413+
362414#ifdef CONFIG_HAS_MCUX_CACHE
363415 DCACHE_InvalidateByRange ((uint32_t ) dst , size );
364416#endif
@@ -397,7 +449,8 @@ static int flash_flexspi_nor_init(const struct device *dev)
397449 return - EINVAL ;
398450 }
399451
400- if (memc_flexspi_set_device_config (data -> controller , & config -> config ,
452+ if (!memc_flexspi_is_running_xip (data -> controller ) &&
453+ memc_flexspi_set_device_config (data -> controller , & config -> config ,
401454 config -> port )) {
402455 LOG_ERR ("Could not set device configuration" );
403456 return - EINVAL ;
0 commit comments