@@ -849,106 +849,103 @@ static int stm32_xspi_mem_reset(const struct device *dev)
849
849
}
850
850
851
851
#ifdef CONFIG_STM32_MEMMAP
852
- /* Function to configure the octoflash in MemoryMapped mode */
852
+ /* Function to configure the octoflash in MemoryMapped mode for writing and reading */
853
853
static int stm32_xspi_set_memorymap (const struct device * dev )
854
854
{
855
855
HAL_StatusTypeDef ret ;
856
856
const struct flash_stm32_xspi_config * dev_cfg = dev -> config ;
857
857
struct flash_stm32_xspi_data * dev_data = dev -> data ;
858
- XSPI_RegularCmdTypeDef s_command = {0 }; /* Non-zero values disturb the command */
858
+ XSPI_RegularCmdTypeDef s_command = {0 };
859
859
XSPI_MemoryMappedTypeDef s_MemMappedCfg = {0 };
860
860
861
861
/* Configure octoflash in MemoryMapped mode */
862
862
if ((dev_cfg -> data_mode == XSPI_SPI_MODE ) &&
863
863
(stm32_xspi_hal_address_size (dev ) == HAL_XSPI_ADDRESS_24_BITS )) {
864
864
/* OPI mode and 3-bytes address size not supported by memory */
865
865
LOG_ERR ("XSPI_SPI_MODE in 3Bytes addressing is not supported" );
866
- return - EIO ;
866
+ return - ENOTSUP ;
867
867
}
868
868
869
- /* Initialize the read command */
870
- s_command .OperationType = HAL_XSPI_OPTYPE_READ_CFG ;
871
- s_command .InstructionMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
872
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
873
- ? HAL_XSPI_INSTRUCTION_1_LINE
874
- : HAL_XSPI_INSTRUCTION_8_LINES )
875
- : HAL_XSPI_INSTRUCTION_8_LINES ;
876
- s_command .InstructionDTRMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
877
- ? HAL_XSPI_INSTRUCTION_DTR_DISABLE
878
- : HAL_XSPI_INSTRUCTION_DTR_ENABLE ;
879
- s_command .InstructionWidth = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
880
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
881
- ? HAL_XSPI_INSTRUCTION_8_BITS
882
- : HAL_XSPI_INSTRUCTION_16_BITS )
883
- : HAL_XSPI_INSTRUCTION_16_BITS ;
884
- s_command .Instruction = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
885
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
886
- ? ((stm32_xspi_hal_address_size (dev ) ==
887
- HAL_XSPI_ADDRESS_24_BITS )
888
- ? SPI_NOR_CMD_READ_FAST
889
- : SPI_NOR_CMD_READ_FAST_4B )
890
- : dev_data -> read_opcode )
891
- : SPI_NOR_OCMD_DTR_RD ;
892
- s_command .AddressMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
893
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
894
- ? HAL_XSPI_ADDRESS_1_LINE
895
- : HAL_XSPI_ADDRESS_8_LINES )
896
- : HAL_XSPI_ADDRESS_8_LINES ;
897
- s_command .AddressDTRMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
898
- ? HAL_XSPI_ADDRESS_DTR_DISABLE
899
- : HAL_XSPI_ADDRESS_DTR_ENABLE ;
900
- s_command .AddressWidth = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
901
- ? stm32_xspi_hal_address_size (dev )
902
- : HAL_XSPI_ADDRESS_32_BITS ;
903
- s_command .DataMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
904
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
905
- ? HAL_XSPI_DATA_1_LINE
906
- : HAL_XSPI_DATA_8_LINES )
907
- : HAL_XSPI_DATA_8_LINES ;
908
- s_command .DataDTRMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
909
- ? HAL_XSPI_DATA_DTR_DISABLE
910
- : HAL_XSPI_DATA_DTR_ENABLE ;
911
- s_command .DummyCycles = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
912
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
913
- ? SPI_NOR_DUMMY_RD
914
- : SPI_NOR_DUMMY_RD_OCTAL )
915
- : SPI_NOR_DUMMY_RD_OCTAL_DTR ;
916
- s_command .DQSMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
917
- ? HAL_XSPI_DQS_DISABLE
918
- : HAL_XSPI_DQS_ENABLE ;
919
- #ifdef XSPI_CCR_SIOO
920
- s_command .SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD ;
921
- #endif /* XSPI_CCR_SIOO */
922
-
923
- ret = HAL_XSPI_Command (& dev_data -> hxspi , & s_command , HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
924
- if (ret != HAL_OK ) {
925
- LOG_ERR ("%d: Failed to set memory map" , ret );
869
+ /* Enable write operation */
870
+ ret = stm32_xspi_write_enable (dev ,
871
+ dev_cfg -> data_mode , dev_cfg -> data_rate );
872
+ if (ret != 0 ) {
873
+ LOG_ERR ("XSPI: write not enabled" );
926
874
return - EIO ;
927
875
}
928
876
929
877
/* Initialize the program command */
930
878
s_command .OperationType = HAL_XSPI_OPTYPE_WRITE_CFG ;
931
- if (dev_cfg -> data_rate == XSPI_STR_TRANSFER ) {
932
- s_command .Instruction = (dev_cfg -> data_mode == XSPI_SPI_MODE )
933
- ? ((stm32_xspi_hal_address_size (dev ) ==
934
- HAL_XSPI_ADDRESS_24_BITS )
935
- ? SPI_NOR_CMD_PP
936
- : SPI_NOR_CMD_PP_4B )
937
- : SPI_NOR_OCMD_PAGE_PRG ;
938
- } else {
879
+ if (dev_cfg -> data_rate == XSPI_DTR_TRANSFER ) {
939
880
s_command .Instruction = SPI_NOR_OCMD_PAGE_PRG ;
881
+ s_command .InstructionMode = HAL_XSPI_INSTRUCTION_8_LINES ;
882
+ s_command .InstructionDTRMode = HAL_XSPI_INSTRUCTION_DTR_ENABLE ;
883
+ s_command .InstructionWidth = HAL_XSPI_INSTRUCTION_16_BITS ;
884
+ s_command .AddressMode = HAL_XSPI_ADDRESS_8_LINES ;
885
+ s_command .AddressDTRMode = HAL_XSPI_ADDRESS_DTR_ENABLE ;
886
+ s_command .AddressWidth = HAL_XSPI_ADDRESS_32_BITS ;
887
+ s_command .DataMode = HAL_XSPI_DATA_8_LINES ;
888
+ s_command .DataDTRMode = HAL_XSPI_DATA_DTR_ENABLE ;
889
+ } else {
890
+ s_command .Instruction = (dev_cfg -> data_mode == XSPI_SPI_MODE )
891
+ ? ((stm32_xspi_hal_address_size (dev ) ==
892
+ HAL_XSPI_ADDRESS_24_BITS )
893
+ ? SPI_NOR_CMD_PP
894
+ : SPI_NOR_CMD_PP_4B )
895
+ : SPI_NOR_OCMD_PAGE_PRG ;
896
+ s_command .InstructionMode = (dev_cfg -> data_mode == XSPI_SPI_MODE )
897
+ ? HAL_XSPI_INSTRUCTION_1_LINE
898
+ : HAL_XSPI_INSTRUCTION_8_LINES ;
899
+ s_command .InstructionWidth = (dev_cfg -> data_mode == XSPI_SPI_MODE )
900
+ ? HAL_XSPI_INSTRUCTION_8_BITS
901
+ : HAL_XSPI_INSTRUCTION_16_BITS ;
902
+ s_command .AddressMode = (dev_cfg -> data_mode == XSPI_SPI_MODE )
903
+ ? HAL_XSPI_ADDRESS_1_LINE
904
+ : HAL_XSPI_ADDRESS_8_LINES ;
905
+ s_command .AddressWidth = stm32_xspi_hal_address_size (dev );
906
+ s_command .DataMode = (dev_cfg -> data_mode == XSPI_SPI_MODE )
907
+ ? HAL_XSPI_DATA_1_LINE
908
+ : HAL_XSPI_DATA_8_LINES ;
909
+ }
910
+ #if defined(XSPI_CCR_SIOO )
911
+ s_command .SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD ;
912
+ #endif
913
+ s_command .DQSMode = HAL_XSPI_DQS_ENABLE ;
914
+ s_command .DummyCycles = 0U ;
915
+ ret = HAL_XSPI_Command (& dev_data -> hxspi , & s_command , HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
916
+ if (ret != HAL_OK ) {
917
+ LOG_ERR ("%d: Failed to set memory map wr" , ret );
918
+ return - EIO ;
940
919
}
941
- s_command .DQSMode = HAL_XSPI_DQS_DISABLE ;
942
920
921
+ /* Initialize the read command */
922
+ s_command .OperationType = HAL_XSPI_OPTYPE_READ_CFG ;
923
+ if (dev_cfg -> data_rate == XSPI_DTR_TRANSFER ) {
924
+ s_command .Instruction = SPI_NOR_OCMD_DTR_RD ;
925
+ s_command .DummyCycles = SPI_NOR_DUMMY_RD_OCTAL_DTR ;
926
+ } else {
927
+ s_command .Instruction = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
928
+ ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
929
+ ? ((stm32_xspi_hal_address_size (dev ) == HAL_XSPI_ADDRESS_24_BITS )
930
+ ? SPI_NOR_CMD_READ_FAST
931
+ : SPI_NOR_CMD_READ_FAST_4B )
932
+ : dev_data -> read_opcode )
933
+ : SPI_NOR_OCMD_DTR_RD ;
934
+ s_command .DummyCycles = (dev_cfg -> data_mode == XSPI_SPI_MODE )
935
+ ? SPI_NOR_DUMMY_RD
936
+ : SPI_NOR_DUMMY_RD_OCTAL ;
937
+ }
938
+ #if defined(XSPI_CCR_SIOO )
939
+ s_command .SIOOMode = HAL_XSPI_SIOO_INST_EVERY_CMD ;
940
+ #endif
943
941
ret = HAL_XSPI_Command (& dev_data -> hxspi , & s_command , HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
944
942
if (ret != HAL_OK ) {
945
- LOG_ERR ("%d: Failed to set memory mapped " , ret );
943
+ LOG_ERR ("%d: Failed to set memory map rd " , ret );
946
944
return - EIO ;
947
945
}
948
946
949
947
/* Enable the memory-mapping */
950
948
s_MemMappedCfg .TimeOutActivation = HAL_XSPI_TIMEOUT_COUNTER_DISABLE ;
951
-
952
949
#ifdef XSPI_CR_NOPREF
953
950
s_MemMappedCfg .NoPrefetchData = HAL_XSPI_AUTOMATIC_PREFETCH_ENABLE ;
954
951
#ifdef XSPI_CR_NOPREF_AXI
@@ -958,11 +955,12 @@ static int stm32_xspi_set_memorymap(const struct device *dev)
958
955
959
956
ret = HAL_XSPI_MemoryMapped (& dev_data -> hxspi , & s_MemMappedCfg );
960
957
if (ret != HAL_OK ) {
961
- LOG_ERR ("%d: Failed to enable memory mapped " , ret );
958
+ LOG_ERR ("%d: Failed to set memory map " , ret );
962
959
return - EIO ;
963
960
}
964
961
965
- LOG_DBG ("MemoryMap mode enabled" );
962
+ LOG_INF ("Memory-mapped mode enabled" );
963
+
966
964
return 0 ;
967
965
}
968
966
@@ -1204,11 +1202,15 @@ static int flash_stm32_xspi_read(const struct device *dev, off_t addr,
1204
1202
1205
1203
uintptr_t mmap_addr = STM32_XSPI_BASE_ADDRESS + addr ;
1206
1204
1207
- LOG_DBG ("Memory-mapped read from 0x%08lx, len %zu" , mmap_addr , size );
1205
+ LOG_INF ("Memory-mapped read from 0x%08lx, len %zu" , mmap_addr , size );
1208
1206
memcpy (data , (void * )mmap_addr , size );
1209
- ret = 0 ;
1207
+
1208
+ /* After a memory mapped read, do a synchroniztion barrier and an abort (RefMan) */
1209
+ __DSB ();
1210
+ ret = stm32_xspi_abort (dev );
1211
+
1210
1212
goto read_end ;
1211
- #else
1213
+ #else /* CONFIG_STM32_MEMMAP */
1212
1214
XSPI_RegularCmdTypeDef cmd = xspi_prepare_cmd (dev_cfg -> data_mode , dev_cfg -> data_rate );
1213
1215
1214
1216
if (dev_cfg -> data_mode != XSPI_OCTO_MODE ) {
@@ -1274,7 +1276,7 @@ static int flash_stm32_xspi_read(const struct device *dev, off_t addr,
1274
1276
1275
1277
ret = xspi_read_access (dev , & cmd , data , size );
1276
1278
goto read_end ;
1277
- #endif
1279
+ #endif /* CONFIG_STM32_MEMMAP */
1278
1280
1279
1281
read_end :
1280
1282
xspi_unlock_thread (dev );
@@ -1305,17 +1307,44 @@ static int flash_stm32_xspi_write(const struct device *dev, off_t addr,
1305
1307
xspi_lock_thread (dev );
1306
1308
1307
1309
#ifdef CONFIG_STM32_MEMMAP
1310
+ ARG_UNUSED (dev_cfg );
1308
1311
ARG_UNUSED (dev_data );
1312
+ ARG_UNUSED (to_write );
1309
1313
1310
- if ( stm32_xspi_is_memorymap ( dev )) {
1311
- /* Abort ongoing transfer to force CS high/BUSY deasserted */
1312
- ret = stm32_xspi_abort (dev );
1314
+ /* Do writes through memory-mapping instead of indirect */
1315
+ if (! stm32_xspi_is_memorymap ( dev )) {
1316
+ ret = stm32_xspi_set_memorymap (dev );
1313
1317
if (ret != 0 ) {
1314
- LOG_ERR ("Failed to abort memory-mapped access before write " );
1318
+ LOG_ERR ("WRITE: failed to set memory mapped " );
1315
1319
goto write_end ;
1316
1320
}
1317
1321
}
1318
- #endif
1322
+ __ASSERT_NO_MSG (stm32_xspi_is_memorymap (dev ));
1323
+
1324
+ uintptr_t mmap_addr = STM32_XSPI_BASE_ADDRESS + addr ;
1325
+
1326
+ LOG_INF ("Memory-mapped write from 0x%08lx, len %zu" , mmap_addr , size );
1327
+ memcpy ((void * )mmap_addr , data , size );
1328
+
1329
+ /*
1330
+ * In memory-mapped mode, not possible to check if the memory is ready
1331
+ * after the programming. So a delay corresponding to max page programming
1332
+ * time is added
1333
+ */
1334
+ k_busy_wait (HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
1335
+
1336
+ /*
1337
+ * After a memory mapped write do a dummy read
1338
+ * then a synchroniztion barrier and an abort (RefMan)
1339
+ */
1340
+ uint8_t dummy_read [1 ];
1341
+
1342
+ memcpy (dummy_read , (void * )mmap_addr , 1 );
1343
+ __DSB ();
1344
+ ret = stm32_xspi_abort (dev );
1345
+
1346
+ goto write_end ;
1347
+ #else /* CONFIG_STM32_MEMMAP */
1319
1348
/* page program for STR or DTR mode */
1320
1349
XSPI_RegularCmdTypeDef cmd_pp = xspi_prepare_cmd (dev_cfg -> data_mode , dev_cfg -> data_rate );
1321
1350
@@ -1408,7 +1437,7 @@ static int flash_stm32_xspi_write(const struct device *dev, off_t addr,
1408
1437
break ;
1409
1438
}
1410
1439
}
1411
- /* Ends the write operation */
1440
+ #endif /* CONFIG_STM32_MEMMAP */
1412
1441
1413
1442
write_end :
1414
1443
xspi_unlock_thread (dev );
0 commit comments