Kevin Kadooka / mbed-dev

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
Parent:
0:9b334a45a8ff
This updates the lib to the mbed lib v125

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 ******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file stm32f3xx_hal_pccard.c
<> 144:ef7eb2e8f9f7 4 * @author MCD Application Team
<> 144:ef7eb2e8f9f7 5 * @version V1.3.0
<> 144:ef7eb2e8f9f7 6 * @date 01-July-2016
<> 144:ef7eb2e8f9f7 7 * @brief PCCARD HAL module driver.
<> 144:ef7eb2e8f9f7 8 * This file provides a generic firmware to drive PCCARD memories mounted
<> 144:ef7eb2e8f9f7 9 * as external device.
<> 144:ef7eb2e8f9f7 10 *
<> 144:ef7eb2e8f9f7 11 @verbatim
<> 144:ef7eb2e8f9f7 12 ===============================================================================
<> 144:ef7eb2e8f9f7 13 ##### How to use this driver #####
<> 144:ef7eb2e8f9f7 14 ===============================================================================
<> 144:ef7eb2e8f9f7 15 [..]
<> 144:ef7eb2e8f9f7 16 This driver is a generic layered driver which contains a set of APIs used to
<> 144:ef7eb2e8f9f7 17 control PCCARD/compact flash memories. It uses the FMC layer functions
<> 144:ef7eb2e8f9f7 18 to interface with PCCARD devices. This driver is used for:
<> 144:ef7eb2e8f9f7 19
<> 144:ef7eb2e8f9f7 20 (+) PCCARD/compact flash memory configuration sequence using the function
<> 144:ef7eb2e8f9f7 21 HAL_PCCARD_Init() with control and timing parameters for both common and
<> 144:ef7eb2e8f9f7 22 attribute spaces.
<> 144:ef7eb2e8f9f7 23
<> 144:ef7eb2e8f9f7 24 (+) Read PCCARD/compact flash memory maker and device IDs using the function
<> 144:ef7eb2e8f9f7 25 HAL_PCCARD_Read_ID(). The read information is stored in the CompactFlash_ID
<> 144:ef7eb2e8f9f7 26 structure declared by the function caller.
<> 144:ef7eb2e8f9f7 27
<> 144:ef7eb2e8f9f7 28 (+) Access PCCARD/compact flash memory by read/write operations using the functions
<> 144:ef7eb2e8f9f7 29 HAL_PCCARD_Read_Sector()/HAL_PCCARD_Write_Sector(), to read/write sector.
<> 144:ef7eb2e8f9f7 30
<> 144:ef7eb2e8f9f7 31 (+) Perform PCCARD/compact flash Reset chip operation using the function HAL_PCCARD_Reset().
<> 144:ef7eb2e8f9f7 32
<> 144:ef7eb2e8f9f7 33 (+) Perform PCCARD/compact flash erase sector operation using the function
<> 144:ef7eb2e8f9f7 34 HAL_PCCARD_Erase_Sector().
<> 144:ef7eb2e8f9f7 35
<> 144:ef7eb2e8f9f7 36 (+) Read the PCCARD/compact flash status operation using the function HAL_PCCARD_ReadStatus().
<> 144:ef7eb2e8f9f7 37
<> 144:ef7eb2e8f9f7 38 (+) You can monitor the PCCARD/compact flash device HAL state by calling the function
<> 144:ef7eb2e8f9f7 39 HAL_PCCARD_GetState()
<> 144:ef7eb2e8f9f7 40
<> 144:ef7eb2e8f9f7 41 [..]
<> 144:ef7eb2e8f9f7 42 (@) This driver is a set of generic APIs which handle standard PCCARD/compact flash
<> 144:ef7eb2e8f9f7 43 operations. If a PCCARD/compact flash device contains different operations
<> 144:ef7eb2e8f9f7 44 and/or implementations, it should be implemented separately.
<> 144:ef7eb2e8f9f7 45
<> 144:ef7eb2e8f9f7 46 @endverbatim
<> 144:ef7eb2e8f9f7 47 ******************************************************************************
<> 144:ef7eb2e8f9f7 48 * @attention
<> 144:ef7eb2e8f9f7 49 *
<> 144:ef7eb2e8f9f7 50 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
<> 144:ef7eb2e8f9f7 51 *
<> 144:ef7eb2e8f9f7 52 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 53 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 54 * 1. Redistributions of source code must retain the above copyright notice,
<> 144:ef7eb2e8f9f7 55 * this list of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 56 * 2. Redistributions in binary form must reproduce the above copyright notice,
<> 144:ef7eb2e8f9f7 57 * this list of conditions and the following disclaimer in the documentation
<> 144:ef7eb2e8f9f7 58 * and/or other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 59 * 3. Neither the name of STMicroelectronics nor the names of its contributors
<> 144:ef7eb2e8f9f7 60 * may be used to endorse or promote products derived from this software
<> 144:ef7eb2e8f9f7 61 * without specific prior written permission.
<> 144:ef7eb2e8f9f7 62 *
<> 144:ef7eb2e8f9f7 63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
<> 144:ef7eb2e8f9f7 64 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<> 144:ef7eb2e8f9f7 65 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
<> 144:ef7eb2e8f9f7 67 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
<> 144:ef7eb2e8f9f7 68 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
<> 144:ef7eb2e8f9f7 69 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
<> 144:ef7eb2e8f9f7 70 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
<> 144:ef7eb2e8f9f7 71 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
<> 144:ef7eb2e8f9f7 72 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 73 *
<> 144:ef7eb2e8f9f7 74 ******************************************************************************
<> 144:ef7eb2e8f9f7 75 */
<> 144:ef7eb2e8f9f7 76
<> 144:ef7eb2e8f9f7 77 /* Includes ------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 78 #include "stm32f3xx_hal.h"
<> 144:ef7eb2e8f9f7 79
<> 144:ef7eb2e8f9f7 80 #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)
<> 144:ef7eb2e8f9f7 81 /** @addtogroup STM32F3xx_HAL_Driver
<> 144:ef7eb2e8f9f7 82 * @{
<> 144:ef7eb2e8f9f7 83 */
<> 144:ef7eb2e8f9f7 84
<> 144:ef7eb2e8f9f7 85 #ifdef HAL_PCCARD_MODULE_ENABLED
<> 144:ef7eb2e8f9f7 86
<> 144:ef7eb2e8f9f7 87 /** @defgroup PCCARD PCCARD
<> 144:ef7eb2e8f9f7 88 * @brief PCCARD HAL module driver
<> 144:ef7eb2e8f9f7 89 * @{
<> 144:ef7eb2e8f9f7 90 */
<> 144:ef7eb2e8f9f7 91
<> 144:ef7eb2e8f9f7 92 /* Private typedef -----------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 93 /* Private define ------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 94 /** @defgroup PCCARD_Private_Constants PCCARD Private Constants
<> 144:ef7eb2e8f9f7 95 * @{
<> 144:ef7eb2e8f9f7 96 */
<> 144:ef7eb2e8f9f7 97
<> 144:ef7eb2e8f9f7 98 #define PCCARD_TIMEOUT_READ_ID (uint32_t)0x0000FFFF
<> 144:ef7eb2e8f9f7 99 #define PCCARD_TIMEOUT_SECTOR (uint32_t)0x0000FFFF
<> 144:ef7eb2e8f9f7 100 #define PCCARD_TIMEOUT_STATUS (uint32_t)0x01000000
<> 144:ef7eb2e8f9f7 101
<> 144:ef7eb2e8f9f7 102 #define PCCARD_STATUS_OK (uint8_t)0x58
<> 144:ef7eb2e8f9f7 103 #define PCCARD_STATUS_WRITE_OK (uint8_t)0x50
<> 144:ef7eb2e8f9f7 104 /**
<> 144:ef7eb2e8f9f7 105 * @}
<> 144:ef7eb2e8f9f7 106 */
<> 144:ef7eb2e8f9f7 107
<> 144:ef7eb2e8f9f7 108 /* Private macro -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 109 /* Private variables ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 110 /* Private function prototypes -----------------------------------------------*/
<> 144:ef7eb2e8f9f7 111 /* Exported functions ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 112
<> 144:ef7eb2e8f9f7 113 /** @defgroup PCCARD_Exported_Functions PCCARD Exported Functions
<> 144:ef7eb2e8f9f7 114 * @{
<> 144:ef7eb2e8f9f7 115 */
<> 144:ef7eb2e8f9f7 116
<> 144:ef7eb2e8f9f7 117 /** @defgroup PCCARD_Exported_Functions_Group1 Initialization and de-initialization functions
<> 144:ef7eb2e8f9f7 118 * @brief Initialization and Configuration functions
<> 144:ef7eb2e8f9f7 119 *
<> 144:ef7eb2e8f9f7 120 @verbatim
<> 144:ef7eb2e8f9f7 121 ==============================================================================
<> 144:ef7eb2e8f9f7 122 ##### PCCARD Initialization and de-initialization functions #####
<> 144:ef7eb2e8f9f7 123 ==============================================================================
<> 144:ef7eb2e8f9f7 124 [..]
<> 144:ef7eb2e8f9f7 125 This section provides functions allowing to initialize/de-initialize
<> 144:ef7eb2e8f9f7 126 the PCCARD memory
<> 144:ef7eb2e8f9f7 127
<> 144:ef7eb2e8f9f7 128 @endverbatim
<> 144:ef7eb2e8f9f7 129 * @{
<> 144:ef7eb2e8f9f7 130 */
<> 144:ef7eb2e8f9f7 131
<> 144:ef7eb2e8f9f7 132 /**
<> 144:ef7eb2e8f9f7 133 * @brief Perform the PCCARD memory Initialization sequence
<> 144:ef7eb2e8f9f7 134 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 135 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 136 * @param ComSpaceTiming: Common space timing structure
<> 144:ef7eb2e8f9f7 137 * @param AttSpaceTiming: Attribute space timing structure
<> 144:ef7eb2e8f9f7 138 * @param IOSpaceTiming: IO space timing structure
<> 144:ef7eb2e8f9f7 139 * @retval HAL status
<> 144:ef7eb2e8f9f7 140 */
<> 144:ef7eb2e8f9f7 141 HAL_StatusTypeDef HAL_PCCARD_Init(PCCARD_HandleTypeDef *hpccard, FMC_NAND_PCC_TimingTypeDef *ComSpaceTiming, FMC_NAND_PCC_TimingTypeDef *AttSpaceTiming, FMC_NAND_PCC_TimingTypeDef *IOSpaceTiming)
<> 144:ef7eb2e8f9f7 142 {
<> 144:ef7eb2e8f9f7 143 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 144 if(hpccard == NULL)
<> 144:ef7eb2e8f9f7 145 {
<> 144:ef7eb2e8f9f7 146 return HAL_ERROR;
<> 144:ef7eb2e8f9f7 147 }
<> 144:ef7eb2e8f9f7 148
<> 144:ef7eb2e8f9f7 149 if(hpccard->State == HAL_PCCARD_STATE_RESET)
<> 144:ef7eb2e8f9f7 150 {
<> 144:ef7eb2e8f9f7 151 /* Allocate lock resource and initialize it */
<> 144:ef7eb2e8f9f7 152 hpccard->Lock = HAL_UNLOCKED;
<> 144:ef7eb2e8f9f7 153
<> 144:ef7eb2e8f9f7 154 /* Initialize the low level hardware (MSP) */
<> 144:ef7eb2e8f9f7 155 HAL_PCCARD_MspInit(hpccard);
<> 144:ef7eb2e8f9f7 156 }
<> 144:ef7eb2e8f9f7 157
<> 144:ef7eb2e8f9f7 158 /* Initialize the PCCARD state */
<> 144:ef7eb2e8f9f7 159 hpccard->State = HAL_PCCARD_STATE_BUSY;
<> 144:ef7eb2e8f9f7 160
<> 144:ef7eb2e8f9f7 161 /* Initialize PCCARD control Interface */
<> 144:ef7eb2e8f9f7 162 FMC_PCCARD_Init(hpccard->Instance, &(hpccard->Init));
<> 144:ef7eb2e8f9f7 163
<> 144:ef7eb2e8f9f7 164 /* Init PCCARD common space timing Interface */
<> 144:ef7eb2e8f9f7 165 FMC_PCCARD_CommonSpace_Timing_Init(hpccard->Instance, ComSpaceTiming);
<> 144:ef7eb2e8f9f7 166
<> 144:ef7eb2e8f9f7 167 /* Init PCCARD attribute space timing Interface */
<> 144:ef7eb2e8f9f7 168 FMC_PCCARD_AttributeSpace_Timing_Init(hpccard->Instance, AttSpaceTiming);
<> 144:ef7eb2e8f9f7 169
<> 144:ef7eb2e8f9f7 170 /* Init PCCARD IO space timing Interface */
<> 144:ef7eb2e8f9f7 171 FMC_PCCARD_IOSpace_Timing_Init(hpccard->Instance, IOSpaceTiming);
<> 144:ef7eb2e8f9f7 172
<> 144:ef7eb2e8f9f7 173 /* Enable the PCCARD device */
<> 144:ef7eb2e8f9f7 174 __FMC_PCCARD_ENABLE(hpccard->Instance);
<> 144:ef7eb2e8f9f7 175
<> 144:ef7eb2e8f9f7 176 /* Update the PCCARD state */
<> 144:ef7eb2e8f9f7 177 hpccard->State = HAL_PCCARD_STATE_READY;
<> 144:ef7eb2e8f9f7 178
<> 144:ef7eb2e8f9f7 179 return HAL_OK;
<> 144:ef7eb2e8f9f7 180
<> 144:ef7eb2e8f9f7 181 }
<> 144:ef7eb2e8f9f7 182
<> 144:ef7eb2e8f9f7 183 /**
<> 144:ef7eb2e8f9f7 184 * @brief Perform the PCCARD memory De-initialization sequence
<> 144:ef7eb2e8f9f7 185 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 186 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 187 * @retval HAL status
<> 144:ef7eb2e8f9f7 188 */
<> 144:ef7eb2e8f9f7 189 HAL_StatusTypeDef HAL_PCCARD_DeInit(PCCARD_HandleTypeDef *hpccard)
<> 144:ef7eb2e8f9f7 190 {
<> 144:ef7eb2e8f9f7 191 /* De-Initialize the low level hardware (MSP) */
<> 144:ef7eb2e8f9f7 192 HAL_PCCARD_MspDeInit(hpccard);
<> 144:ef7eb2e8f9f7 193
<> 144:ef7eb2e8f9f7 194 /* Configure the PCCARD registers with their reset values */
<> 144:ef7eb2e8f9f7 195 FMC_PCCARD_DeInit(hpccard->Instance);
<> 144:ef7eb2e8f9f7 196
<> 144:ef7eb2e8f9f7 197 /* Update the PCCARD controller state */
<> 144:ef7eb2e8f9f7 198 hpccard->State = HAL_PCCARD_STATE_RESET;
<> 144:ef7eb2e8f9f7 199
<> 144:ef7eb2e8f9f7 200 /* Release Lock */
<> 144:ef7eb2e8f9f7 201 __HAL_UNLOCK(hpccard);
<> 144:ef7eb2e8f9f7 202
<> 144:ef7eb2e8f9f7 203 return HAL_OK;
<> 144:ef7eb2e8f9f7 204 }
<> 144:ef7eb2e8f9f7 205
<> 144:ef7eb2e8f9f7 206 /**
<> 144:ef7eb2e8f9f7 207 * @brief PCCARD MSP Init
<> 144:ef7eb2e8f9f7 208 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 209 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 210 * @retval None
<> 144:ef7eb2e8f9f7 211 */
<> 144:ef7eb2e8f9f7 212 __weak void HAL_PCCARD_MspInit(PCCARD_HandleTypeDef *hpccard)
<> 144:ef7eb2e8f9f7 213 {
<> 144:ef7eb2e8f9f7 214 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 215 UNUSED(hpccard);
<> 144:ef7eb2e8f9f7 216
<> 144:ef7eb2e8f9f7 217 /* NOTE : This function Should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 218 the HAL_PCCARD_MspInit could be implemented in the user file
<> 144:ef7eb2e8f9f7 219 */
<> 144:ef7eb2e8f9f7 220 }
<> 144:ef7eb2e8f9f7 221
<> 144:ef7eb2e8f9f7 222 /**
<> 144:ef7eb2e8f9f7 223 * @brief PCCARD MSP DeInit
<> 144:ef7eb2e8f9f7 224 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 225 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 226 * @retval None
<> 144:ef7eb2e8f9f7 227 */
<> 144:ef7eb2e8f9f7 228 __weak void HAL_PCCARD_MspDeInit(PCCARD_HandleTypeDef *hpccard)
<> 144:ef7eb2e8f9f7 229 {
<> 144:ef7eb2e8f9f7 230 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 231 UNUSED(hpccard);
<> 144:ef7eb2e8f9f7 232
<> 144:ef7eb2e8f9f7 233 /* NOTE : This function Should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 234 the HAL_PCCARD_MspDeInit could be implemented in the user file
<> 144:ef7eb2e8f9f7 235 */
<> 144:ef7eb2e8f9f7 236 }
<> 144:ef7eb2e8f9f7 237
<> 144:ef7eb2e8f9f7 238 /**
<> 144:ef7eb2e8f9f7 239 * @}
<> 144:ef7eb2e8f9f7 240 */
<> 144:ef7eb2e8f9f7 241
<> 144:ef7eb2e8f9f7 242 /** @defgroup PCCARD_Exported_Functions_Group2 Input Output and memory functions
<> 144:ef7eb2e8f9f7 243 * @brief Input Output and memory control functions
<> 144:ef7eb2e8f9f7 244 *
<> 144:ef7eb2e8f9f7 245 @verbatim
<> 144:ef7eb2e8f9f7 246 ==============================================================================
<> 144:ef7eb2e8f9f7 247 ##### PCCARD Input Output and memory functions #####
<> 144:ef7eb2e8f9f7 248 ==============================================================================
<> 144:ef7eb2e8f9f7 249 [..]
<> 144:ef7eb2e8f9f7 250 This section provides functions allowing to use and control the PCCARD memory
<> 144:ef7eb2e8f9f7 251
<> 144:ef7eb2e8f9f7 252 @endverbatim
<> 144:ef7eb2e8f9f7 253 * @{
<> 144:ef7eb2e8f9f7 254 */
<> 144:ef7eb2e8f9f7 255
<> 144:ef7eb2e8f9f7 256 /**
<> 144:ef7eb2e8f9f7 257 * @brief Read Compact Flash's ID.
<> 144:ef7eb2e8f9f7 258 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 259 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 260 * @param CompactFlash_ID: Compact flash ID structure.
<> 144:ef7eb2e8f9f7 261 * @param pStatus: pointer to compact flash status
<> 144:ef7eb2e8f9f7 262 * @retval HAL status
<> 144:ef7eb2e8f9f7 263 *
<> 144:ef7eb2e8f9f7 264 */
<> 144:ef7eb2e8f9f7 265 HAL_StatusTypeDef HAL_PCCARD_Read_ID(PCCARD_HandleTypeDef *hpccard, uint8_t CompactFlash_ID[], uint8_t *pStatus)
<> 144:ef7eb2e8f9f7 266 {
<> 144:ef7eb2e8f9f7 267 uint32_t timeout = PCCARD_TIMEOUT_READ_ID, index = 0;
<> 144:ef7eb2e8f9f7 268 uint8_t status = 0;
<> 144:ef7eb2e8f9f7 269
<> 144:ef7eb2e8f9f7 270 /* Process Locked */
<> 144:ef7eb2e8f9f7 271 __HAL_LOCK(hpccard);
<> 144:ef7eb2e8f9f7 272
<> 144:ef7eb2e8f9f7 273 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 274 if(hpccard->State == HAL_PCCARD_STATE_BUSY)
<> 144:ef7eb2e8f9f7 275 {
<> 144:ef7eb2e8f9f7 276 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 277 }
<> 144:ef7eb2e8f9f7 278
<> 144:ef7eb2e8f9f7 279 /* Update the PCCARD controller state */
<> 144:ef7eb2e8f9f7 280 hpccard->State = HAL_PCCARD_STATE_BUSY;
<> 144:ef7eb2e8f9f7 281
<> 144:ef7eb2e8f9f7 282 /* Initialize the CF status */
<> 144:ef7eb2e8f9f7 283 *pStatus = PCCARD_READY;
<> 144:ef7eb2e8f9f7 284
<> 144:ef7eb2e8f9f7 285 /* Send the Identify Command */
<> 144:ef7eb2e8f9f7 286 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = 0xECEC;
<> 144:ef7eb2e8f9f7 287
<> 144:ef7eb2e8f9f7 288 /* Read CF IDs and timeout treatment */
<> 144:ef7eb2e8f9f7 289 do
<> 144:ef7eb2e8f9f7 290 {
<> 144:ef7eb2e8f9f7 291 /* Read the CF status */
<> 144:ef7eb2e8f9f7 292 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
<> 144:ef7eb2e8f9f7 293
<> 144:ef7eb2e8f9f7 294 timeout--;
<> 144:ef7eb2e8f9f7 295 }while((status != PCCARD_STATUS_OK) && timeout);
<> 144:ef7eb2e8f9f7 296
<> 144:ef7eb2e8f9f7 297 if(timeout == 0)
<> 144:ef7eb2e8f9f7 298 {
<> 144:ef7eb2e8f9f7 299 *pStatus = PCCARD_TIMEOUT_ERROR;
<> 144:ef7eb2e8f9f7 300 }
<> 144:ef7eb2e8f9f7 301 else
<> 144:ef7eb2e8f9f7 302 {
<> 144:ef7eb2e8f9f7 303 /* Read CF ID bytes */
<> 144:ef7eb2e8f9f7 304 for(index = 0; index < 16; index++)
<> 144:ef7eb2e8f9f7 305 {
<> 144:ef7eb2e8f9f7 306 CompactFlash_ID[index] = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_DATA);
<> 144:ef7eb2e8f9f7 307 }
<> 144:ef7eb2e8f9f7 308 }
<> 144:ef7eb2e8f9f7 309
<> 144:ef7eb2e8f9f7 310 /* Update the PCCARD controller state */
<> 144:ef7eb2e8f9f7 311 hpccard->State = HAL_PCCARD_STATE_READY;
<> 144:ef7eb2e8f9f7 312
<> 144:ef7eb2e8f9f7 313 /* Process unlocked */
<> 144:ef7eb2e8f9f7 314 __HAL_UNLOCK(hpccard);
<> 144:ef7eb2e8f9f7 315
<> 144:ef7eb2e8f9f7 316 return HAL_OK;
<> 144:ef7eb2e8f9f7 317 }
<> 144:ef7eb2e8f9f7 318
<> 144:ef7eb2e8f9f7 319 /**
<> 144:ef7eb2e8f9f7 320 * @brief Read sector from PCCARD memory
<> 144:ef7eb2e8f9f7 321 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 322 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 323 * @param pBuffer: pointer to destination read buffer
<> 144:ef7eb2e8f9f7 324 * @param SectorAddress: Sector address to read
<> 144:ef7eb2e8f9f7 325 * @param pStatus: pointer to CF status
<> 144:ef7eb2e8f9f7 326 * @retval HAL status
<> 144:ef7eb2e8f9f7 327 */
<> 144:ef7eb2e8f9f7 328 HAL_StatusTypeDef HAL_PCCARD_Read_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress, uint8_t *pStatus)
<> 144:ef7eb2e8f9f7 329 {
<> 144:ef7eb2e8f9f7 330 uint32_t timeout = PCCARD_TIMEOUT_SECTOR, index = 0;
<> 144:ef7eb2e8f9f7 331 uint8_t status = 0;
<> 144:ef7eb2e8f9f7 332
<> 144:ef7eb2e8f9f7 333 /* Process Locked */
<> 144:ef7eb2e8f9f7 334 __HAL_LOCK(hpccard);
<> 144:ef7eb2e8f9f7 335
<> 144:ef7eb2e8f9f7 336 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 337 if(hpccard->State == HAL_PCCARD_STATE_BUSY)
<> 144:ef7eb2e8f9f7 338 {
<> 144:ef7eb2e8f9f7 339 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 340 }
<> 144:ef7eb2e8f9f7 341
<> 144:ef7eb2e8f9f7 342 /* Update the PCCARD controller state */
<> 144:ef7eb2e8f9f7 343 hpccard->State = HAL_PCCARD_STATE_BUSY;
<> 144:ef7eb2e8f9f7 344
<> 144:ef7eb2e8f9f7 345 /* Initialize CF status */
<> 144:ef7eb2e8f9f7 346 *pStatus = PCCARD_READY;
<> 144:ef7eb2e8f9f7 347
<> 144:ef7eb2e8f9f7 348 /* Set the parameters to write a sector */
<> 144:ef7eb2e8f9f7 349 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x00;
<> 144:ef7eb2e8f9f7 350 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100 ) | ((uint16_t)SectorAddress);
<> 144:ef7eb2e8f9f7 351 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0xE4A0;
<> 144:ef7eb2e8f9f7 352
<> 144:ef7eb2e8f9f7 353 do
<> 144:ef7eb2e8f9f7 354 {
<> 144:ef7eb2e8f9f7 355 /* wait till the Status = 0x80 */
<> 144:ef7eb2e8f9f7 356 status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
<> 144:ef7eb2e8f9f7 357 timeout--;
<> 144:ef7eb2e8f9f7 358 }while((status == 0x80) && timeout);
<> 144:ef7eb2e8f9f7 359
<> 144:ef7eb2e8f9f7 360 if(timeout == 0)
<> 144:ef7eb2e8f9f7 361 {
<> 144:ef7eb2e8f9f7 362 *pStatus = PCCARD_TIMEOUT_ERROR;
<> 144:ef7eb2e8f9f7 363 }
<> 144:ef7eb2e8f9f7 364
<> 144:ef7eb2e8f9f7 365 timeout = 0xFFFF;
<> 144:ef7eb2e8f9f7 366
<> 144:ef7eb2e8f9f7 367 do
<> 144:ef7eb2e8f9f7 368 {
<> 144:ef7eb2e8f9f7 369 /* wait till the Status = PCCARD_STATUS_OK */
<> 144:ef7eb2e8f9f7 370 status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
<> 144:ef7eb2e8f9f7 371 timeout--;
<> 144:ef7eb2e8f9f7 372 }while((status != PCCARD_STATUS_OK) && timeout);
<> 144:ef7eb2e8f9f7 373
<> 144:ef7eb2e8f9f7 374 if(timeout == 0)
<> 144:ef7eb2e8f9f7 375 {
<> 144:ef7eb2e8f9f7 376 *pStatus = PCCARD_TIMEOUT_ERROR;
<> 144:ef7eb2e8f9f7 377 }
<> 144:ef7eb2e8f9f7 378
<> 144:ef7eb2e8f9f7 379 /* Read bytes */
<> 144:ef7eb2e8f9f7 380 for(; index < PCCARD_SECTOR_SIZE; index++)
<> 144:ef7eb2e8f9f7 381 {
<> 144:ef7eb2e8f9f7 382 *(uint16_t *)pBuffer++ = *(uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR);
<> 144:ef7eb2e8f9f7 383 }
<> 144:ef7eb2e8f9f7 384
<> 144:ef7eb2e8f9f7 385 /* Update the PCCARD controller state */
<> 144:ef7eb2e8f9f7 386 hpccard->State = HAL_PCCARD_STATE_READY;
<> 144:ef7eb2e8f9f7 387
<> 144:ef7eb2e8f9f7 388 /* Process unlocked */
<> 144:ef7eb2e8f9f7 389 __HAL_UNLOCK(hpccard);
<> 144:ef7eb2e8f9f7 390
<> 144:ef7eb2e8f9f7 391 return HAL_OK;
<> 144:ef7eb2e8f9f7 392 }
<> 144:ef7eb2e8f9f7 393
<> 144:ef7eb2e8f9f7 394
<> 144:ef7eb2e8f9f7 395 /**
<> 144:ef7eb2e8f9f7 396 * @brief Write sector to PCCARD memory
<> 144:ef7eb2e8f9f7 397 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 398 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 399 * @param pBuffer: pointer to source write buffer
<> 144:ef7eb2e8f9f7 400 * @param SectorAddress: Sector address to write
<> 144:ef7eb2e8f9f7 401 * @param pStatus: pointer to CF status
<> 144:ef7eb2e8f9f7 402 * @retval HAL status
<> 144:ef7eb2e8f9f7 403 */
<> 144:ef7eb2e8f9f7 404 HAL_StatusTypeDef HAL_PCCARD_Write_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress, uint8_t *pStatus)
<> 144:ef7eb2e8f9f7 405 {
<> 144:ef7eb2e8f9f7 406 uint32_t timeout = PCCARD_TIMEOUT_SECTOR, index = 0;
<> 144:ef7eb2e8f9f7 407 uint8_t status = 0;
<> 144:ef7eb2e8f9f7 408
<> 144:ef7eb2e8f9f7 409 /* Process Locked */
<> 144:ef7eb2e8f9f7 410 __HAL_LOCK(hpccard);
<> 144:ef7eb2e8f9f7 411
<> 144:ef7eb2e8f9f7 412 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 413 if(hpccard->State == HAL_PCCARD_STATE_BUSY)
<> 144:ef7eb2e8f9f7 414 {
<> 144:ef7eb2e8f9f7 415 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 416 }
<> 144:ef7eb2e8f9f7 417
<> 144:ef7eb2e8f9f7 418 /* Update the PCCARD controller state */
<> 144:ef7eb2e8f9f7 419 hpccard->State = HAL_PCCARD_STATE_BUSY;
<> 144:ef7eb2e8f9f7 420
<> 144:ef7eb2e8f9f7 421 /* Initialize CF status */
<> 144:ef7eb2e8f9f7 422 *pStatus = PCCARD_READY;
<> 144:ef7eb2e8f9f7 423
<> 144:ef7eb2e8f9f7 424 /* Set the parameters to write a sector */
<> 144:ef7eb2e8f9f7 425 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x00;
<> 144:ef7eb2e8f9f7 426 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100 ) | ((uint16_t)SectorAddress);
<> 144:ef7eb2e8f9f7 427 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0x30A0;
<> 144:ef7eb2e8f9f7 428
<> 144:ef7eb2e8f9f7 429 do
<> 144:ef7eb2e8f9f7 430 {
<> 144:ef7eb2e8f9f7 431 /* Wait till the Status = PCCARD_STATUS_OK */
<> 144:ef7eb2e8f9f7 432 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
<> 144:ef7eb2e8f9f7 433 timeout--;
<> 144:ef7eb2e8f9f7 434 }while((status != PCCARD_STATUS_OK) && timeout);
<> 144:ef7eb2e8f9f7 435
<> 144:ef7eb2e8f9f7 436 if(timeout == 0)
<> 144:ef7eb2e8f9f7 437 {
<> 144:ef7eb2e8f9f7 438 *pStatus = PCCARD_TIMEOUT_ERROR;
<> 144:ef7eb2e8f9f7 439 }
<> 144:ef7eb2e8f9f7 440
<> 144:ef7eb2e8f9f7 441 /* Write bytes */
<> 144:ef7eb2e8f9f7 442 for(; index < PCCARD_SECTOR_SIZE; index++)
<> 144:ef7eb2e8f9f7 443 {
<> 144:ef7eb2e8f9f7 444 *(uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR) = *(uint16_t *)pBuffer++;
<> 144:ef7eb2e8f9f7 445 }
<> 144:ef7eb2e8f9f7 446
<> 144:ef7eb2e8f9f7 447 do
<> 144:ef7eb2e8f9f7 448 {
<> 144:ef7eb2e8f9f7 449 /* Wait till the Status = PCCARD_STATUS_WRITE_OK */
<> 144:ef7eb2e8f9f7 450 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
<> 144:ef7eb2e8f9f7 451 timeout--;
<> 144:ef7eb2e8f9f7 452 }while((status != PCCARD_STATUS_WRITE_OK) && timeout);
<> 144:ef7eb2e8f9f7 453
<> 144:ef7eb2e8f9f7 454 if(timeout == 0)
<> 144:ef7eb2e8f9f7 455 {
<> 144:ef7eb2e8f9f7 456 *pStatus = PCCARD_TIMEOUT_ERROR;
<> 144:ef7eb2e8f9f7 457 }
<> 144:ef7eb2e8f9f7 458
<> 144:ef7eb2e8f9f7 459 /* Update the PCCARD controller state */
<> 144:ef7eb2e8f9f7 460 hpccard->State = HAL_PCCARD_STATE_READY;
<> 144:ef7eb2e8f9f7 461
<> 144:ef7eb2e8f9f7 462 /* Process unlocked */
<> 144:ef7eb2e8f9f7 463 __HAL_UNLOCK(hpccard);
<> 144:ef7eb2e8f9f7 464
<> 144:ef7eb2e8f9f7 465 return HAL_OK;
<> 144:ef7eb2e8f9f7 466 }
<> 144:ef7eb2e8f9f7 467
<> 144:ef7eb2e8f9f7 468
<> 144:ef7eb2e8f9f7 469 /**
<> 144:ef7eb2e8f9f7 470 * @brief Erase sector from PCCARD memory
<> 144:ef7eb2e8f9f7 471 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 472 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 473 * @param SectorAddress: Sector address to erase
<> 144:ef7eb2e8f9f7 474 * @param pStatus: pointer to CF status
<> 144:ef7eb2e8f9f7 475 * @retval HAL status
<> 144:ef7eb2e8f9f7 476 */
<> 144:ef7eb2e8f9f7 477 HAL_StatusTypeDef HAL_PCCARD_Erase_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t SectorAddress, uint8_t *pStatus)
<> 144:ef7eb2e8f9f7 478 {
<> 144:ef7eb2e8f9f7 479 uint32_t timeout = 0x400;
<> 144:ef7eb2e8f9f7 480 uint8_t status = 0;
<> 144:ef7eb2e8f9f7 481
<> 144:ef7eb2e8f9f7 482 /* Process Locked */
<> 144:ef7eb2e8f9f7 483 __HAL_LOCK(hpccard);
<> 144:ef7eb2e8f9f7 484
<> 144:ef7eb2e8f9f7 485 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 486 if(hpccard->State == HAL_PCCARD_STATE_BUSY)
<> 144:ef7eb2e8f9f7 487 {
<> 144:ef7eb2e8f9f7 488 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 489 }
<> 144:ef7eb2e8f9f7 490
<> 144:ef7eb2e8f9f7 491 /* Update the PCCARD controller state */
<> 144:ef7eb2e8f9f7 492 hpccard->State = HAL_PCCARD_STATE_BUSY;
<> 144:ef7eb2e8f9f7 493
<> 144:ef7eb2e8f9f7 494 /* Initialize CF status */
<> 144:ef7eb2e8f9f7 495 *pStatus = PCCARD_READY;
<> 144:ef7eb2e8f9f7 496
<> 144:ef7eb2e8f9f7 497 /* Set the parameters to write a sector */
<> 144:ef7eb2e8f9f7 498 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_LOW) = 0x00;
<> 144:ef7eb2e8f9f7 499 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = 0x00;
<> 144:ef7eb2e8f9f7 500 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_NUMBER) = SectorAddress;
<> 144:ef7eb2e8f9f7 501 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = 0x01;
<> 144:ef7eb2e8f9f7 502 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CARD_HEAD) = 0xA0;
<> 144:ef7eb2e8f9f7 503 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = ATA_ERASE_SECTOR_CMD;
<> 144:ef7eb2e8f9f7 504
<> 144:ef7eb2e8f9f7 505 /* wait till the CF is ready */
<> 144:ef7eb2e8f9f7 506 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
<> 144:ef7eb2e8f9f7 507
<> 144:ef7eb2e8f9f7 508 while((status != PCCARD_STATUS_WRITE_OK) && timeout)
<> 144:ef7eb2e8f9f7 509 {
<> 144:ef7eb2e8f9f7 510 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
<> 144:ef7eb2e8f9f7 511 timeout--;
<> 144:ef7eb2e8f9f7 512 }
<> 144:ef7eb2e8f9f7 513
<> 144:ef7eb2e8f9f7 514 if(timeout == 0)
<> 144:ef7eb2e8f9f7 515 {
<> 144:ef7eb2e8f9f7 516 *pStatus = PCCARD_TIMEOUT_ERROR;
<> 144:ef7eb2e8f9f7 517 }
<> 144:ef7eb2e8f9f7 518
<> 144:ef7eb2e8f9f7 519 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 520 hpccard->State = HAL_PCCARD_STATE_READY;
<> 144:ef7eb2e8f9f7 521
<> 144:ef7eb2e8f9f7 522 /* Process unlocked */
<> 144:ef7eb2e8f9f7 523 __HAL_UNLOCK(hpccard);
<> 144:ef7eb2e8f9f7 524
<> 144:ef7eb2e8f9f7 525 return HAL_OK;
<> 144:ef7eb2e8f9f7 526 }
<> 144:ef7eb2e8f9f7 527
<> 144:ef7eb2e8f9f7 528 /**
<> 144:ef7eb2e8f9f7 529 * @brief Reset the PCCARD memory
<> 144:ef7eb2e8f9f7 530 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 531 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 532 * @retval HAL status
<> 144:ef7eb2e8f9f7 533 */
<> 144:ef7eb2e8f9f7 534 HAL_StatusTypeDef HAL_PCCARD_Reset(PCCARD_HandleTypeDef *hpccard)
<> 144:ef7eb2e8f9f7 535 {
<> 144:ef7eb2e8f9f7 536 /* Process Locked */
<> 144:ef7eb2e8f9f7 537 __HAL_LOCK(hpccard);
<> 144:ef7eb2e8f9f7 538
<> 144:ef7eb2e8f9f7 539 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 540 if(hpccard->State == HAL_PCCARD_STATE_BUSY)
<> 144:ef7eb2e8f9f7 541 {
<> 144:ef7eb2e8f9f7 542 return HAL_BUSY;
<> 144:ef7eb2e8f9f7 543 }
<> 144:ef7eb2e8f9f7 544
<> 144:ef7eb2e8f9f7 545 /* Provide an SW reset and Read and verify the:
<> 144:ef7eb2e8f9f7 546 - CF Configuration Option Register at address 0x98000200 --> 0x80
<> 144:ef7eb2e8f9f7 547 - Card Configuration and Status Register at address 0x98000202 --> 0x00
<> 144:ef7eb2e8f9f7 548 - Pin Replacement Register at address 0x98000204 --> 0x0C
<> 144:ef7eb2e8f9f7 549 - Socket and Copy Register at address 0x98000206 --> 0x00
<> 144:ef7eb2e8f9f7 550 */
<> 144:ef7eb2e8f9f7 551
<> 144:ef7eb2e8f9f7 552 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 553 hpccard->State = HAL_PCCARD_STATE_BUSY;
<> 144:ef7eb2e8f9f7 554
<> 144:ef7eb2e8f9f7 555 *(__IO uint8_t *)(PCCARD_ATTRIBUTE_SPACE_ADDRESS | ATA_CARD_CONFIGURATION) = 0x01;
<> 144:ef7eb2e8f9f7 556
<> 144:ef7eb2e8f9f7 557 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 558 hpccard->State = HAL_PCCARD_STATE_READY;
<> 144:ef7eb2e8f9f7 559
<> 144:ef7eb2e8f9f7 560 /* Process unlocked */
<> 144:ef7eb2e8f9f7 561 __HAL_UNLOCK(hpccard);
<> 144:ef7eb2e8f9f7 562
<> 144:ef7eb2e8f9f7 563 return HAL_OK;
<> 144:ef7eb2e8f9f7 564 }
<> 144:ef7eb2e8f9f7 565
<> 144:ef7eb2e8f9f7 566 /**
<> 144:ef7eb2e8f9f7 567 * @brief This function handles PCCARD device interrupt request.
<> 144:ef7eb2e8f9f7 568 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 569 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 570 * @retval HAL status
<> 144:ef7eb2e8f9f7 571 */
<> 144:ef7eb2e8f9f7 572 void HAL_PCCARD_IRQHandler(PCCARD_HandleTypeDef *hpccard)
<> 144:ef7eb2e8f9f7 573 {
<> 144:ef7eb2e8f9f7 574 /* Check PCCARD interrupt Rising edge flag */
<> 144:ef7eb2e8f9f7 575 if(__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_RISING_EDGE))
<> 144:ef7eb2e8f9f7 576 {
<> 144:ef7eb2e8f9f7 577 /* PCCARD interrupt callback*/
<> 144:ef7eb2e8f9f7 578 HAL_PCCARD_ITCallback(hpccard);
<> 144:ef7eb2e8f9f7 579
<> 144:ef7eb2e8f9f7 580 /* Clear PCCARD interrupt Rising edge pending bit */
<> 144:ef7eb2e8f9f7 581 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_RISING_EDGE);
<> 144:ef7eb2e8f9f7 582 }
<> 144:ef7eb2e8f9f7 583
<> 144:ef7eb2e8f9f7 584 /* Check PCCARD interrupt Level flag */
<> 144:ef7eb2e8f9f7 585 if(__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_LEVEL))
<> 144:ef7eb2e8f9f7 586 {
<> 144:ef7eb2e8f9f7 587 /* PCCARD interrupt callback*/
<> 144:ef7eb2e8f9f7 588 HAL_PCCARD_ITCallback(hpccard);
<> 144:ef7eb2e8f9f7 589
<> 144:ef7eb2e8f9f7 590 /* Clear PCCARD interrupt Level pending bit */
<> 144:ef7eb2e8f9f7 591 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_LEVEL);
<> 144:ef7eb2e8f9f7 592 }
<> 144:ef7eb2e8f9f7 593
<> 144:ef7eb2e8f9f7 594 /* Check PCCARD interrupt Falling edge flag */
<> 144:ef7eb2e8f9f7 595 if(__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_FALLING_EDGE))
<> 144:ef7eb2e8f9f7 596 {
<> 144:ef7eb2e8f9f7 597 /* PCCARD interrupt callback*/
<> 144:ef7eb2e8f9f7 598 HAL_PCCARD_ITCallback(hpccard);
<> 144:ef7eb2e8f9f7 599
<> 144:ef7eb2e8f9f7 600 /* Clear PCCARD interrupt Falling edge pending bit */
<> 144:ef7eb2e8f9f7 601 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_FALLING_EDGE);
<> 144:ef7eb2e8f9f7 602 }
<> 144:ef7eb2e8f9f7 603
<> 144:ef7eb2e8f9f7 604 /* Check PCCARD interrupt FIFO empty flag */
<> 144:ef7eb2e8f9f7 605 if(__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_FEMPT))
<> 144:ef7eb2e8f9f7 606 {
<> 144:ef7eb2e8f9f7 607 /* PCCARD interrupt callback*/
<> 144:ef7eb2e8f9f7 608 HAL_PCCARD_ITCallback(hpccard);
<> 144:ef7eb2e8f9f7 609
<> 144:ef7eb2e8f9f7 610 /* Clear PCCARD interrupt FIFO empty pending bit */
<> 144:ef7eb2e8f9f7 611 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_FEMPT);
<> 144:ef7eb2e8f9f7 612 }
<> 144:ef7eb2e8f9f7 613
<> 144:ef7eb2e8f9f7 614 }
<> 144:ef7eb2e8f9f7 615
<> 144:ef7eb2e8f9f7 616 /**
<> 144:ef7eb2e8f9f7 617 * @brief PCCARD interrupt feature callback
<> 144:ef7eb2e8f9f7 618 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 619 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 620 * @retval None
<> 144:ef7eb2e8f9f7 621 */
<> 144:ef7eb2e8f9f7 622 __weak void HAL_PCCARD_ITCallback(PCCARD_HandleTypeDef *hpccard)
<> 144:ef7eb2e8f9f7 623 {
<> 144:ef7eb2e8f9f7 624 /* Prevent unused argument(s) compilation warning */
<> 144:ef7eb2e8f9f7 625 UNUSED(hpccard);
<> 144:ef7eb2e8f9f7 626
<> 144:ef7eb2e8f9f7 627 /* NOTE : This function Should not be modified, when the callback is needed,
<> 144:ef7eb2e8f9f7 628 the HAL_PCCARD_ITCallback could be implemented in the user file
<> 144:ef7eb2e8f9f7 629 */
<> 144:ef7eb2e8f9f7 630 }
<> 144:ef7eb2e8f9f7 631
<> 144:ef7eb2e8f9f7 632 /**
<> 144:ef7eb2e8f9f7 633 * @}
<> 144:ef7eb2e8f9f7 634 */
<> 144:ef7eb2e8f9f7 635
<> 144:ef7eb2e8f9f7 636 /** @defgroup PCCARD_Exported_Functions_Group3 Peripheral State functions
<> 144:ef7eb2e8f9f7 637 * @brief Peripheral State functions
<> 144:ef7eb2e8f9f7 638 *
<> 144:ef7eb2e8f9f7 639 @verbatim
<> 144:ef7eb2e8f9f7 640 ==============================================================================
<> 144:ef7eb2e8f9f7 641 ##### PCCARD Peripheral State functions #####
<> 144:ef7eb2e8f9f7 642 ==============================================================================
<> 144:ef7eb2e8f9f7 643 [..]
<> 144:ef7eb2e8f9f7 644 This subsection permits to get in run-time the status of the PCCARD controller
<> 144:ef7eb2e8f9f7 645 and the data flow.
<> 144:ef7eb2e8f9f7 646
<> 144:ef7eb2e8f9f7 647 @endverbatim
<> 144:ef7eb2e8f9f7 648 * @{
<> 144:ef7eb2e8f9f7 649 */
<> 144:ef7eb2e8f9f7 650
<> 144:ef7eb2e8f9f7 651 /**
<> 144:ef7eb2e8f9f7 652 * @brief return the PCCARD controller state
<> 144:ef7eb2e8f9f7 653 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 654 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 655 * @retval HAL state
<> 144:ef7eb2e8f9f7 656 */
<> 144:ef7eb2e8f9f7 657 HAL_PCCARD_StateTypeDef HAL_PCCARD_GetState(PCCARD_HandleTypeDef *hpccard)
<> 144:ef7eb2e8f9f7 658 {
<> 144:ef7eb2e8f9f7 659 return hpccard->State;
<> 144:ef7eb2e8f9f7 660 }
<> 144:ef7eb2e8f9f7 661
<> 144:ef7eb2e8f9f7 662 /**
<> 144:ef7eb2e8f9f7 663 * @brief Get the compact flash memory status
<> 144:ef7eb2e8f9f7 664 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 665 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 666 * @retval New status of the CF operation. This parameter can be:
<> 144:ef7eb2e8f9f7 667 * - CompactFlash_TIMEOUT_ERROR: when the previous operation generate
<> 144:ef7eb2e8f9f7 668 * a Timeout error
<> 144:ef7eb2e8f9f7 669 * - CompactFlash_READY: when memory is ready for the next operation
<> 144:ef7eb2e8f9f7 670 *
<> 144:ef7eb2e8f9f7 671 */
<> 144:ef7eb2e8f9f7 672 HAL_PCCARD_StatusTypeDef HAL_PCCARD_GetStatus(PCCARD_HandleTypeDef *hpccard)
<> 144:ef7eb2e8f9f7 673 {
<> 144:ef7eb2e8f9f7 674 uint32_t timeout = PCCARD_TIMEOUT_STATUS, status_cf = 0;
<> 144:ef7eb2e8f9f7 675
<> 144:ef7eb2e8f9f7 676 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 677 if(hpccard->State == HAL_PCCARD_STATE_BUSY)
<> 144:ef7eb2e8f9f7 678 {
<> 144:ef7eb2e8f9f7 679 return HAL_PCCARD_STATUS_ONGOING;
<> 144:ef7eb2e8f9f7 680 }
<> 144:ef7eb2e8f9f7 681
<> 144:ef7eb2e8f9f7 682 status_cf = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
<> 144:ef7eb2e8f9f7 683
<> 144:ef7eb2e8f9f7 684 while((status_cf == PCCARD_BUSY) && timeout)
<> 144:ef7eb2e8f9f7 685 {
<> 144:ef7eb2e8f9f7 686 status_cf = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
<> 144:ef7eb2e8f9f7 687 timeout--;
<> 144:ef7eb2e8f9f7 688 }
<> 144:ef7eb2e8f9f7 689
<> 144:ef7eb2e8f9f7 690 if(timeout == 0)
<> 144:ef7eb2e8f9f7 691 {
<> 144:ef7eb2e8f9f7 692 status_cf = PCCARD_TIMEOUT_ERROR;
<> 144:ef7eb2e8f9f7 693 }
<> 144:ef7eb2e8f9f7 694
<> 144:ef7eb2e8f9f7 695 /* Return the operation status */
<> 144:ef7eb2e8f9f7 696 return (HAL_PCCARD_StatusTypeDef) status_cf;
<> 144:ef7eb2e8f9f7 697 }
<> 144:ef7eb2e8f9f7 698
<> 144:ef7eb2e8f9f7 699 /**
<> 144:ef7eb2e8f9f7 700 * @brief Reads the Compact Flash memory status using the Read status command
<> 144:ef7eb2e8f9f7 701 * @param hpccard: pointer to a PCCARD_HandleTypeDef structure that contains
<> 144:ef7eb2e8f9f7 702 * the configuration information for PCCARD module.
<> 144:ef7eb2e8f9f7 703 * @retval The status of the Compact Flash memory. This parameter can be:
<> 144:ef7eb2e8f9f7 704 * - CompactFlash_BUSY: when memory is busy
<> 144:ef7eb2e8f9f7 705 * - CompactFlash_READY: when memory is ready for the next operation
<> 144:ef7eb2e8f9f7 706 * - CompactFlash_ERROR: when the previous operation gererates error
<> 144:ef7eb2e8f9f7 707 */
<> 144:ef7eb2e8f9f7 708 HAL_PCCARD_StatusTypeDef HAL_PCCARD_ReadStatus(PCCARD_HandleTypeDef *hpccard)
<> 144:ef7eb2e8f9f7 709 {
<> 144:ef7eb2e8f9f7 710 uint8_t data = 0, status_cf = PCCARD_BUSY;
<> 144:ef7eb2e8f9f7 711
<> 144:ef7eb2e8f9f7 712 /* Check the PCCARD controller state */
<> 144:ef7eb2e8f9f7 713 if(hpccard->State == HAL_PCCARD_STATE_BUSY)
<> 144:ef7eb2e8f9f7 714 {
<> 144:ef7eb2e8f9f7 715 return HAL_PCCARD_STATUS_ONGOING;
<> 144:ef7eb2e8f9f7 716 }
<> 144:ef7eb2e8f9f7 717
<> 144:ef7eb2e8f9f7 718 /* Read status operation */
<> 144:ef7eb2e8f9f7 719 data = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
<> 144:ef7eb2e8f9f7 720
<> 144:ef7eb2e8f9f7 721 if((data & PCCARD_TIMEOUT_ERROR) == PCCARD_TIMEOUT_ERROR)
<> 144:ef7eb2e8f9f7 722 {
<> 144:ef7eb2e8f9f7 723 status_cf = PCCARD_TIMEOUT_ERROR;
<> 144:ef7eb2e8f9f7 724 }
<> 144:ef7eb2e8f9f7 725 else if((data & PCCARD_READY) == PCCARD_READY)
<> 144:ef7eb2e8f9f7 726 {
<> 144:ef7eb2e8f9f7 727 status_cf = PCCARD_READY;
<> 144:ef7eb2e8f9f7 728 }
<> 144:ef7eb2e8f9f7 729
<> 144:ef7eb2e8f9f7 730 return (HAL_PCCARD_StatusTypeDef) status_cf;
<> 144:ef7eb2e8f9f7 731 }
<> 144:ef7eb2e8f9f7 732
<> 144:ef7eb2e8f9f7 733 /**
<> 144:ef7eb2e8f9f7 734 * @}
<> 144:ef7eb2e8f9f7 735 */
<> 144:ef7eb2e8f9f7 736
<> 144:ef7eb2e8f9f7 737 /**
<> 144:ef7eb2e8f9f7 738 * @}
<> 144:ef7eb2e8f9f7 739 */
<> 144:ef7eb2e8f9f7 740 /**
<> 144:ef7eb2e8f9f7 741 * @}
<> 144:ef7eb2e8f9f7 742 */
<> 144:ef7eb2e8f9f7 743
<> 144:ef7eb2e8f9f7 744 #endif /* HAL_PCCARD_MODULE_ENABLED */
<> 144:ef7eb2e8f9f7 745
<> 144:ef7eb2e8f9f7 746 /**
<> 144:ef7eb2e8f9f7 747 * @}
<> 144:ef7eb2e8f9f7 748 */
<> 144:ef7eb2e8f9f7 749 #endif /* STM32F302xE || STM32F303xE || STM32F398xx */
<> 144:ef7eb2e8f9f7 750
<> 144:ef7eb2e8f9f7 751 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/