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, FMC_NAND_PCC_TimingTypeDef *IOSpaceTiming)
174 if (hpccard->State == HAL_PCCARD_STATE_RESET)
178#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
179 if (hpccard->MspInitCallback == NULL)
181 hpccard->MspInitCallback = HAL_PCCARD_MspInit;
183 hpccard->ItCallback = HAL_PCCARD_ITCallback;
186 hpccard->MspInitCallback(hpccard);
189 HAL_PCCARD_MspInit(hpccard);
194 hpccard->State = HAL_PCCARD_STATE_BUSY;
197 FMC_PCCARD_Init(hpccard->Instance, &(hpccard->Init));
200 FMC_PCCARD_CommonSpace_Timing_Init(hpccard->Instance, ComSpaceTiming);
203 FMC_PCCARD_AttributeSpace_Timing_Init(hpccard->Instance, AttSpaceTiming);
206 FMC_PCCARD_IOSpace_Timing_Init(hpccard->Instance, IOSpaceTiming);
209 __FMC_PCCARD_ENABLE(hpccard->Instance);
212 hpccard->State = HAL_PCCARD_STATE_READY;
226#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
227 if (hpccard->MspDeInitCallback == NULL)
229 hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit;
233 hpccard->MspDeInitCallback(hpccard);
236 HAL_PCCARD_MspDeInit(hpccard);
240 FMC_PCCARD_DeInit(hpccard->Instance);
243 hpccard->State = HAL_PCCARD_STATE_RESET;
257__weak
void HAL_PCCARD_MspInit(PCCARD_HandleTypeDef *hpccard)
272__weak
void HAL_PCCARD_MspDeInit(PCCARD_HandleTypeDef *hpccard)
308HAL_StatusTypeDef HAL_PCCARD_Read_ID(PCCARD_HandleTypeDef *hpccard, uint8_t CompactFlash_ID[], uint8_t *pStatus)
310 uint32_t timeout = PCCARD_TIMEOUT_READ_ID, index = 0U;
317 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
323 hpccard->State = HAL_PCCARD_STATE_BUSY;
326 *pStatus = PCCARD_READY;
329 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0xECEC;
335 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
338 }
while ((status != PCCARD_STATUS_OK) && timeout);
342 *pStatus = PCCARD_TIMEOUT_ERROR;
347 for (index = 0U; index < 16U; index++)
349 CompactFlash_ID[index] = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_DATA);
354 hpccard->State = HAL_PCCARD_STATE_READY;
371HAL_StatusTypeDef HAL_PCCARD_Read_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress,
374 uint32_t timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR, index = 0U;
381 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
387 hpccard->State = HAL_PCCARD_STATE_BUSY;
390 *pStatus = PCCARD_READY;
393 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x0000;
394 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100) | ((uint16_t)SectorAddress);
395 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0xE4A0;
400 status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
402 }
while ((status == 0x80U) && timeout);
406 *pStatus = PCCARD_TIMEOUT_ERROR;
409 timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR;
414 status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
416 }
while ((status != PCCARD_STATUS_OK) && timeout);
420 *pStatus = PCCARD_TIMEOUT_ERROR;
424 for (; index < PCCARD_SECTOR_SIZE; index++)
426 *(uint16_t *)pBuffer++ = *(uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR);
430 hpccard->State = HAL_PCCARD_STATE_READY;
448HAL_StatusTypeDef HAL_PCCARD_Write_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress,
451 uint32_t timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR, index = 0U;
458 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
464 hpccard->State = HAL_PCCARD_STATE_BUSY;
467 *pStatus = PCCARD_READY;
470 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = (uint16_t)0x0000;
471 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = ((uint16_t)0x0100) | ((uint16_t)SectorAddress);
472 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0x30A0;
477 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
479 }
while ((status != PCCARD_STATUS_OK) && timeout);
483 *pStatus = PCCARD_TIMEOUT_ERROR;
487 for (; index < PCCARD_SECTOR_SIZE; index++)
489 *(uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR) = *(uint16_t *)pBuffer++;
495 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
497 }
while ((status != PCCARD_STATUS_WRITE_OK) && timeout);
501 *pStatus = PCCARD_TIMEOUT_ERROR;
505 hpccard->State = HAL_PCCARD_STATE_READY;
522HAL_StatusTypeDef HAL_PCCARD_Erase_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t SectorAddress, uint8_t *pStatus)
524 uint32_t timeout = PCCARD_TIMEOUT_ERASE_SECTOR;
531 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
537 hpccard->State = HAL_PCCARD_STATE_BUSY;
540 *pStatus = PCCARD_READY;
543 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_LOW) = 0x00;
544 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CYLINDER_HIGH) = 0x00;
545 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_NUMBER) = SectorAddress;
546 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_SECTOR_COUNT) = 0x01;
547 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_CARD_HEAD) = 0xA0;
548 *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = ATA_ERASE_SECTOR_CMD;
551 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
553 while ((status != PCCARD_STATUS_WRITE_OK) && timeout)
555 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
561 *pStatus = PCCARD_TIMEOUT_ERROR;
565 hpccard->State = HAL_PCCARD_STATE_READY;
585 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
598 hpccard->State = HAL_PCCARD_STATE_BUSY;
600 *(__IO uint8_t *)(PCCARD_ATTRIBUTE_SPACE_ADDRESS | ATA_CARD_CONFIGURATION) = 0x01;
603 hpccard->State = HAL_PCCARD_STATE_READY;
617void HAL_PCCARD_IRQHandler(PCCARD_HandleTypeDef *hpccard)
620 if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_RISING_EDGE))
623#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
624 hpccard->ItCallback(hpccard);
626 HAL_PCCARD_ITCallback(hpccard);
630 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_RISING_EDGE);
634 if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_LEVEL))
637#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
638 hpccard->ItCallback(hpccard);
640 HAL_PCCARD_ITCallback(hpccard);
644 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_LEVEL);
648 if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_FALLING_EDGE))
651#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
652 hpccard->ItCallback(hpccard);
654 HAL_PCCARD_ITCallback(hpccard);
658 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_FALLING_EDGE);
662 if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_FEMPT))
665#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
666 hpccard->ItCallback(hpccard);
668 HAL_PCCARD_ITCallback(hpccard);
672 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_FEMPT);
682__weak
void HAL_PCCARD_ITCallback(PCCARD_HandleTypeDef *hpccard)
691#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
704HAL_StatusTypeDef HAL_PCCARD_RegisterCallback(PCCARD_HandleTypeDef *hpccard, HAL_PCCARD_CallbackIDTypeDef CallbackId,
705 pPCCARD_CallbackTypeDef pCallback)
709 if (pCallback == NULL)
717 if (hpccard->State == HAL_PCCARD_STATE_READY)
721 case HAL_PCCARD_MSP_INIT_CB_ID :
722 hpccard->MspInitCallback = pCallback;
724 case HAL_PCCARD_MSP_DEINIT_CB_ID :
725 hpccard->MspDeInitCallback = pCallback;
727 case HAL_PCCARD_IT_CB_ID :
728 hpccard->ItCallback = pCallback;
736 else if (hpccard->State == HAL_PCCARD_STATE_RESET)
740 case HAL_PCCARD_MSP_INIT_CB_ID :
741 hpccard->MspInitCallback = pCallback;
743 case HAL_PCCARD_MSP_DEINIT_CB_ID :
744 hpccard->MspDeInitCallback = pCallback;
774HAL_StatusTypeDef HAL_PCCARD_UnRegisterCallback(PCCARD_HandleTypeDef *hpccard, HAL_PCCARD_CallbackIDTypeDef CallbackId)
781 if (hpccard->State == HAL_PCCARD_STATE_READY)
785 case HAL_PCCARD_MSP_INIT_CB_ID :
786 hpccard->MspInitCallback = HAL_PCCARD_MspInit;
788 case HAL_PCCARD_MSP_DEINIT_CB_ID :
789 hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit;
791 case HAL_PCCARD_IT_CB_ID :
792 hpccard->ItCallback = HAL_PCCARD_ITCallback;
800 else if (hpccard->State == HAL_PCCARD_STATE_RESET)
804 case HAL_PCCARD_MSP_INIT_CB_ID :
805 hpccard->MspInitCallback = HAL_PCCARD_MspInit;
807 case HAL_PCCARD_MSP_DEINIT_CB_ID :
808 hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit;
853HAL_PCCARD_StateTypeDef HAL_PCCARD_GetState(PCCARD_HandleTypeDef *hpccard)
855 return hpccard->State;
867HAL_PCCARD_StatusTypeDef HAL_PCCARD_GetStatus(PCCARD_HandleTypeDef *hpccard)
869 uint32_t timeout = PCCARD_TIMEOUT_STATUS, status_pccard = 0U;
872 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
874 return HAL_PCCARD_STATUS_ONGOING;
877 status_pccard = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
879 while ((status_pccard == PCCARD_BUSY) && timeout)
881 status_pccard = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
887 status_pccard = PCCARD_TIMEOUT_ERROR;
891 return (HAL_PCCARD_StatusTypeDef) status_pccard;
903HAL_PCCARD_StatusTypeDef HAL_PCCARD_ReadStatus(PCCARD_HandleTypeDef *hpccard)
905 uint8_t data = 0U, status_pccard = PCCARD_BUSY;
908 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
910 return HAL_PCCARD_STATUS_ONGOING;
914 data = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
916 if ((data & PCCARD_TIMEOUT_ERROR) == PCCARD_TIMEOUT_ERROR)
918 status_pccard = PCCARD_TIMEOUT_ERROR;
920 else if ((data & PCCARD_READY) == PCCARD_READY)
922 status_pccard = PCCARD_READY;
925 return (HAL_PCCARD_StatusTypeDef) status_pccard;
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__)