STM32L4R9I_EVAL BSP User Manual: stm32l4r9i_eval_ospi_nor.c Source File

STM32L4R9I_EVAL BSP

stm32l4r9i_eval_ospi_nor.c
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32l4r9i_eval_ospi_nor.c
00004   * @author  MCD Application Team
00005   * @brief   This file includes a standard driver for the MX25UM51245G OSPI
00006   *          memory mounted on STM32L4R9I-EVAL board.
00007   @verbatim
00008   ==============================================================================
00009                      ##### How to use this driver #####
00010   ==============================================================================
00011   [..]
00012    (#) This driver is used to drive the MX25UM51245G OSPI external
00013        memory mounted on STM32L4R9I-EVAL evaluation board.
00014 
00015    (#) This driver need a specific component driver (MX25UM51245G) to be included with.
00016 
00017    (#) Initialization steps:
00018        (++) Initialize the OPSI external memory using the BSP_OSPI_NOR_Init() function. This
00019             function includes the MSP layer hardware resources initialization and the
00020             OSPI interface with the external memory.
00021 
00022    (#) OSPI memory operations
00023        (++) OSPI memory can be accessed with read/write operations once it is
00024             initialized.
00025             Read/write operation can be performed with AHB access using the functions
00026             BSP_OSPI_NOR_Read()/BSP_OSPI_NOR_Write().
00027        (++) The function BSP_OSPI_NOR_GetInfo() returns the configuration of the OSPI memory.
00028             (see the OSPI memory data sheet)
00029        (++) Perform erase block operation using the function BSP_OSPI_NOR_Erase_Block() and by
00030             specifying the block address. You can perform an erase operation of the whole
00031             chip by calling the function BSP_OSPI_NOR_Erase_Chip().
00032        (++) The function BSP_OSPI_NOR_GetStatus() returns the current status of the OSPI memory.
00033             (see the OSPI memory data sheet)
00034   @endverbatim
00035   ******************************************************************************
00036   * @attention
00037   *
00038   * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
00039   *
00040   * Redistribution and use in source and binary forms, with or without modification,
00041   * are permitted provided that the following conditions are met:
00042   *   1. Redistributions of source code must retain the above copyright notice,
00043   *      this list of conditions and the following disclaimer.
00044   *   2. Redistributions in binary form must reproduce the above copyright notice,
00045   *      this list of conditions and the following disclaimer in the documentation
00046   *      and/or other materials provided with the distribution.
00047   *   3. Neither the name of STMicroelectronics nor the names of its contributors
00048   *      may be used to endorse or promote products derived from this software
00049   *      without specific prior written permission.
00050   *
00051   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00052   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00053   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00054   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00055   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00056   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00057   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00058   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00059   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00060   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00061   *
00062   ******************************************************************************
00063   */
00064 
00065 /* Includes ------------------------------------------------------------------*/
00066 #include "stm32l4r9i_eval_ospi_nor.h"
00067 
00068 /** @addtogroup BSP
00069   * @{
00070   */
00071 
00072 /** @addtogroup STM32L4R9I_EVAL
00073   * @{
00074   */
00075 
00076 /** @defgroup STM32L4R9I_EVAL_OSPI_NOR STM32L4R9I_EVAL OSPI NOR
00077   * @{
00078   */
00079 
00080 /* Private constants --------------------------------------------------------*/
00081 /** @defgroup STM32L4R9I_EVAL_OSPI_NOR_Private_Constants Private Constants
00082   * @{
00083   */
00084 #define OSPI_NOR_OCTAL_DISABLE      0x0
00085 #define OSPI_NOR_OCTAL_ENABLE       0x1
00086 
00087 #define DUMMY_CYCLES_READ_OCTAL     MX25LM51245G_DUMMY_CYCLES_READ_OCTAL_66M
00088 #define DUMMY_CYCLES_CR_CFG         MX25LM51245G_CR2_DC_66M
00089 /**
00090   * @}
00091   */
00092 
00093 /* Uncomment this line to use the memory in SDR mode */
00094 //#define BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00095 
00096 /* Private variables ---------------------------------------------------------*/
00097 
00098 /** @defgroup STM32L4R9I_EVAL_OSPI_NOR_Private_Variables Private Variables
00099   * @{
00100   */
00101 OSPI_HandleTypeDef OSPINORHandle;
00102 
00103 /**
00104   * @}
00105   */
00106 
00107 
00108 /* Private functions ---------------------------------------------------------*/
00109 
00110 /** @defgroup STM32L4R9I_EVAL_OSPI_NOR_Private_Functions Private Functions
00111   * @{
00112   */
00113 static void    OSPI_NOR_MspInit            (void);
00114 static void    OSPI_NOR_MspDeInit          (void);
00115 static uint8_t OSPI_NOR_ResetMemory        (OSPI_HandleTypeDef *hospi);
00116 static uint8_t OSPI_NOR_WriteEnable        (OSPI_HandleTypeDef *hospi);
00117 static uint8_t OSPI_NOR_AutoPollingMemReady(OSPI_HandleTypeDef *hospi, uint32_t Timeout);
00118 static uint8_t OSPI_NOR_OctalMode          (OSPI_HandleTypeDef *hospi, uint8_t Operation);
00119 /**
00120   * @}
00121   */
00122 
00123 /* Exported functions ---------------------------------------------------------*/
00124 
00125 /** @addtogroup STM32L4R9I_EVAL_OSPI_NOR_Exported_Functions
00126   * @{
00127   */
00128 
00129 /**
00130   * @brief  Initializes the OSPI interface.
00131   * @retval OSPI memory status
00132   */
00133 uint8_t BSP_OSPI_NOR_Init(void)
00134 {
00135   OSPINORHandle.Instance = OCTOSPI1;
00136 
00137   /* Call the DeInit function to reset the driver */
00138   if (HAL_OSPI_DeInit(&OSPINORHandle) != HAL_OK)
00139   {
00140     return OSPI_NOR_ERROR;
00141   }
00142 
00143   /* System level initialization */
00144   OSPI_NOR_MspInit();
00145 
00146   /* OctoSPI initialization */
00147   OSPINORHandle.Init.FifoThreshold         = 4;
00148   OSPINORHandle.Init.DualQuad              = HAL_OSPI_DUALQUAD_DISABLE;
00149   OSPINORHandle.Init.DeviceSize            = POSITION_VAL(MX25LM51245G_FLASH_SIZE); /* 512 MBits */
00150   OSPINORHandle.Init.ChipSelectHighTime    = 2;
00151   OSPINORHandle.Init.FreeRunningClock      = HAL_OSPI_FREERUNCLK_DISABLE;
00152   OSPINORHandle.Init.ClockMode             = HAL_OSPI_CLOCK_MODE_0;
00153   OSPINORHandle.Init.WrapSize              = HAL_OSPI_WRAP_NOT_SUPPORTED;
00154   OSPINORHandle.Init.ClockPrescaler        = 2; /* OctoSPI clock = 110MHz / ClockPrescaler = 55MHz */
00155   OSPINORHandle.Init.SampleShifting        = HAL_OSPI_SAMPLE_SHIFTING_NONE;
00156 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00157   OSPINORHandle.Init.MemoryType            = HAL_OSPI_MEMTYPE_MICRON;
00158   OSPINORHandle.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_DISABLE;
00159 #else
00160   OSPINORHandle.Init.MemoryType            = HAL_OSPI_MEMTYPE_MACRONIX;
00161   OSPINORHandle.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_ENABLE;
00162 #endif
00163   OSPINORHandle.Init.ChipSelectBoundary    = 0;
00164 
00165   if (HAL_OSPI_Init(&OSPINORHandle) != HAL_OK)
00166   {
00167     return OSPI_NOR_ERROR;
00168   }
00169 
00170   /* OctoSPI memory reset */
00171   if (OSPI_NOR_ResetMemory(&OSPINORHandle) != OSPI_NOR_OK)
00172   {
00173     return OSPI_NOR_NOT_SUPPORTED;
00174   }
00175 
00176   /* OctoSPI octal enable */
00177   if (OSPI_NOR_OctalMode(&OSPINORHandle, OSPI_NOR_OCTAL_ENABLE) != OSPI_NOR_OK)
00178   {
00179     return OSPI_NOR_ERROR;
00180   }
00181 
00182   return OSPI_NOR_OK;
00183 }
00184 
00185 /**
00186   * @brief  De-Initializes the OSPI interface.
00187   * @retval OSPI memory status
00188   */
00189 uint8_t BSP_OSPI_NOR_DeInit(void)
00190 {
00191   OSPINORHandle.Instance = OCTOSPI1;
00192 
00193   /* Abort any activity on OctoSPI (eg Memory-mapped mode) */
00194   if (HAL_OSPI_GetState(&OSPINORHandle) != HAL_OSPI_STATE_READY)
00195   {
00196     if (HAL_OSPI_Abort(&OSPINORHandle) != HAL_OK)
00197     {
00198       return OSPI_NOR_ERROR;
00199     }
00200   }
00201 
00202   /* OctoSPI octal mode disable */
00203   if (OSPI_NOR_OctalMode(&OSPINORHandle, OSPI_NOR_OCTAL_DISABLE) != OSPI_NOR_OK)
00204   {
00205     return OSPI_NOR_ERROR;
00206   }
00207 
00208   /* Call the DeInit function to reset the driver */
00209   if (HAL_OSPI_DeInit(&OSPINORHandle) != HAL_OK)
00210   {
00211     return OSPI_NOR_ERROR;
00212   }
00213 
00214   /* System level De-initialization */
00215   OSPI_NOR_MspDeInit();
00216 
00217   return OSPI_NOR_OK;
00218 }
00219 
00220 /**
00221   * @brief  Reads an amount of data from the OSPI memory.
00222   * @param  pData: Pointer to data to be read
00223   * @param  ReadAddr: Read start address
00224   * @param  Size: Size of data to read
00225   * @retval OSPI memory status
00226   */
00227 uint8_t BSP_OSPI_NOR_Read(uint8_t* pData, uint32_t ReadAddr, uint32_t Size)
00228 {
00229   OSPI_RegularCmdTypeDef sCommand;
00230 
00231   /* Initialize the read command */
00232   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00233   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00234   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00235   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00236   sCommand.Address               = ReadAddr;
00237   sCommand.AddressMode           = HAL_OSPI_ADDRESS_8_LINES;
00238   sCommand.AddressSize           = HAL_OSPI_ADDRESS_32_BITS;
00239   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00240   sCommand.DataMode              = HAL_OSPI_DATA_8_LINES;
00241   sCommand.NbData                = Size;
00242   sCommand.DummyCycles           = DUMMY_CYCLES_READ_OCTAL;
00243   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00244 
00245 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00246   sCommand.Instruction           = OCTAL_IO_READ_CMD;
00247   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00248   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_DISABLE;
00249   sCommand.DataDtrMode           = HAL_OSPI_DATA_DTR_DISABLE;
00250   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00251 #else
00252   sCommand.Instruction           = OCTAL_IO_DTR_READ_CMD;
00253   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00254   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_ENABLE;
00255   sCommand.DataDtrMode           = HAL_OSPI_DATA_DTR_ENABLE;
00256   sCommand.DQSMode               = HAL_OSPI_DQS_ENABLE;
00257 #endif
00258 
00259   /* Configure the command */
00260   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00261   {
00262     return OSPI_NOR_ERROR;
00263   }
00264 
00265   /* Reception of the data */
00266   if (HAL_OSPI_Receive(&OSPINORHandle, pData, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00267   {
00268     return OSPI_NOR_ERROR;
00269   }
00270 
00271   return OSPI_NOR_OK;
00272 }
00273 
00274 /**
00275   * @brief  Writes an amount of data to the OSPI memory.
00276   * @param  pData: Pointer to data to be written
00277   * @param  WriteAddr: Write start address
00278   * @param  Size: Size of data to write
00279   * @retval OSPI memory status
00280   */
00281 uint8_t BSP_OSPI_NOR_Write(uint8_t* pData, uint32_t WriteAddr, uint32_t Size)
00282 {
00283   OSPI_RegularCmdTypeDef sCommand;
00284   uint32_t end_addr, current_size, current_addr;
00285 
00286   /* Calculation of the size between the write address and the end of the page */
00287   current_size = MX25LM51245G_PAGE_SIZE - (WriteAddr % MX25LM51245G_PAGE_SIZE);
00288 
00289   /* Check if the size of the data is less than the remaining place in the page */
00290   if (current_size > Size)
00291   {
00292     current_size = Size;
00293   }
00294 
00295   /* Initialize the adress variables */
00296   current_addr = WriteAddr;
00297   end_addr = WriteAddr + Size;
00298 
00299   /* Initialize the program command */
00300   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00301   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00302   sCommand.Instruction           = OCTAL_PAGE_PROG_CMD;
00303   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00304   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00305   sCommand.AddressMode           = HAL_OSPI_ADDRESS_8_LINES;
00306   sCommand.AddressSize           = HAL_OSPI_ADDRESS_32_BITS;
00307   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00308   sCommand.DataMode              = HAL_OSPI_DATA_8_LINES;
00309   sCommand.DummyCycles           = 0;
00310   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00311 
00312 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00313   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00314   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_DISABLE;
00315   sCommand.DataDtrMode           = HAL_OSPI_DATA_DTR_DISABLE;
00316   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00317 #else
00318   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00319   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_ENABLE;
00320   sCommand.DataDtrMode           = HAL_OSPI_DATA_DTR_ENABLE;
00321   sCommand.DQSMode               = HAL_OSPI_DQS_ENABLE;
00322 #endif
00323 
00324   /* Perform the write page by page */
00325   do
00326   {
00327     sCommand.Address = current_addr;
00328     sCommand.NbData  = current_size;
00329 
00330     /* Enable write operations */
00331     if (OSPI_NOR_WriteEnable(&OSPINORHandle) != OSPI_NOR_OK)
00332     {
00333       return OSPI_NOR_ERROR;
00334     }
00335 
00336     /* Configure the command */
00337     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00338     {
00339       return OSPI_NOR_ERROR;
00340     }
00341 
00342     /* Transmission of the data */
00343     if (HAL_OSPI_Transmit(&OSPINORHandle, pData, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00344     {
00345       return OSPI_NOR_ERROR;
00346     }
00347 
00348     /* Configure automatic polling mode to wait for end of program */
00349     if (OSPI_NOR_AutoPollingMemReady(&OSPINORHandle, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != OSPI_NOR_OK)
00350     {
00351       return OSPI_NOR_ERROR;
00352     }
00353 
00354     /* Update the address and size variables for next page programming */
00355     current_addr += current_size;
00356     pData += current_size;
00357     current_size = ((current_addr + MX25LM51245G_PAGE_SIZE) > end_addr) ? (end_addr - current_addr) : MX25LM51245G_PAGE_SIZE;
00358   } while (current_addr < end_addr);
00359 
00360   return OSPI_NOR_OK;
00361 }
00362 
00363 /**
00364   * @brief  Erases the specified block of the OSPI memory.
00365   * @param  BlockAddress: Block address to erase
00366   * @retval OSPI memory status
00367   */
00368 uint8_t BSP_OSPI_NOR_Erase_Block(uint32_t BlockAddress)
00369 {
00370   OSPI_RegularCmdTypeDef sCommand;
00371 
00372   /* Initialize the erase command */
00373   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00374   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00375   sCommand.Instruction           = OCTAL_BLOCK_ERASE_CMD;
00376   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00377   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00378   sCommand.Address               = BlockAddress;
00379   sCommand.AddressMode           = HAL_OSPI_ADDRESS_8_LINES;
00380   sCommand.AddressSize           = HAL_OSPI_ADDRESS_32_BITS;
00381   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00382   sCommand.DataMode              = HAL_OSPI_DATA_NONE;
00383   sCommand.DummyCycles           = 0;
00384   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00385   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00386 
00387 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00388   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00389   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_DISABLE;
00390 #else
00391   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00392   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_ENABLE;
00393 #endif
00394 
00395   /* Enable write operations */
00396   if (OSPI_NOR_WriteEnable(&OSPINORHandle) != OSPI_NOR_OK)
00397   {
00398     return OSPI_NOR_ERROR;
00399   }
00400 
00401   /* Send the command */
00402   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00403   {
00404     return OSPI_NOR_ERROR;
00405   }
00406 
00407   /* Configure automatic polling mode to wait for end of erase */
00408   if (OSPI_NOR_AutoPollingMemReady(&OSPINORHandle, MX25LM51245G_BLOCK_ERASE_MAX_TIME) != OSPI_NOR_OK)
00409   {
00410     return OSPI_NOR_ERROR;
00411   }
00412 
00413   return OSPI_NOR_OK;
00414 }
00415 
00416 /**
00417   * @brief  Erases the specified sector of the OSPI memory.
00418   * @param  Sector: Sector address to erase (0 to 255)
00419   * @retval OSPI memory status
00420   * @note This function is non blocking meaning that sector erase
00421   *       operation is started but not completed when the function
00422   *       returns. Application has to call BSP_QSPI_GetStatus()
00423   *       to know when the device is available again (i.e. erase operation
00424   *       completed).
00425   */
00426 uint8_t BSP_OSPI_NOR_Erase_Sector(uint32_t Sector)
00427 {
00428   OSPI_RegularCmdTypeDef sCommand;
00429 
00430   if (Sector >= (uint32_t)(MX25LM51245G_FLASH_SIZE/MX25LM51245G_SECTOR_SIZE))
00431   {
00432     return OSPI_NOR_ERROR;
00433   }
00434 
00435   /* Initialize the erase command */
00436   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00437   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00438   sCommand.Instruction           = OCTAL_SECTOR_ERASE_CMD;
00439   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00440   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00441   sCommand.Address               = (Sector * MX25LM51245G_SECTOR_SIZE);
00442   sCommand.AddressMode           = HAL_OSPI_ADDRESS_8_LINES;
00443   sCommand.AddressSize           = HAL_OSPI_ADDRESS_32_BITS;
00444   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00445   sCommand.DataMode              = HAL_OSPI_DATA_NONE;
00446   sCommand.DummyCycles           = 0;
00447   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00448   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00449 
00450 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00451   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00452   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_DISABLE;
00453 #else
00454   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00455   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_ENABLE;
00456 #endif
00457 
00458   /* Enable write operations */
00459   if (OSPI_NOR_WriteEnable(&OSPINORHandle) != OSPI_NOR_OK)
00460   {
00461     return OSPI_NOR_ERROR;
00462   }
00463 
00464   /* Send the command */
00465   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00466   {
00467     return OSPI_NOR_ERROR;
00468   }
00469 
00470   return OSPI_NOR_OK;
00471 }
00472 
00473 /**
00474   * @brief  Erases the entire OSPI memory.
00475   * @retval OSPI memory status
00476   */
00477 uint8_t BSP_OSPI_NOR_Erase_Chip(void)
00478 {
00479   OSPI_RegularCmdTypeDef sCommand;
00480 
00481   /* Initialize the erase command */
00482   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00483   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00484   sCommand.Instruction           = OCTAL_CHIP_ERASE_CMD;
00485   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00486   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00487   sCommand.AddressMode           = HAL_OSPI_ADDRESS_NONE;
00488   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00489   sCommand.DataMode              = HAL_OSPI_DATA_NONE;
00490   sCommand.DummyCycles           = 0;
00491   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00492   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00493 
00494 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00495   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00496 #else
00497   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00498 #endif
00499 
00500   /* Enable write operations */
00501   if (OSPI_NOR_WriteEnable(&OSPINORHandle) != OSPI_NOR_OK)
00502   {
00503     return OSPI_NOR_ERROR;
00504   }
00505 
00506   /* Send the command */
00507   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00508   {
00509     return OSPI_NOR_ERROR;
00510   }
00511 
00512   /* Configure automatic polling mode to wait for end of erase */
00513   if (OSPI_NOR_AutoPollingMemReady(&OSPINORHandle, MX25LM51245G_CHIP_ERASE_MAX_TIME) != OSPI_NOR_OK)
00514   {
00515     return OSPI_NOR_ERROR;
00516   }
00517 
00518   return OSPI_NOR_OK;
00519 }
00520 
00521 /**
00522   * @brief  Reads current status of the OSPI memory.
00523   * @retval OSPI memory status
00524   */
00525 uint8_t BSP_OSPI_NOR_GetStatus(void)
00526 {
00527   OSPI_RegularCmdTypeDef sCommand;
00528   uint8_t reg[2];
00529 
00530   /* Initialize the read security register command */
00531   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00532   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00533   sCommand.Instruction           = OCTAL_READ_SECURITY_REG_CMD;
00534   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00535   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00536   sCommand.Address               = 0;
00537   sCommand.AddressMode           = HAL_OSPI_ADDRESS_8_LINES;
00538   sCommand.AddressSize           = HAL_OSPI_ADDRESS_32_BITS;
00539   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00540   sCommand.DataMode              = HAL_OSPI_DATA_8_LINES;
00541   sCommand.NbData                = 2;
00542   sCommand.DummyCycles           = DUMMY_CYCLES_READ_OCTAL;
00543   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00544 
00545 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00546   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00547   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_DISABLE;
00548   sCommand.DataDtrMode           = HAL_OSPI_DATA_DTR_DISABLE;
00549   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00550 #else
00551   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00552   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_ENABLE;
00553   sCommand.DataDtrMode           = HAL_OSPI_DATA_DTR_ENABLE;
00554   sCommand.DQSMode               = HAL_OSPI_DQS_ENABLE;
00555 #endif
00556 
00557   /* Configure the command */
00558   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00559   {
00560     return OSPI_NOR_ERROR;
00561   }
00562 
00563   /* Reception of the data */
00564   if (HAL_OSPI_Receive(&OSPINORHandle, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00565   {
00566     return OSPI_NOR_ERROR;
00567   }
00568 
00569   /* Check the value of the register */
00570   if ((reg[0] & (MX25LM51245G_SECR_P_FAIL | MX25LM51245G_SECR_E_FAIL)) != 0)
00571   {
00572     return OSPI_NOR_ERROR;
00573   }
00574   else if ((reg[0] & (MX25LM51245G_SECR_PSB | MX25LM51245G_SECR_ESB)) != 0)
00575   {
00576     return OSPI_NOR_SUSPENDED;
00577   }
00578 
00579   /* Initialize the read status register command */
00580   sCommand.Instruction = OCTAL_READ_STATUS_REG_CMD;
00581 
00582   /* Configure the command */
00583   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00584   {
00585     return OSPI_NOR_ERROR;
00586   }
00587 
00588   /* Reception of the data */
00589   if (HAL_OSPI_Receive(&OSPINORHandle, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00590   {
00591     return OSPI_NOR_ERROR;
00592   }
00593 
00594   /* Check the value of the register */
00595   if ((reg[0] & MX25LM51245G_SR_WIP) != 0)
00596   {
00597     return OSPI_NOR_BUSY;
00598   }
00599   else
00600   {
00601     return OSPI_NOR_OK;
00602   }
00603 }
00604 
00605 /**
00606   * @brief  Return the configuration of the OSPI memory.
00607   * @param  pInfo: pointer on the configuration structure
00608   * @retval OSPI memory status
00609   */
00610 uint8_t BSP_OSPI_NOR_GetInfo(OSPI_NOR_Info* pInfo)
00611 {
00612   /* Configure the structure with the memory configuration */
00613   pInfo->FlashSize          = MX25LM51245G_FLASH_SIZE;
00614   pInfo->EraseSectorSize    = MX25LM51245G_BLOCK_SIZE;
00615   pInfo->EraseSectorsNumber = (MX25LM51245G_FLASH_SIZE/MX25LM51245G_BLOCK_SIZE);
00616   pInfo->ProgPageSize       = MX25LM51245G_PAGE_SIZE;
00617   pInfo->ProgPagesNumber    = (MX25LM51245G_FLASH_SIZE/MX25LM51245G_PAGE_SIZE);
00618 
00619   return OSPI_NOR_OK;
00620 }
00621 
00622 /**
00623   * @brief  Configure the OSPI in memory-mapped mode
00624   * @retval OSPI memory status
00625   */
00626 uint8_t BSP_OSPI_NOR_EnableMemoryMappedMode(void)
00627 {
00628   OSPI_RegularCmdTypeDef   sCommand;
00629   OSPI_MemoryMappedTypeDef sMemMappedCfg;
00630 
00631   /* Enable write operations */
00632   if (OSPI_NOR_WriteEnable(&OSPINORHandle) != OSPI_NOR_OK)
00633   {
00634     return OSPI_NOR_ERROR;
00635   }
00636 
00637   /* Configure the command for the read instruction */
00638   sCommand.OperationType         = HAL_OSPI_OPTYPE_READ_CFG;
00639   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00640   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00641   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00642   sCommand.AddressMode           = HAL_OSPI_ADDRESS_8_LINES;
00643   sCommand.AddressSize           = HAL_OSPI_ADDRESS_32_BITS;
00644   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00645   sCommand.DataMode              = HAL_OSPI_DATA_8_LINES;
00646   sCommand.DummyCycles           = DUMMY_CYCLES_READ_OCTAL;
00647   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00648 
00649 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00650   sCommand.Instruction           = OCTAL_IO_READ_CMD;
00651   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00652   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_DISABLE;
00653   sCommand.DataDtrMode           = HAL_OSPI_DATA_DTR_DISABLE;
00654   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00655 #else
00656   sCommand.Instruction           = OCTAL_IO_DTR_READ_CMD;
00657   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00658   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_ENABLE;
00659   sCommand.DataDtrMode           = HAL_OSPI_DATA_DTR_ENABLE;
00660   sCommand.DQSMode               = HAL_OSPI_DQS_ENABLE;
00661 #endif
00662 
00663   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00664   {
00665     return OSPI_NOR_ERROR;
00666   }
00667 
00668   /* Configure the command for the write instruction */
00669   sCommand.OperationType         = HAL_OSPI_OPTYPE_WRITE_CFG;
00670   sCommand.Instruction           = OCTAL_PAGE_PROG_CMD;
00671   sCommand.DummyCycles           = 0;
00672 
00673   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00674   {
00675     return OSPI_NOR_ERROR;
00676   }
00677 
00678    /* Configure the memory mapped mode */
00679   sMemMappedCfg.TimeOutActivation = HAL_OSPI_TIMEOUT_COUNTER_DISABLE;
00680 
00681   if (HAL_OSPI_MemoryMapped(&OSPINORHandle, &sMemMappedCfg) != HAL_OK)
00682   {
00683     return OSPI_NOR_ERROR;
00684   }
00685 
00686   return OSPI_NOR_OK;
00687 }
00688 
00689 /**
00690   * @brief  This function suspends an ongoing erase command.
00691   * @retval OSPI memory status
00692   */
00693 uint8_t BSP_OSPI_NOR_SuspendErase(void)
00694 {
00695   OSPI_RegularCmdTypeDef sCommand;
00696 
00697   /* Check whether the device is busy (erase operation is
00698   in progress).
00699   */
00700   if (BSP_OSPI_NOR_GetStatus() == OSPI_NOR_BUSY)
00701   {
00702     /* Initialize the suspend command */
00703     sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00704     sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00705     sCommand.Instruction           = OCTAL_PROG_ERASE_SUSPEND_CMD;
00706     sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00707     sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00708     sCommand.AddressMode           = HAL_OSPI_ADDRESS_NONE;
00709     sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00710     sCommand.DataMode              = HAL_OSPI_DATA_NONE;
00711     sCommand.DummyCycles           = 0;
00712     sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00713     sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00714 
00715 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00716     sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00717 #else
00718     sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00719 #endif
00720 
00721   /* Send the command */
00722     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00723     {
00724       return OSPI_NOR_ERROR;
00725     }
00726 
00727     if (BSP_OSPI_NOR_GetStatus() == OSPI_NOR_SUSPENDED)
00728     {
00729       return OSPI_NOR_OK;
00730     }
00731 
00732     return OSPI_NOR_ERROR;
00733   }
00734 
00735   return OSPI_NOR_OK;
00736 }
00737 
00738 /**
00739   * @brief  This function resumes a paused erase command.
00740   * @retval OSPI memory status
00741   */
00742 uint8_t BSP_OSPI_NOR_ResumeErase(void)
00743 {
00744   OSPI_RegularCmdTypeDef sCommand;
00745 
00746   /* Check whether the device is in suspended state */
00747   if (BSP_OSPI_NOR_GetStatus() == OSPI_NOR_SUSPENDED)
00748   {
00749     /* Initialize the resume command */
00750     sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00751     sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00752     sCommand.Instruction           = OCTAL_PROG_ERASE_RESUME_CMD;
00753     sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00754     sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00755     sCommand.AddressMode           = HAL_OSPI_ADDRESS_NONE;
00756     sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00757     sCommand.DataMode              = HAL_OSPI_DATA_NONE;
00758     sCommand.DummyCycles           = 0;
00759     sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00760     sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00761 
00762 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00763     sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00764 #else
00765     sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00766 #endif
00767 
00768     /* Send the command */
00769     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00770     {
00771       return OSPI_NOR_ERROR;
00772     }
00773 
00774     /*
00775     When this command is executed, the status register write in progress bit is set to 1, and
00776     the flag status register program erase controller bit is set to 0. This command is ignored
00777     if the device is not in a suspended state.
00778     */
00779 
00780     if (BSP_OSPI_NOR_GetStatus() == OSPI_NOR_BUSY)
00781     {
00782       return OSPI_NOR_OK;
00783     }
00784 
00785     return OSPI_NOR_ERROR;
00786   }
00787 
00788   return OSPI_NOR_OK;
00789 }
00790 
00791 /**
00792   * @brief  This function enter the OSPI memory in deep power down mode.
00793   * @retval OSPI memory status
00794   */
00795 uint8_t BSP_OSPI_NOR_EnterDeepPowerDown(void)
00796 {
00797   OSPI_RegularCmdTypeDef sCommand;
00798 
00799   /* Initialize the deep power down command */
00800   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00801   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00802   sCommand.Instruction           = OCTAL_ENTER_DEEP_POWER_DOWN_CMD;
00803   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00804   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00805   sCommand.AddressMode           = HAL_OSPI_ADDRESS_NONE;
00806   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00807   sCommand.DataMode              = HAL_OSPI_DATA_NONE;
00808   sCommand.DummyCycles           = 0;
00809   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00810   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00811 
00812 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00813   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00814 #else
00815   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00816 #endif
00817 
00818   /* Send the command */
00819   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00820   {
00821     return OSPI_NOR_ERROR;
00822   }
00823 
00824   /* ---          Memory takes 10us max to enter deep power down          --- */
00825 
00826   return OSPI_NOR_OK;
00827 }
00828 
00829 /**
00830   * @brief  This function leave the OSPI memory from deep power down mode.
00831   * @retval OSPI memory status
00832   */
00833 uint8_t BSP_OSPI_NOR_LeaveDeepPowerDown(void)
00834 {
00835   OSPI_RegularCmdTypeDef sCommand;
00836 
00837   /* Initialize the nop command */
00838   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00839   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00840   sCommand.Instruction           = OCTAL_NO_OPERATION_CMD;
00841   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
00842   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
00843   sCommand.AddressMode           = HAL_OSPI_ADDRESS_NONE;
00844   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00845   sCommand.DataMode              = HAL_OSPI_DATA_NONE;
00846   sCommand.DummyCycles           = 0;
00847   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00848   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00849 
00850 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
00851   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00852 #else
00853   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
00854 #endif
00855 
00856   /* Send the command */
00857   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
00858   {
00859     return OSPI_NOR_ERROR;
00860   }
00861 
00862   /* --- A NOP command is sent to the memory, as the nCS should be low for at least 20 ns --- */
00863   /* ---                  Memory takes 30us min to leave deep power down                  --- */
00864 
00865   return OSPI_NOR_OK;
00866 }
00867 /**
00868   * @}
00869   */
00870 
00871 /** @addtogroup STM32L4R9I_EVAL_OSPI_NOR_Private_Functions
00872   * @{
00873   */
00874 
00875 /**
00876   * @brief  Initializes the OSPI MSP.
00877   * @retval None
00878   */
00879 static void OSPI_NOR_MspInit(void)
00880 {
00881   GPIO_InitTypeDef GPIO_InitStruct;
00882 
00883   /* Enable the OctoSPI memory interface clock */
00884   __HAL_RCC_OSPIM_CLK_ENABLE();
00885   __HAL_RCC_OSPI1_CLK_ENABLE();
00886 
00887   /* Reset the OctoSPI memory interface */
00888   __HAL_RCC_OSPI1_FORCE_RESET();
00889   __HAL_RCC_OSPI1_RELEASE_RESET();
00890 
00891   /* Enable GPIO clocks */
00892   /* IOSV bit MUST be set to access GPIO port G[2:15] */
00893   __HAL_RCC_PWR_CLK_ENABLE();
00894   SET_BIT(PWR->CR2, PWR_CR2_IOSV);
00895 
00896   __HAL_RCC_GPIOA_CLK_ENABLE();
00897   __HAL_RCC_GPIOB_CLK_ENABLE();
00898   __HAL_RCC_GPIOC_CLK_ENABLE();
00899   __HAL_RCC_GPIOG_CLK_ENABLE();
00900   __HAL_RCC_GPIOH_CLK_ENABLE();
00901 
00902   /* OctoSPI CS GPIO pin configuration  */
00903   GPIO_InitStruct.Pin       = GPIO_PIN_2;
00904   GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
00905   GPIO_InitStruct.Pull      = GPIO_PULLUP;
00906   GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
00907   GPIO_InitStruct.Alternate = GPIO_AF10_OCTOSPIM_P1;
00908   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
00909 
00910   /* OctoSPI DQS GPIO pins configuration  */
00911   GPIO_InitStruct.Pin       = GPIO_PIN_2;
00912   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
00913 
00914   /* OctoSPI CLK, D2 and D3 GPIO pins configuration  */
00915   GPIO_InitStruct.Pin       = (GPIO_PIN_3 | GPIO_PIN_6 | GPIO_PIN_7);
00916   GPIO_InitStruct.Pull      = GPIO_NOPULL;
00917   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
00918 
00919   /* OctoSPI D0 and D1 GPIO pins configuration  */
00920   GPIO_InitStruct.Pin       = (GPIO_PIN_0 | GPIO_PIN_1);
00921   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
00922 
00923   /* OctoSPI D6 and D7 GPIO pins configuration  */
00924   GPIO_InitStruct.Pin       = (GPIO_PIN_3 | GPIO_PIN_4);
00925   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
00926 
00927   /* OctoSPI D5 GPIO pins configuration  */
00928   GPIO_InitStruct.Pin       = (GPIO_PIN_11);
00929   GPIO_InitStruct.Alternate = GPIO_AF3_OCTOSPIM_P1;
00930   HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
00931 
00932   /* OctoSPI D4 GPIO pins configuration  */
00933   GPIO_InitStruct.Pin       = (GPIO_PIN_2);
00934   HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
00935 }
00936 
00937 /**
00938   * @brief  De-Initializes the OSPI MSP.
00939   * @retval None
00940   */
00941 static void OSPI_NOR_MspDeInit(void)
00942 {
00943   GPIO_InitTypeDef GPIO_InitStruct;
00944 
00945   /* OctoSPI CLK, CS, D0-D7, DQS GPIO pins de-configuration  */
00946   HAL_GPIO_DeInit(GPIOA, (GPIO_PIN_6 | GPIO_PIN_7));
00947   HAL_GPIO_DeInit(GPIOB, (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2));
00948   HAL_GPIO_DeInit(GPIOC, (GPIO_PIN_3 | GPIO_PIN_4));
00949   HAL_GPIO_DeInit(GPIOG, GPIO_PIN_11);
00950   HAL_GPIO_DeInit(GPIOH, GPIO_PIN_2);
00951 
00952   /* Set GPIOA pin 2 in pull up mode (optimum default setting) */
00953   GPIO_InitStruct.Mode      = GPIO_MODE_INPUT;
00954   GPIO_InitStruct.Pin       = GPIO_PIN_2;
00955   GPIO_InitStruct.Pull      = GPIO_NOPULL;
00956   GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_LOW;
00957   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
00958 
00959   /* Set GPIOA pin 3 in no pull, low state (optimum default setting) */
00960   GPIO_InitStruct.Mode      = GPIO_MODE_OUTPUT_PP;
00961   GPIO_InitStruct.Pull      = GPIO_NOPULL;
00962   GPIO_InitStruct.Pin       = GPIO_PIN_3;
00963   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
00964   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
00965 
00966   /* Reset the OctoSPI memory interface */
00967   __HAL_RCC_OSPI1_FORCE_RESET();
00968   __HAL_RCC_OSPI1_RELEASE_RESET();
00969 
00970   /* Disable the OctoSPI memory interface clock */
00971   __HAL_RCC_OSPI1_CLK_DISABLE();
00972 }
00973 
00974 /**
00975   * @brief  This function reset the OSPI memory.
00976   * @param  hospi: OSPI handle
00977   * @retval None
00978   */
00979 static uint8_t OSPI_NOR_ResetMemory(OSPI_HandleTypeDef *hospi)
00980 {
00981   OSPI_RegularCmdTypeDef sCommand;
00982   OSPI_AutoPollingTypeDef sConfig;
00983 
00984   /* Initialize the reset enable command */
00985   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
00986   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
00987   sCommand.Instruction           = RESET_ENABLE_CMD;
00988   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_1_LINE;
00989   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_8_BITS;
00990   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
00991   sCommand.AddressMode           = HAL_OSPI_ADDRESS_NONE;
00992   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
00993   sCommand.DataMode              = HAL_OSPI_DATA_NONE;
00994   sCommand.DummyCycles           = 0;
00995   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
00996   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
00997 
00998   /* Send the command */
00999   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01000   {
01001     return OSPI_NOR_ERROR;
01002   }
01003 
01004   /* Send the reset memory command */
01005   sCommand.Instruction = RESET_MEMORY_CMD;
01006   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01007   {
01008     return OSPI_NOR_ERROR;
01009   }
01010 
01011   /* Configure automatic polling mode to wait the memory is ready */
01012   sCommand.Instruction  = READ_STATUS_REG_CMD;
01013   sCommand.DataMode     = HAL_OSPI_DATA_1_LINE;
01014   sCommand.NbData       = 1;
01015   sCommand.DataDtrMode  = HAL_OSPI_DATA_DTR_DISABLE;
01016 
01017   sConfig.Match         = 0;
01018   sConfig.Mask          = MX25LM51245G_SR_WIP;
01019   sConfig.MatchMode     = HAL_OSPI_MATCH_MODE_AND;
01020   sConfig.Interval      = 0x10;
01021   sConfig.AutomaticStop = HAL_OSPI_AUTOMATIC_STOP_ENABLE;
01022 
01023   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01024   {
01025     return OSPI_NOR_ERROR;
01026   }
01027 
01028   if (HAL_OSPI_AutoPolling(&OSPINORHandle, &sConfig, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01029   {
01030     return OSPI_NOR_ERROR;
01031   }
01032 
01033   return OSPI_NOR_OK;
01034 }
01035 
01036 /**
01037   * @brief  This function send a Write Enable and wait it is effective.
01038   * @param  hospi: OSPI handle
01039   * @retval None
01040   */
01041 static uint8_t OSPI_NOR_WriteEnable(OSPI_HandleTypeDef *hospi)
01042 {
01043   OSPI_RegularCmdTypeDef  sCommand;
01044   OSPI_AutoPollingTypeDef sConfig;
01045   uint8_t reg[2];
01046 
01047   /* Enable write operations */
01048   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
01049   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
01050   sCommand.Instruction           = OCTAL_WRITE_ENABLE_CMD;
01051   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
01052   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
01053   sCommand.AddressMode           = HAL_OSPI_ADDRESS_NONE;
01054   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
01055   sCommand.DataMode              = HAL_OSPI_DATA_NONE;
01056   sCommand.DummyCycles           = 0;
01057   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
01058   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
01059 
01060 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
01061   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
01062 #else
01063   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
01064 #endif
01065 
01066   if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01067   {
01068     return OSPI_NOR_ERROR;
01069   }
01070 
01071   /* Configure automatic polling mode to wait for write enabling */
01072   sConfig.Match           = MX25LM51245G_SR_WEL;
01073   sConfig.Mask            = MX25LM51245G_SR_WEL;
01074   sConfig.MatchMode       = HAL_OSPI_MATCH_MODE_AND;
01075   sConfig.Interval        = 0x10;
01076   sConfig.AutomaticStop   = HAL_OSPI_AUTOMATIC_STOP_ENABLE;
01077 
01078   sCommand.Instruction    = OCTAL_READ_STATUS_REG_CMD;
01079   sCommand.Address        = 0x0;
01080   sCommand.AddressMode    = HAL_OSPI_ADDRESS_8_LINES;
01081   sCommand.AddressSize    = HAL_OSPI_ADDRESS_32_BITS;
01082   sCommand.DataMode       = HAL_OSPI_DATA_8_LINES;
01083   sCommand.NbData         = 2;
01084 
01085 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
01086   sCommand.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_DISABLE;
01087   sCommand.DataDtrMode    = HAL_OSPI_DATA_DTR_DISABLE;
01088   sCommand.DQSMode        = HAL_OSPI_DQS_DISABLE;
01089   sCommand.DummyCycles    = DUMMY_CYCLES_READ_OCTAL;
01090 #else
01091   sCommand.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_ENABLE;
01092   sCommand.DataDtrMode    = HAL_OSPI_DATA_DTR_ENABLE;
01093   sCommand.DQSMode        = HAL_OSPI_DQS_ENABLE;
01094   sCommand.DummyCycles    = 4;
01095 #endif
01096 
01097   do
01098   {
01099     HAL_Delay(1); /* sConfig.Interval(0x10) / Clock(55 MHz) = 0.29 ms */
01100 
01101     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01102     {
01103       return OSPI_NOR_ERROR;
01104     }
01105 
01106     if (HAL_OSPI_Receive(&OSPINORHandle, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01107     {
01108       return OSPI_NOR_ERROR;
01109     }
01110   }while((reg[0] & sConfig.Mask ) != sConfig.Match);
01111 
01112   return OSPI_NOR_OK;
01113 }
01114 
01115 /**
01116   * @brief  This function read the SR of the memory and wait the EOP.
01117   * @param  hospi: OSPI handle
01118   * @param  Timeout: Timeout for auto-polling
01119   * @retval None
01120   */
01121 static uint8_t OSPI_NOR_AutoPollingMemReady(OSPI_HandleTypeDef *hospi, uint32_t Timeout)
01122 {
01123   OSPI_RegularCmdTypeDef  sCommand;
01124   OSPI_AutoPollingTypeDef sConfig;
01125   uint8_t reg[2];
01126 
01127   /* Configure automatic polling mode to wait for memory ready */
01128   sCommand.OperationType         = HAL_OSPI_OPTYPE_COMMON_CFG;
01129   sCommand.FlashId               = HAL_OSPI_FLASH_ID_1;
01130   sCommand.Instruction           = OCTAL_READ_STATUS_REG_CMD;
01131   sCommand.InstructionMode       = HAL_OSPI_INSTRUCTION_8_LINES;
01132   sCommand.InstructionSize       = HAL_OSPI_INSTRUCTION_16_BITS;
01133   sCommand.Address               = 0;
01134   sCommand.AddressMode           = HAL_OSPI_ADDRESS_8_LINES;
01135   sCommand.AddressSize           = HAL_OSPI_ADDRESS_32_BITS;
01136   sCommand.AlternateBytesMode    = HAL_OSPI_ALTERNATE_BYTES_NONE;
01137   sCommand.DataMode              = HAL_OSPI_DATA_8_LINES;
01138   sCommand.NbData                = 2;
01139   sCommand.DummyCycles           = DUMMY_CYCLES_READ_OCTAL;
01140   sCommand.SIOOMode              = HAL_OSPI_SIOO_INST_EVERY_CMD;
01141 
01142 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
01143   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
01144   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_DISABLE;
01145   sCommand.DataDtrMode           = HAL_OSPI_DATA_DTR_DISABLE;
01146   sCommand.DQSMode               = HAL_OSPI_DQS_DISABLE;
01147 #else
01148   sCommand.InstructionDtrMode    = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
01149   sCommand.AddressDtrMode        = HAL_OSPI_ADDRESS_DTR_ENABLE;
01150   sCommand.DataDtrMode           = HAL_OSPI_DATA_DTR_ENABLE;
01151   sCommand.DQSMode               = HAL_OSPI_DQS_ENABLE;
01152 #endif
01153 
01154   sConfig.Match           = 0;
01155   sConfig.Mask            = MX25LM51245G_SR_WIP;
01156   sConfig.MatchMode       = HAL_OSPI_MATCH_MODE_AND;
01157   sConfig.Interval        = 0x10;
01158   sConfig.AutomaticStop   = HAL_OSPI_AUTOMATIC_STOP_ENABLE;
01159 
01160   do
01161   {
01162     HAL_Delay(1); /* sConfig.Interval(0x10) / Clock(55 MHz) = 0.29 ms */
01163 
01164     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01165     {
01166       return OSPI_NOR_ERROR;
01167     }
01168 
01169     if (HAL_OSPI_Receive(&OSPINORHandle, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01170     {
01171       return OSPI_NOR_ERROR;
01172     }
01173   }while((reg[0] & sConfig.Mask ) != sConfig.Match);
01174 
01175   return OSPI_NOR_OK;
01176 }
01177 
01178 /**
01179   * @brief  This function enables/disables the octal mode of the memory.
01180   * @param  hospi: OSPI handle
01181   * @param  Operation: Octal operation mode enable/disable
01182   * @retval None
01183   */
01184 static uint8_t OSPI_NOR_OctalMode(OSPI_HandleTypeDef *hospi, uint8_t Operation)
01185 {
01186   OSPI_RegularCmdTypeDef  sCommand;
01187   OSPI_AutoPollingTypeDef sConfig;
01188   uint8_t reg[2];
01189 
01190   sCommand.OperationType      = HAL_OSPI_OPTYPE_COMMON_CFG;
01191   sCommand.FlashId            = HAL_OSPI_FLASH_ID_1;
01192   sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
01193   sCommand.AddressSize        = HAL_OSPI_ADDRESS_32_BITS;
01194   sCommand.AddressDtrMode     = HAL_OSPI_ADDRESS_DTR_DISABLE;
01195   sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
01196   sCommand.DataDtrMode        = HAL_OSPI_DATA_DTR_DISABLE;
01197   sCommand.DQSMode            = HAL_OSPI_DQS_DISABLE;
01198   sCommand.SIOOMode           = HAL_OSPI_SIOO_INST_EVERY_CMD;
01199 
01200   sConfig.MatchMode     = HAL_OSPI_MATCH_MODE_AND;
01201   sConfig.Interval      = 0x10;
01202   sConfig.AutomaticStop = HAL_OSPI_AUTOMATIC_STOP_ENABLE;
01203 
01204   /* Activate/deactivate the Octal mode */
01205   if (Operation == OSPI_NOR_OCTAL_ENABLE)
01206   {
01207     /* Enable write operations */
01208     sCommand.Instruction     = WRITE_ENABLE_CMD;
01209     sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
01210     sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS;
01211     sCommand.AddressMode     = HAL_OSPI_ADDRESS_NONE;
01212     sCommand.DataMode        = HAL_OSPI_DATA_NONE;
01213     sCommand.DummyCycles     = 0;
01214 
01215     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01216     {
01217       return OSPI_NOR_ERROR;
01218     }
01219 
01220     /* Configure automatic polling mode to wait for write enabling */
01221     sConfig.Match = MX25LM51245G_SR_WEL;
01222     sConfig.Mask  = MX25LM51245G_SR_WEL;
01223 
01224     sCommand.Instruction = READ_STATUS_REG_CMD;
01225     sCommand.DataMode    = HAL_OSPI_DATA_1_LINE;
01226     sCommand.NbData      = 1;
01227 
01228     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01229     {
01230       return OSPI_NOR_ERROR;
01231     }
01232 
01233     if (HAL_OSPI_AutoPolling(&OSPINORHandle, &sConfig, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01234     {
01235       return OSPI_NOR_ERROR;
01236     }
01237 
01238     /* Write Configuration register 2 (with new dummy cycles) */
01239     sCommand.Instruction = WRITE_CFG_REG_2_CMD;
01240     sCommand.Address     = MX25LM51245G_CR2_REG3_ADDR;
01241     sCommand.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
01242     reg[0] = DUMMY_CYCLES_CR_CFG;
01243 
01244     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01245     {
01246       return OSPI_NOR_ERROR;
01247     }
01248 
01249     if (HAL_OSPI_Transmit(&OSPINORHandle, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01250     {
01251       return OSPI_NOR_ERROR;
01252     }
01253 
01254     /* Enable write operations */
01255     sCommand.Instruction = WRITE_ENABLE_CMD;
01256     sCommand.AddressMode = HAL_OSPI_ADDRESS_NONE;
01257     sCommand.DataMode    = HAL_OSPI_DATA_NONE;
01258 
01259     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01260     {
01261       return OSPI_NOR_ERROR;
01262     }
01263 
01264     /* Configure automatic polling mode to wait for write enabling */
01265     sCommand.Instruction = READ_STATUS_REG_CMD;
01266     sCommand.DataMode    = HAL_OSPI_DATA_1_LINE;
01267 
01268     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01269     {
01270       return OSPI_NOR_ERROR;
01271     }
01272 
01273     if (HAL_OSPI_AutoPolling(&OSPINORHandle, &sConfig, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01274     {
01275       return OSPI_NOR_ERROR;
01276     }
01277 
01278     /* Write Configuration register 2 (with Octal I/O SPI protocol) */
01279     sCommand.Instruction = WRITE_CFG_REG_2_CMD;
01280     sCommand.Address     = MX25LM51245G_CR2_REG1_ADDR;
01281     sCommand.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
01282 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
01283     reg[0] = MX25LM51245G_CR2_SOPI;
01284 #else
01285     reg[0] = MX25LM51245G_CR2_DOPI;
01286 #endif
01287 
01288     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01289     {
01290       return OSPI_NOR_ERROR;
01291     }
01292 
01293     if (HAL_OSPI_Transmit(&OSPINORHandle, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01294     {
01295       return OSPI_NOR_ERROR;
01296     }
01297 
01298     /* Wait that the configuration is effective and check that memory is ready */
01299     HAL_Delay(MX25LM51245G_WRITE_REG_MAX_TIME);
01300 
01301     if (OSPI_NOR_AutoPollingMemReady(&OSPINORHandle, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != OSPI_NOR_OK)
01302     {
01303       return OSPI_NOR_ERROR;
01304     }
01305 
01306     /* Check the configuration has been correctly done */
01307     sCommand.Instruction     = OCTAL_READ_CFG_REG_2_CMD;
01308     sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_8_LINES;
01309     sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_16_BITS;
01310     sCommand.AddressMode     = HAL_OSPI_ADDRESS_8_LINES;
01311     sCommand.DataMode        = HAL_OSPI_DATA_8_LINES;
01312     sCommand.DummyCycles     = DUMMY_CYCLES_READ_OCTAL;
01313     sCommand.NbData          = 2;
01314     reg[0] = 0;
01315 
01316 #if !defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
01317     sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
01318     sCommand.AddressDtrMode     = HAL_OSPI_ADDRESS_DTR_ENABLE;
01319     sCommand.DataDtrMode        = HAL_OSPI_DATA_DTR_ENABLE;
01320     sCommand.DQSMode            = HAL_OSPI_DQS_ENABLE;
01321 #endif
01322 
01323     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01324     {
01325       return OSPI_NOR_ERROR;
01326     }
01327 
01328     if (HAL_OSPI_Receive(&OSPINORHandle, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01329     {
01330       return OSPI_NOR_ERROR;
01331     }
01332 
01333 #if defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
01334     if (reg[0] != MX25LM51245G_CR2_SOPI)
01335 #else
01336     if (reg[0] != MX25LM51245G_CR2_DOPI)
01337 #endif
01338     {
01339       return OSPI_NOR_ERROR;
01340     }
01341   }
01342   else
01343   {
01344     /* Enable write operations */
01345     if (OSPI_NOR_WriteEnable(&OSPINORHandle) != OSPI_NOR_OK)
01346     {
01347       return OSPI_NOR_ERROR;
01348     }
01349 
01350     /* Write Configuration register 2 (with Octal I/O SPI protocol) */
01351     sCommand.Instruction     = OCTAL_WRITE_CFG_REG_2_CMD;
01352     sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_8_LINES;
01353     sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_16_BITS;
01354     sCommand.Address         = MX25LM51245G_CR2_REG1_ADDR;
01355     sCommand.AddressMode     = HAL_OSPI_ADDRESS_8_LINES;
01356     sCommand.DataMode        = HAL_OSPI_DATA_8_LINES;
01357     sCommand.NbData          = 2;
01358     sCommand.DummyCycles     = 0;
01359     reg[0] = 0;
01360     reg[1] = 0;
01361 
01362 #if !defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
01363     sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
01364     sCommand.AddressDtrMode     = HAL_OSPI_ADDRESS_DTR_ENABLE;
01365     sCommand.DataDtrMode        = HAL_OSPI_DATA_DTR_ENABLE;
01366 #endif
01367 
01368     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01369     {
01370       return OSPI_NOR_ERROR;
01371     }
01372 
01373     if (HAL_OSPI_Transmit(&OSPINORHandle, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01374     {
01375       return OSPI_NOR_ERROR;
01376     }
01377 
01378     /* Wait that the configuration is effective and check that memory is ready */
01379     HAL_Delay(MX25LM51245G_WRITE_REG_MAX_TIME);
01380 
01381     sCommand.Instruction     = READ_STATUS_REG_CMD;
01382     sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
01383     sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS;
01384     sCommand.AddressMode     = HAL_OSPI_ADDRESS_NONE;
01385     sCommand.DataMode        = HAL_OSPI_DATA_1_LINE;
01386     sCommand.NbData          = 1;
01387     sCommand.DummyCycles     = 0;
01388 
01389 #if !defined BSP_OSPI_NOR_DDR_MODE_DEACTIVATED
01390     sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
01391     sCommand.AddressDtrMode     = HAL_OSPI_ADDRESS_DTR_DISABLE;
01392     sCommand.DataDtrMode        = HAL_OSPI_DATA_DTR_DISABLE;
01393 #endif
01394 
01395     sConfig.Match = 0;
01396     sConfig.Mask  = MX25LM51245G_SR_WIP;
01397 
01398     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01399     {
01400       return OSPI_NOR_ERROR;
01401     }
01402 
01403     if (HAL_OSPI_AutoPolling(&OSPINORHandle, &sConfig, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01404     {
01405       return OSPI_NOR_ERROR;
01406     }
01407 
01408     /* Check the configuration has been correctly done */
01409     sCommand.Instruction = READ_CFG_REG_2_CMD;
01410     sCommand.Address     = MX25LM51245G_CR2_REG1_ADDR;
01411     sCommand.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
01412 
01413     if (HAL_OSPI_Command(&OSPINORHandle, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01414     {
01415       return OSPI_NOR_ERROR;
01416     }
01417 
01418     if (HAL_OSPI_Receive(&OSPINORHandle, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
01419     {
01420       return OSPI_NOR_ERROR;
01421     }
01422 
01423     if (reg[0] != 0)
01424     {
01425       return OSPI_NOR_ERROR;
01426     }
01427   }
01428 
01429   return OSPI_NOR_OK;
01430 }
01431 
01432 /**
01433   * @}
01434   */
01435 
01436 /**
01437   * @}
01438   */
01439 
01440 /**
01441   * @}
01442   */
01443 
01444 /**
01445   * @}
01446   */
01447 
01448 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
01449 
Generated on Thu Oct 12 2017 10:53:59 for STM32L4R9I_EVAL BSP User Manual by   doxygen 1.7.6.1