@@ -839,7 +839,7 @@ static int stm32_xspi_mem_reset(const struct device *dev)
839
839
}
840
840
841
841
#ifdef CONFIG_STM32_MEMMAP
842
- /* Function to configure the octoflash in MemoryMapped mode */
842
+ /* Function to configure the octoflash in MemoryMapped mode for writing and reading */
843
843
static int stm32_xspi_set_memorymap (const struct device * dev )
844
844
{
845
845
HAL_StatusTypeDef ret ;
@@ -855,9 +855,26 @@ static int stm32_xspi_set_memorymap(const struct device *dev)
855
855
LOG_ERR ("XSPI_SPI_MODE in 3Bytes addressing is not supported" );
856
856
return - EIO ;
857
857
}
858
+ /* Enable write operation */
859
+ ret = stm32_xspi_write_enable (dev ,
860
+ dev_cfg -> data_mode , dev_cfg -> data_rate );
861
+ if (ret != 0 ) {
862
+ LOG_ERR ("XSPI: write not enabled" );
863
+ return ret ;
864
+ }
858
865
859
- /* Initialize the read command */
860
- s_command .OperationType = HAL_XSPI_OPTYPE_READ_CFG ;
866
+ /* Initialize the program command */
867
+ s_command .OperationType = HAL_XSPI_OPTYPE_WRITE_CFG ;
868
+ if (dev_cfg -> data_rate == XSPI_STR_TRANSFER ) {
869
+ s_command .Instruction = (dev_cfg -> data_mode == XSPI_SPI_MODE )
870
+ ? ((stm32_xspi_hal_address_size (dev ) ==
871
+ HAL_XSPI_ADDRESS_24_BITS )
872
+ ? SPI_NOR_CMD_PP
873
+ : SPI_NOR_CMD_PP_4B )
874
+ : SPI_NOR_OCMD_PAGE_PRG ;
875
+ } else {
876
+ s_command .Instruction = SPI_NOR_OCMD_PAGE_PRG ;
877
+ }
861
878
s_command .InstructionMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
862
879
? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
863
880
? HAL_XSPI_INSTRUCTION_1_LINE
@@ -871,14 +888,6 @@ static int stm32_xspi_set_memorymap(const struct device *dev)
871
888
? HAL_XSPI_INSTRUCTION_8_BITS
872
889
: HAL_XSPI_INSTRUCTION_16_BITS )
873
890
: HAL_XSPI_INSTRUCTION_16_BITS ;
874
- s_command .Instruction = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
875
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
876
- ? ((stm32_xspi_hal_address_size (dev ) ==
877
- HAL_XSPI_ADDRESS_24_BITS )
878
- ? SPI_NOR_CMD_READ_FAST
879
- : SPI_NOR_CMD_READ_FAST_4B )
880
- : dev_data -> read_opcode )
881
- : SPI_NOR_OCMD_DTR_RD ;
882
891
s_command .AddressMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
883
892
? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
884
893
? HAL_XSPI_ADDRESS_1_LINE
@@ -898,11 +907,6 @@ static int stm32_xspi_set_memorymap(const struct device *dev)
898
907
s_command .DataDTRMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
899
908
? HAL_XSPI_DATA_DTR_DISABLE
900
909
: HAL_XSPI_DATA_DTR_ENABLE ;
901
- s_command .DummyCycles = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
902
- ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
903
- ? SPI_NOR_DUMMY_RD
904
- : SPI_NOR_DUMMY_RD_OCTAL )
905
- : SPI_NOR_DUMMY_RD_OCTAL_DTR ;
906
910
s_command .DQSMode = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
907
911
? HAL_XSPI_DQS_DISABLE
908
912
: HAL_XSPI_DQS_ENABLE ;
@@ -912,40 +916,44 @@ static int stm32_xspi_set_memorymap(const struct device *dev)
912
916
913
917
ret = HAL_XSPI_Command (& dev_data -> hxspi , & s_command , HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
914
918
if (ret != HAL_OK ) {
915
- LOG_ERR ("%d: Failed to set memory map" , ret );
919
+ LOG_ERR ("%d: Failed to set memory map wr " , ret );
916
920
return - EIO ;
917
921
}
918
922
919
- /* Initialize the program command */
920
- s_command .OperationType = HAL_XSPI_OPTYPE_WRITE_CFG ;
921
- if (dev_cfg -> data_rate == XSPI_STR_TRANSFER ) {
922
- s_command . Instruction = (dev_cfg -> data_mode == XSPI_SPI_MODE )
923
+ /* Initialize the read command */
924
+ s_command .OperationType = HAL_XSPI_OPTYPE_READ_CFG ;
925
+ s_command . Instruction = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
926
+ ? ( (dev_cfg -> data_mode == XSPI_SPI_MODE )
923
927
? ((stm32_xspi_hal_address_size (dev ) ==
924
928
HAL_XSPI_ADDRESS_24_BITS )
925
- ? SPI_NOR_CMD_PP
926
- : SPI_NOR_CMD_PP_4B )
927
- : SPI_NOR_OCMD_PAGE_PRG ;
928
- } else {
929
- s_command .Instruction = SPI_NOR_OCMD_PAGE_PRG ;
930
- }
929
+ ? SPI_NOR_CMD_READ_FAST
930
+ : SPI_NOR_CMD_READ_FAST_4B )
931
+ : dev_data -> read_opcode )
932
+ : SPI_NOR_OCMD_DTR_RD ;
933
+ s_command .DummyCycles = (dev_cfg -> data_rate == XSPI_STR_TRANSFER )
934
+ ? ((dev_cfg -> data_mode == XSPI_SPI_MODE )
935
+ ? SPI_NOR_DUMMY_RD
936
+ : SPI_NOR_DUMMY_RD_OCTAL )
937
+ : SPI_NOR_DUMMY_RD_OCTAL_DTR ;
931
938
s_command .DQSMode = HAL_XSPI_DQS_DISABLE ;
932
939
933
940
ret = HAL_XSPI_Command (& dev_data -> hxspi , & s_command , HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
934
941
if (ret != HAL_OK ) {
935
- LOG_ERR ("%d: Failed to set memory mapped " , ret );
942
+ LOG_ERR ("%d: Failed to set memory map rd " , ret );
936
943
return - EIO ;
937
944
}
938
945
939
946
/* Enable the memory-mapping */
940
- s_MemMappedCfg .TimeOutActivation = HAL_XSPI_TIMEOUT_COUNTER_DISABLE ;
941
-
947
+ s_MemMappedCfg .TimeOutActivation = HAL_XSPI_TIMEOUT_COUNTER_ENABLE ;
948
+ s_MemMappedCfg . TimeoutPeriodClock = 0x50 ;
942
949
ret = HAL_XSPI_MemoryMapped (& dev_data -> hxspi , & s_MemMappedCfg );
943
950
if (ret != HAL_OK ) {
944
- LOG_ERR ("%d: Failed to enable memory mapped " , ret );
951
+ LOG_ERR ("%d: Failed to set memory map " , ret );
945
952
return - EIO ;
946
953
}
947
954
948
- LOG_DBG ("MemoryMap mode enabled" );
955
+ LOG_INF ("MemoryMap mode enabled" );
956
+
949
957
return 0 ;
950
958
}
951
959
@@ -1187,7 +1195,7 @@ static int flash_stm32_xspi_read(const struct device *dev, off_t addr,
1187
1195
1188
1196
uintptr_t mmap_addr = STM32_XSPI_BASE_ADDRESS + addr ;
1189
1197
1190
- LOG_DBG ("Memory-mapped read from 0x%08lx, len %zu" , mmap_addr , size );
1198
+ LOG_INF ("Memory-mapped read from 0x%08lx, len %zu" , mmap_addr , size );
1191
1199
memcpy (data , (void * )mmap_addr , size );
1192
1200
ret = 0 ;
1193
1201
goto read_end ;
@@ -1290,15 +1298,31 @@ static int flash_stm32_xspi_write(const struct device *dev, off_t addr,
1290
1298
#ifdef CONFIG_STM32_MEMMAP
1291
1299
ARG_UNUSED (dev_data );
1292
1300
1293
- if ( stm32_xspi_is_memorymap ( dev )) {
1294
- /* Abort ongoing transfer to force CS high/BUSY deasserted */
1295
- ret = stm32_xspi_abort (dev );
1301
+ /* Do writes through memory-mapping instead of indirect */
1302
+ if (! stm32_xspi_is_memorymap ( dev )) {
1303
+ ret = stm32_xspi_set_memorymap (dev );
1296
1304
if (ret != 0 ) {
1297
- LOG_ERR ("Failed to abort memory-mapped access before write " );
1305
+ LOG_ERR ("WRITE: failed to set memory mapped " );
1298
1306
goto write_end ;
1299
1307
}
1300
1308
}
1301
- #endif
1309
+ __ASSERT_NO_MSG (stm32_xspi_is_memorymap (dev ));
1310
+
1311
+ uintptr_t mmap_addr = STM32_XSPI_BASE_ADDRESS + addr ;
1312
+
1313
+ LOG_INF ("Memory-mapped write from 0x%08lx, len %zu" , mmap_addr , size );
1314
+ memcpy ((void * )mmap_addr , data , size );
1315
+ ret = 0 ;
1316
+
1317
+ /*
1318
+ * In memory-mapped mode, not possible to check if the memory is ready
1319
+ * after the programming. So a delay corresponding to max page programming
1320
+ * time is added */
1321
+ k_busy_wait (HAL_XSPI_TIMEOUT_DEFAULT_VALUE );
1322
+ goto write_end ;
1323
+
1324
+ #endif /* CONFIG_STM32_MEMMAP */
1325
+
1302
1326
/* page program for STR or DTR mode */
1303
1327
XSPI_RegularCmdTypeDef cmd_pp = xspi_prepare_cmd (dev_cfg -> data_mode , dev_cfg -> data_rate );
1304
1328
0 commit comments