@@ -844,100 +844,101 @@ static int stm32_xspi_mem_reset(const struct device *dev)
844
844
}
845
845
846
846
#ifdef CONFIG_STM32_MEMMAP
847
- /* Function to configure the octoflash in MemoryMapped mode */
847
+ /* Function to configure the octoflash in MemoryMapped mode for writing and reading */
848
848
static int stm32_xspi_set_memorymap (const struct device * dev )
849
849
{
850
850
HAL_StatusTypeDef ret ;
851
851
const struct flash_stm32_xspi_config * dev_cfg = dev -> config ;
852
852
struct flash_stm32_xspi_data * dev_data = dev -> data ;
853
- XSPI_RegularCmdTypeDef s_command = {0 }; /* Non-zero values disturb the command */
854
- XSPI_MemoryMappedTypeDef s_MemMappedCfg ;
853
+ XSPI_RegularCmdTypeDef s_command = {0 };
854
+ XSPI_MemoryMappedTypeDef s_MemMappedCfg = { 0 } ;
855
855
856
856
/* Configure octoflash in MemoryMapped mode */
857
857
if ((dev_cfg -> data_mode == XSPI_SPI_MODE ) &&
858
858
(stm32_xspi_hal_address_size (dev ) == HAL_XSPI_ADDRESS_24_BITS )) {
859
859
/* OPI mode and 3-bytes address size not supported by memory */
860
860
LOG_ERR ("XSPI_SPI_MODE in 3Bytes addressing is not supported" );
861
- return - EIO ;
861
+ return - ENOTSUP ;
862
862
}
863
863
864
- /* Initialize the read command */
865
- s_command .OperationType = HAL_XSPI_OPTYPE_READ_CFG ;
866
- s_command .InstructionMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
867
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
868
- ? HAL_XSPI_INSTRUCTION_1_LINE
869
- : HAL_XSPI_INSTRUCTION_8_LINES )
870
- : HAL_XSPI_INSTRUCTION_8_LINES ;
871
- s_command .InstructionDTRMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
872
- ? HAL_XSPI_INSTRUCTION_DTR_DISABLE
873
- : HAL_XSPI_INSTRUCTION_DTR_ENABLE ;
874
- s_command .InstructionWidth = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
875
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
876
- ? HAL_XSPI_INSTRUCTION_8_BITS
877
- : HAL_XSPI_INSTRUCTION_16_BITS )
878
- : HAL_XSPI_INSTRUCTION_16_BITS ;
879
- s_command .Instruction = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
880
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
881
- ? ((stm32_xspi_hal_address_size (dev ) ==
882
- HAL_XSPI_ADDRESS_24_BITS )
883
- ? SPI_NOR_CMD_READ_FAST
884
- : SPI_NOR_CMD_READ_FAST_4B )
885
- : dev_data -> read_opcode )
886
- : SPI_NOR_OCMD_DTR_RD ;
887
- s_command .AddressMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
888
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
889
- ? HAL_XSPI_ADDRESS_1_LINE
890
- : HAL_XSPI_ADDRESS_8_LINES )
891
- : HAL_XSPI_ADDRESS_8_LINES ;
892
- s_command .AddressDTRMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
893
- ? HAL_XSPI_ADDRESS_DTR_DISABLE
894
- : HAL_XSPI_ADDRESS_DTR_ENABLE ;
895
- s_command .AddressWidth = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
896
- ? stm32_xspi_hal_address_size (dev )
897
- : HAL_XSPI_ADDRESS_32_BITS ;
898
- s_command .DataMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
899
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
900
- ? HAL_XSPI_DATA_1_LINE
901
- : HAL_XSPI_DATA_8_LINES )
902
- : HAL_XSPI_DATA_8_LINES ;
903
- s_command .DataDTRMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
904
- ? HAL_XSPI_DATA_DTR_DISABLE
905
- : HAL_XSPI_DATA_DTR_ENABLE ;
906
- s_command .DummyCycles = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
907
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
908
- ? SPI_NOR_DUMMY_RD
909
- : SPI_NOR_DUMMY_RD_OCTAL )
910
- : SPI_NOR_DUMMY_RD_OCTAL_DTR ;
911
- s_command .DQSMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
912
- ? HAL_XSPI_DQS_DISABLE
913
- : HAL_XSPI_DQS_ENABLE ;
914
- #ifdef XSPI_CCR_SIOO
915
- s_command .SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD ;
916
- #endif /* XSPI_CCR_SIOO */
917
-
918
- ret = HAL_XSPI_Command (& dev_data -> hxspi , & s_command , HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
919
- if (ret != HAL_OK ) {
920
- LOG_ERR ("%d: Failed to set memory map" , ret );
864
+ /* Enable write operation */
865
+ ret = stm32_xspi_write_enable (dev ,
866
+ dev_cfg -> data_mode , dev_cfg -> data_rate );
867
+ if (ret != 0 ) {
868
+ LOG_ERR ("XSPI: write not enabled" );
921
869
return - EIO ;
922
870
}
923
871
924
872
/* Initialize the program command */
925
873
s_command .OperationType = HAL_XSPI_OPTYPE_WRITE_CFG ;
926
- if (dev_cfg -> data_rate == XSPI_STR_TRANSFER ) {
927
- s_command .Instruction = (dev_cfg -> data_mode == XSPI_SPI_MODE )
928
- ? ((stm32_xspi_hal_address_size (dev ) ==
929
- HAL_XSPI_ADDRESS_24_BITS )
930
- ? SPI_NOR_CMD_PP
931
- : SPI_NOR_CMD_PP_4B )
932
- : SPI_NOR_OCMD_PAGE_PRG ;
933
- } else {
874
+ if (dev_cfg -> data_rate == XSPI_DTR_TRANSFER ) {
934
875
s_command .Instruction = SPI_NOR_OCMD_PAGE_PRG ;
876
+ s_command .InstructionMode = HAL_XSPI_INSTRUCTION_8_LINES ;
877
+ s_command .InstructionDTRMode = HAL_XSPI_INSTRUCTION_DTR_ENABLE ;
878
+ s_command .InstructionWidth = HAL_XSPI_INSTRUCTION_16_BITS ;
879
+ s_command .AddressMode = HAL_XSPI_ADDRESS_8_LINES ;
880
+ s_command .AddressDTRMode = HAL_XSPI_ADDRESS_DTR_ENABLE ;
881
+ s_command .AddressWidth = HAL_XSPI_ADDRESS_32_BITS ;
882
+ s_command .AlternateBytesMode = HAL_XSPI_ALT_BYTES_NONE ;
883
+ s_command .DataMode = HAL_XSPI_DATA_8_LINES ;
884
+ s_command .DataDTRMode = HAL_XSPI_DATA_DTR_ENABLE ;
885
+ } else {
886
+ s_command .Instruction = (dev_cfg -> data_mode == XSPI_SPI_MODE )
887
+ ? ((stm32_xspi_hal_address_size (dev ) ==
888
+ HAL_XSPI_ADDRESS_24_BITS )
889
+ ? SPI_NOR_CMD_PP
890
+ : SPI_NOR_CMD_PP_4B )
891
+ : SPI_NOR_OCMD_PAGE_PRG ;
892
+ s_command .InstructionMode = (dev_cfg -> data_mode == XSPI_SPI_MODE )
893
+ ? HAL_XSPI_INSTRUCTION_1_LINE
894
+ : HAL_XSPI_INSTRUCTION_8_LINES ;
895
+ s_command .InstructionWidth = (dev_cfg -> data_mode == XSPI_SPI_MODE )
896
+ ? HAL_XSPI_INSTRUCTION_8_BITS
897
+ : HAL_XSPI_INSTRUCTION_16_BITS ;
898
+ s_command .AddressMode = (dev_cfg -> data_mode == XSPI_SPI_MODE )
899
+ ? HAL_XSPI_ADDRESS_1_LINE
900
+ : HAL_XSPI_ADDRESS_8_LINES ;
901
+ s_command .AddressDTRMode = HAL_XSPI_ADDRESS_DTR_DISABLE ;
902
+ s_command .AddressWidth = stm32_xspi_hal_address_size (dev );
903
+ s_command .AlternateBytesMode = HAL_XSPI_ALT_BYTES_NONE ;
904
+ s_command .DataMode = (dev_cfg -> data_mode == XSPI_SPI_MODE )
905
+ ? HAL_XSPI_DATA_1_LINE
906
+ : HAL_XSPI_DATA_8_LINES ;
907
+ }
908
+ #if defined (XSPI_CCR_SIOO )
909
+ s_command .SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD ;
910
+ #endif
911
+ s_command .DQSMode = HAL_XSPI_DQS_ENABLE ;
912
+ s_command .DummyCycles = 0U ;
913
+ ret = HAL_XSPI_Command (& dev_data -> hxspi , & s_command , HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
914
+ if (ret != HAL_OK ) {
915
+ LOG_ERR ("%d: Failed to set memory map wr" , ret );
916
+ return - EIO ;
935
917
}
936
- s_command .DQSMode = HAL_XSPI_DQS_DISABLE ;
937
918
919
+ /* Initialize the read command */
920
+ s_command .OperationType = HAL_XSPI_OPTYPE_READ_CFG ;
921
+ if (dev_cfg -> data_rate == XSPI_DTR_TRANSFER ) {
922
+ s_command .Instruction = SPI_NOR_OCMD_DTR_RD ;
923
+ s_command .DummyCycles = SPI_NOR_DUMMY_RD_OCTAL_DTR ;
924
+ } else {
925
+ s_command .Instruction = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
926
+ ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
927
+ ? ((stm32_xspi_hal_address_size (dev ) == HAL_XSPI_ADDRESS_24_BITS )
928
+ ? SPI_NOR_CMD_READ_FAST
929
+ : SPI_NOR_CMD_READ_FAST_4B )
930
+ : dev_data -> read_opcode )
931
+ : SPI_NOR_OCMD_DTR_RD ;
932
+ s_command .DummyCycles = (dev_cfg -> data_mode == XSPI_SPI_MODE )
933
+ ? SPI_NOR_DUMMY_RD
934
+ : SPI_NOR_DUMMY_RD_OCTAL ;
935
+ }
936
+ #if defined (XSPI_CCR_SIOO )
937
+ s_command .SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD ;
938
+ #endif
938
939
ret = HAL_XSPI_Command (& dev_data -> hxspi , & s_command , HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
939
940
if (ret != HAL_OK ) {
940
- LOG_ERR ("%d: Failed to set memory mapped " , ret );
941
+ LOG_ERR ("%d: Failed to set memory map rd " , ret );
941
942
return - EIO ;
942
943
}
943
944
@@ -946,11 +947,12 @@ static int stm32_xspi_set_memorymap(const struct device *dev)
946
947
947
948
ret = HAL_XSPI_MemoryMapped (& dev_data -> hxspi , & s_MemMappedCfg );
948
949
if (ret != HAL_OK ) {
949
- LOG_ERR ("%d: Failed to enable memory mapped " , ret );
950
+ LOG_ERR ("%d: Failed to set memory map " , ret );
950
951
return - EIO ;
951
952
}
952
953
953
- LOG_DBG ("MemoryMap mode enabled" );
954
+ LOG_INF ("Memory-mapped mode enabled" );
955
+
954
956
return 0 ;
955
957
}
956
958
@@ -1022,7 +1024,7 @@ static int flash_stm32_xspi_erase(const struct device *dev, off_t addr,
1022
1024
goto erase_end ;
1023
1025
}
1024
1026
}
1025
- #endif
1027
+ #endif /* CONFIG_STM32_MEMMAP */
1026
1028
1027
1029
XSPI_RegularCmdTypeDef cmd_erase = {
1028
1030
.OperationType = HAL_XSPI_OPTYPE_COMMON_CFG ,
@@ -1192,11 +1194,15 @@ static int flash_stm32_xspi_read(const struct device *dev, off_t addr,
1192
1194
1193
1195
uintptr_t mmap_addr = STM32_XSPI_BASE_ADDRESS + addr ;
1194
1196
1195
- LOG_DBG ("Memory-mapped read from 0x%08lx, len %zu" , mmap_addr , size );
1197
+ LOG_INF ("Memory-mapped read from 0x%08lx, len %zu" , mmap_addr , size );
1196
1198
memcpy (data , (void * )mmap_addr , size );
1197
- ret = 0 ;
1199
+
1200
+ /* After a memory mapped read, do a synchroniztion barrier and an abort (RefMan) */
1201
+ __DSB ();
1202
+ ret = stm32_xspi_abort (dev );
1203
+
1198
1204
goto read_end ;
1199
- #else
1205
+ #else /* CONFIG_STM32_MEMMAP */
1200
1206
XSPI_RegularCmdTypeDef cmd = xspi_prepare_cmd (dev_cfg -> data_mode , dev_cfg -> data_rate );
1201
1207
1202
1208
if (dev_cfg -> data_mode != XSPI_OCTO_MODE ) {
@@ -1262,7 +1268,7 @@ static int flash_stm32_xspi_read(const struct device *dev, off_t addr,
1262
1268
1263
1269
ret = xspi_read_access (dev , & cmd , data , size );
1264
1270
goto read_end ;
1265
- #endif
1271
+ #endif /* CONFIG_STM32_MEMMAP */
1266
1272
1267
1273
read_end :
1268
1274
xspi_unlock_thread (dev );
@@ -1293,17 +1299,40 @@ static int flash_stm32_xspi_write(const struct device *dev, off_t addr,
1293
1299
xspi_lock_thread (dev );
1294
1300
1295
1301
#ifdef CONFIG_STM32_MEMMAP
1302
+ ARG_UNUSED (dev_cfg );
1296
1303
ARG_UNUSED (dev_data );
1304
+ ARG_UNUSED (to_write );
1297
1305
1298
- if ( stm32_xspi_is_memorymap ( dev )) {
1299
- /* Abort ongoing transfer to force CS high/BUSY deasserted */
1300
- ret = stm32_xspi_abort (dev );
1306
+ /* Do writes through memory-mapping instead of indirect */
1307
+ if (! stm32_xspi_is_memorymap ( dev )) {
1308
+ ret = stm32_xspi_set_memorymap (dev );
1301
1309
if (ret != 0 ) {
1302
- LOG_ERR ("Failed to abort memory-mapped access before write " );
1310
+ LOG_ERR ("WRITE: failed to set memory mapped " );
1303
1311
goto write_end ;
1304
1312
}
1305
1313
}
1306
- #endif
1314
+ __ASSERT_NO_MSG (stm32_xspi_is_memorymap (dev ));
1315
+
1316
+ uintptr_t mmap_addr = STM32_XSPI_BASE_ADDRESS + addr ;
1317
+
1318
+ LOG_INF ("Memory-mapped write from 0x%08lx, len %zu" , mmap_addr , size );
1319
+ memcpy ((void * )mmap_addr , data , size );
1320
+
1321
+ /*
1322
+ * In memory-mapped mode, not possible to check if the memory is ready
1323
+ * after the programming. So a delay corresponding to max page programming
1324
+ * time is added */
1325
+ k_busy_wait (HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
1326
+
1327
+ /* After a memory mapped write do a dummy read then a synchroniztion barrier and an abort (RefMan) */
1328
+ uint8_t dummy_read [1 ];
1329
+ memcpy (dummy_read , (void * )mmap_addr , 1 );
1330
+ __DSB ();
1331
+ ret = stm32_xspi_abort (dev );
1332
+
1333
+ goto write_end ;
1334
+ #else /* CONFIG_STM32_MEMMAP */
1335
+
1307
1336
/* page program for STR or DTR mode */
1308
1337
XSPI_RegularCmdTypeDef cmd_pp = xspi_prepare_cmd (dev_cfg -> data_mode , dev_cfg -> data_rate );
1309
1338
@@ -1396,7 +1425,7 @@ static int flash_stm32_xspi_write(const struct device *dev, off_t addr,
1396
1425
break ;
1397
1426
}
1398
1427
}
1399
- /* Ends the write operation */
1428
+ #endif /* CONFIG_STM32_MEMMAP */
1400
1429
1401
1430
write_end :
1402
1431
xspi_unlock_thread (dev );
0 commit comments