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