104#if defined(FMC_Bank4) || defined(FSMC_Bank4)
110#ifdef HAL_PCCARD_MODULE_ENABLED
122#define PCCARD_TIMEOUT_READ_ID 0x0000FFFFU
123#define PCCARD_TIMEOUT_READ_WRITE_SECTOR 0x0000FFFFU
124#define PCCARD_TIMEOUT_ERASE_SECTOR 0x00000400U
125#define PCCARD_TIMEOUT_STATUS 0x01000000U
127#define PCCARD_STATUS_OK (uint8_t)0x58
128#define PCCARD_STATUS_WRITE_OK (uint8_t)0x50
165HAL_StatusTypeDef HAL_PCCARD_Init(PCCARD_HandleTypeDef *hpccard, FMC_NAND_PCC_TimingTypeDef *ComSpaceTiming,
166 FMC_NAND_PCC_TimingTypeDef *AttSpaceTiming,
167 FMC_NAND_PCC_TimingTypeDef *IOSpaceTiming)
175 if (hpccard->State == HAL_PCCARD_STATE_RESET)
179#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
180 if (hpccard->MspInitCallback == NULL)
182 hpccard->MspInitCallback = HAL_PCCARD_MspInit;
184 hpccard->ItCallback = HAL_PCCARD_ITCallback;
187 hpccard->MspInitCallback(hpccard);
190 HAL_PCCARD_MspInit(hpccard);
195 hpccard->State = HAL_PCCARD_STATE_BUSY;
198 FMC_PCCARD_Init(hpccard->Instance, &(hpccard->Init));
201 FMC_PCCARD_CommonSpace_Timing_Init(hpccard->Instance, ComSpaceTiming);
204 FMC_PCCARD_AttributeSpace_Timing_Init(hpccard->Instance, AttSpaceTiming);
207 FMC_PCCARD_IOSpace_Timing_Init(hpccard->Instance, IOSpaceTiming);
210 __FMC_PCCARD_ENABLE(hpccard->Instance);
213 hpccard->State = HAL_PCCARD_STATE_READY;
227#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
228 if (hpccard->MspDeInitCallback == NULL)
230 hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit;
234 hpccard->MspDeInitCallback(hpccard);
237 HAL_PCCARD_MspDeInit(hpccard);
241 FMC_PCCARD_DeInit(hpccard->Instance);
244 hpccard->State = HAL_PCCARD_STATE_RESET;
258__weak
void HAL_PCCARD_MspInit(PCCARD_HandleTypeDef *hpccard)
273__weak
void HAL_PCCARD_MspDeInit(PCCARD_HandleTypeDef *hpccard)
309HAL_StatusTypeDef HAL_PCCARD_Read_ID(PCCARD_HandleTypeDef *hpccard, uint8_t CompactFlash_ID[], uint8_t *pStatus)
311 uint32_t timeout = 0U;
319 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
325 timeout = PCCARD_TIMEOUT_READ_ID;
328 hpccard->State = HAL_PCCARD_STATE_BUSY;
331 *pStatus = PCCARD_READY;
334 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0xECEC;
340 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
343 }
while ((status != PCCARD_STATUS_OK) && timeout);
347 *pStatus = PCCARD_TIMEOUT_ERROR;
352 for (index = 0U; index < 16U; index++)
354 CompactFlash_ID[index] = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_DATA);
359 hpccard->State = HAL_PCCARD_STATE_READY;
376HAL_StatusTypeDef HAL_PCCARD_Read_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress,
379 uint32_t timeout = 0U;
387 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
393 timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR;
396 hpccard->State = HAL_PCCARD_STATE_BUSY;
399 *pStatus = PCCARD_READY;
402 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x0000;
403 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100) | ((uint16_t)SectorAddress);
404 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0xE4A0;
409 status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
411 }
while ((status == 0x80U) && timeout);
415 *pStatus = PCCARD_TIMEOUT_ERROR;
418 timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR;
423 status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
425 }
while ((status != PCCARD_STATUS_OK) && timeout);
429 *pStatus = PCCARD_TIMEOUT_ERROR;
433 for (; index < PCCARD_SECTOR_SIZE; index++)
435 *(uint16_t *)pBuffer++ = *(uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR);
439 hpccard->State = HAL_PCCARD_STATE_READY;
457HAL_StatusTypeDef HAL_PCCARD_Write_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress,
460 uint32_t timeout = 0U;
468 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
474 timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR;
477 hpccard->State = HAL_PCCARD_STATE_BUSY;
480 *pStatus = PCCARD_READY;
483 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x0000;
484 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100) | ((uint16_t)SectorAddress);
485 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0x30A0;
490 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
492 }
while ((status != PCCARD_STATUS_OK) && timeout);
496 *pStatus = PCCARD_TIMEOUT_ERROR;
500 for (; index < PCCARD_SECTOR_SIZE; index++)
502 *(uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR) = *(uint16_t *)pBuffer++;
508 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
510 }
while ((status != PCCARD_STATUS_WRITE_OK) && timeout);
514 *pStatus = PCCARD_TIMEOUT_ERROR;
518 hpccard->State = HAL_PCCARD_STATE_READY;
535HAL_StatusTypeDef HAL_PCCARD_Erase_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t SectorAddress, uint8_t *pStatus)
537 uint32_t timeout = PCCARD_TIMEOUT_ERASE_SECTOR;
544 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
550 hpccard->State = HAL_PCCARD_STATE_BUSY;
553 *pStatus = PCCARD_READY;
556 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_LOW) = 0x00;
557 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = 0x00;
558 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_NUMBER) = SectorAddress;
559 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = 0x01;
560 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CARD_HEAD) = 0xA0;
561 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = ATA_ERASE_SECTOR_CMD;
564 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
566 while ((status != PCCARD_STATUS_WRITE_OK) && timeout)
568 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
574 *pStatus = PCCARD_TIMEOUT_ERROR;
578 hpccard->State = HAL_PCCARD_STATE_READY;
598 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
611 hpccard->State = HAL_PCCARD_STATE_BUSY;
613 *(__IO uint8_t *)(PCCARD_ATTRIBUTE_SPACE_ADDRESS | ATA_CARD_CONFIGURATION) = 0x01;
616 hpccard->State = HAL_PCCARD_STATE_READY;
630void HAL_PCCARD_IRQHandler(PCCARD_HandleTypeDef *hpccard)
636#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
637 hpccard->ItCallback(hpccard);
639 HAL_PCCARD_ITCallback(hpccard);
650#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
651 hpccard->ItCallback(hpccard);
653 HAL_PCCARD_ITCallback(hpccard);
664#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
665 hpccard->ItCallback(hpccard);
667 HAL_PCCARD_ITCallback(hpccard);
678#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
679 hpccard->ItCallback(hpccard);
681 HAL_PCCARD_ITCallback(hpccard);
695__weak
void HAL_PCCARD_ITCallback(PCCARD_HandleTypeDef *hpccard)
704#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
717HAL_StatusTypeDef HAL_PCCARD_RegisterCallback(PCCARD_HandleTypeDef *hpccard, HAL_PCCARD_CallbackIDTypeDef CallbackId,
718 pPCCARD_CallbackTypeDef pCallback)
722 if (pCallback == NULL)
730 if (hpccard->State == HAL_PCCARD_STATE_READY)
734 case HAL_PCCARD_MSP_INIT_CB_ID :
735 hpccard->MspInitCallback = pCallback;
737 case HAL_PCCARD_MSP_DEINIT_CB_ID :
738 hpccard->MspDeInitCallback = pCallback;
740 case HAL_PCCARD_IT_CB_ID :
741 hpccard->ItCallback = pCallback;
749 else if (hpccard->State == HAL_PCCARD_STATE_RESET)
753 case HAL_PCCARD_MSP_INIT_CB_ID :
754 hpccard->MspInitCallback = pCallback;
756 case HAL_PCCARD_MSP_DEINIT_CB_ID :
757 hpccard->MspDeInitCallback = pCallback;
787HAL_StatusTypeDef HAL_PCCARD_UnRegisterCallback(PCCARD_HandleTypeDef *hpccard, HAL_PCCARD_CallbackIDTypeDef CallbackId)
794 if (hpccard->State == HAL_PCCARD_STATE_READY)
798 case HAL_PCCARD_MSP_INIT_CB_ID :
799 hpccard->MspInitCallback = HAL_PCCARD_MspInit;
801 case HAL_PCCARD_MSP_DEINIT_CB_ID :
802 hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit;
804 case HAL_PCCARD_IT_CB_ID :
805 hpccard->ItCallback = HAL_PCCARD_ITCallback;
813 else if (hpccard->State == HAL_PCCARD_STATE_RESET)
817 case HAL_PCCARD_MSP_INIT_CB_ID :
818 hpccard->MspInitCallback = HAL_PCCARD_MspInit;
820 case HAL_PCCARD_MSP_DEINIT_CB_ID :
821 hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit;
866HAL_PCCARD_StateTypeDef HAL_PCCARD_GetState(PCCARD_HandleTypeDef *hpccard)
868 return hpccard->State;
880HAL_PCCARD_StatusTypeDef HAL_PCCARD_GetStatus(PCCARD_HandleTypeDef *hpccard)
882 uint32_t timeout = PCCARD_TIMEOUT_STATUS;
883 uint32_t status_pccard = 0U;
886 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
888 return HAL_PCCARD_STATUS_ONGOING;
891 status_pccard = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
893 while ((status_pccard == PCCARD_BUSY) && timeout)
895 status_pccard = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
901 status_pccard = PCCARD_TIMEOUT_ERROR;
905 return (HAL_PCCARD_StatusTypeDef) status_pccard;
917HAL_PCCARD_StatusTypeDef HAL_PCCARD_ReadStatus(PCCARD_HandleTypeDef *hpccard)
920 uint8_t status_pccard = PCCARD_BUSY;
923 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
925 return HAL_PCCARD_STATUS_ONGOING;
929 data = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
931 if ((data & PCCARD_TIMEOUT_ERROR) == PCCARD_TIMEOUT_ERROR)
933 status_pccard = PCCARD_TIMEOUT_ERROR;
935 else if ((data & PCCARD_READY) == PCCARD_READY)
937 status_pccard = PCCARD_READY;
940 return (HAL_PCCARD_StatusTypeDef) status_pccard;
#define FMC_FLAG_RISING_EDGE
#define FMC_FLAG_FALLING_EDGE
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition.
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)