STM32F4xx HAL Driver master
STM32CubeF4 HAL / LL Drivers API Reference
Loading...
Searching...
No Matches
stm32f4xx_hal_pccard.c
Go to the documentation of this file.
1
100
101/* Includes ------------------------------------------------------------------*/
102#include "stm32f4xx_hal.h"
103
104#if defined(FMC_Bank4) || defined(FSMC_Bank4)
105
109
110#ifdef HAL_PCCARD_MODULE_ENABLED
111
116/* Private typedef -----------------------------------------------------------*/
117/* Private define ------------------------------------------------------------*/
118
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
126
127#define PCCARD_STATUS_OK (uint8_t)0x58
128#define PCCARD_STATUS_WRITE_OK (uint8_t)0x50
132
133/* Private macro -------------------------------------------------------------*/
134/* Private variables ---------------------------------------------------------*/
135/* Private function ----------------------------------------------------------*/
136/* Exported functions --------------------------------------------------------*/
140
155
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)
168{
169 /* Check the PCCARD controller state */
170 if (hpccard == NULL)
171 {
172 return HAL_ERROR;
173 }
174
175 if (hpccard->State == HAL_PCCARD_STATE_RESET)
176 {
177 /* Allocate lock resource and initialize it */
178 hpccard->Lock = HAL_UNLOCKED;
179#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
180 if (hpccard->MspInitCallback == NULL)
181 {
182 hpccard->MspInitCallback = HAL_PCCARD_MspInit;
183 }
184 hpccard->ItCallback = HAL_PCCARD_ITCallback;
185
186 /* Init the low level hardware */
187 hpccard->MspInitCallback(hpccard);
188#else
189 /* Initialize the low level hardware (MSP) */
190 HAL_PCCARD_MspInit(hpccard);
191#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */
192 }
193
194 /* Initialize the PCCARD state */
195 hpccard->State = HAL_PCCARD_STATE_BUSY;
196
197 /* Initialize PCCARD control Interface */
198 FMC_PCCARD_Init(hpccard->Instance, &(hpccard->Init));
199
200 /* Init PCCARD common space timing Interface */
201 FMC_PCCARD_CommonSpace_Timing_Init(hpccard->Instance, ComSpaceTiming);
202
203 /* Init PCCARD attribute space timing Interface */
204 FMC_PCCARD_AttributeSpace_Timing_Init(hpccard->Instance, AttSpaceTiming);
205
206 /* Init PCCARD IO space timing Interface */
207 FMC_PCCARD_IOSpace_Timing_Init(hpccard->Instance, IOSpaceTiming);
208
209 /* Enable the PCCARD device */
210 __FMC_PCCARD_ENABLE(hpccard->Instance);
211
212 /* Update the PCCARD state */
213 hpccard->State = HAL_PCCARD_STATE_READY;
214
215 return HAL_OK;
216
217}
218
225HAL_StatusTypeDef HAL_PCCARD_DeInit(PCCARD_HandleTypeDef *hpccard)
226{
227#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
228 if (hpccard->MspDeInitCallback == NULL)
229 {
230 hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit;
231 }
232
233 /* DeInit the low level hardware */
234 hpccard->MspDeInitCallback(hpccard);
235#else
236 /* De-Initialize the low level hardware (MSP) */
237 HAL_PCCARD_MspDeInit(hpccard);
238#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */
239
240 /* Configure the PCCARD registers with their reset values */
241 FMC_PCCARD_DeInit(hpccard->Instance);
242
243 /* Update the PCCARD controller state */
244 hpccard->State = HAL_PCCARD_STATE_RESET;
245
246 /* Release Lock */
247 __HAL_UNLOCK(hpccard);
248
249 return HAL_OK;
250}
251
258__weak void HAL_PCCARD_MspInit(PCCARD_HandleTypeDef *hpccard)
259{
260 /* Prevent unused argument(s) compilation warning */
261 UNUSED(hpccard);
262 /* NOTE : This function Should not be modified, when the callback is needed,
263 the HAL_PCCARD_MspInit could be implemented in the user file
264 */
265}
266
273__weak void HAL_PCCARD_MspDeInit(PCCARD_HandleTypeDef *hpccard)
274{
275 /* Prevent unused argument(s) compilation warning */
276 UNUSED(hpccard);
277 /* NOTE : This function Should not be modified, when the callback is needed,
278 the HAL_PCCARD_MspDeInit could be implemented in the user file
279 */
280}
281
285
299
309HAL_StatusTypeDef HAL_PCCARD_Read_ID(PCCARD_HandleTypeDef *hpccard, uint8_t CompactFlash_ID[], uint8_t *pStatus)
310{
311 uint32_t timeout = 0U;
312 uint32_t index = 0U;
313 uint8_t status = 0U;
314
315 /* Process Locked */
316 __HAL_LOCK(hpccard);
317
318 /* Check the PCCARD controller state */
319 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
320 {
321 return HAL_BUSY;
322 }
323
324 /* Initialize timeout value */
325 timeout = PCCARD_TIMEOUT_READ_ID;
326
327 /* Update the PCCARD controller state */
328 hpccard->State = HAL_PCCARD_STATE_BUSY;
329
330 /* Initialize the PCCARD status */
331 *pStatus = PCCARD_READY;
332
333 /* Send the Identify Command */
334 *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD) = (uint16_t)0xECEC;
335
336 /* Read PCCARD IDs and timeout treatment */
337 do
338 {
339 /* Read the PCCARD status */
340 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
341
342 timeout--;
343 } while ((status != PCCARD_STATUS_OK) && timeout);
344
345 if (timeout == 0U)
346 {
347 *pStatus = PCCARD_TIMEOUT_ERROR;
348 }
349 else
350 {
351 /* Read PCCARD ID bytes */
352 for (index = 0U; index < 16U; index++)
353 {
354 CompactFlash_ID[index] = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_DATA);
355 }
356 }
357
358 /* Update the PCCARD controller state */
359 hpccard->State = HAL_PCCARD_STATE_READY;
360
361 /* Process unlocked */
362 __HAL_UNLOCK(hpccard);
363
364 return HAL_OK;
365}
366
376HAL_StatusTypeDef HAL_PCCARD_Read_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress,
377 uint8_t *pStatus)
378{
379 uint32_t timeout = 0U;
380 uint32_t index = 0U;
381 uint8_t status = 0U;
382
383 /* Process Locked */
384 __HAL_LOCK(hpccard);
385
386 /* Check the PCCARD controller state */
387 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
388 {
389 return HAL_BUSY;
390 }
391
392 /* Initialize timeout value */
393 timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR;
394
395 /* Update the PCCARD controller state */
396 hpccard->State = HAL_PCCARD_STATE_BUSY;
397
398 /* Initialize PCCARD status */
399 *pStatus = PCCARD_READY;
400
401 /* Set the parameters to write a sector */
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;
405
406 do
407 {
408 /* wait till the Status = 0x80 */
409 status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
410 timeout--;
411 } while ((status == 0x80U) && timeout);
412
413 if (timeout == 0U)
414 {
415 *pStatus = PCCARD_TIMEOUT_ERROR;
416 }
417
418 timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR;
419
420 do
421 {
422 /* wait till the Status = PCCARD_STATUS_OK */
423 status = *(__IO uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
424 timeout--;
425 } while ((status != PCCARD_STATUS_OK) && timeout);
426
427 if (timeout == 0U)
428 {
429 *pStatus = PCCARD_TIMEOUT_ERROR;
430 }
431
432 /* Read bytes */
433 for (; index < PCCARD_SECTOR_SIZE; index++)
434 {
435 *(uint16_t *)pBuffer++ = *(uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR);
436 }
437
438 /* Update the PCCARD controller state */
439 hpccard->State = HAL_PCCARD_STATE_READY;
440
441 /* Process unlocked */
442 __HAL_UNLOCK(hpccard);
443
444 return HAL_OK;
445}
446
447
457HAL_StatusTypeDef HAL_PCCARD_Write_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t *pBuffer, uint16_t SectorAddress,
458 uint8_t *pStatus)
459{
460 uint32_t timeout = 0U;
461 uint32_t index = 0U;
462 uint8_t status = 0U;
463
464 /* Process Locked */
465 __HAL_LOCK(hpccard);
466
467 /* Check the PCCARD controller state */
468 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
469 {
470 return HAL_BUSY;
471 }
472
473 /* Initialize timeout value */
474 timeout = PCCARD_TIMEOUT_READ_WRITE_SECTOR;
475
476 /* Update the PCCARD controller state */
477 hpccard->State = HAL_PCCARD_STATE_BUSY;
478
479 /* Initialize PCCARD status */
480 *pStatus = PCCARD_READY;
481
482 /* Set the parameters to write a sector */
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;
486
487 do
488 {
489 /* Wait till the Status = PCCARD_STATUS_OK */
490 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
491 timeout--;
492 } while ((status != PCCARD_STATUS_OK) && timeout);
493
494 if (timeout == 0U)
495 {
496 *pStatus = PCCARD_TIMEOUT_ERROR;
497 }
498
499 /* Write bytes */
500 for (; index < PCCARD_SECTOR_SIZE; index++)
501 {
502 *(uint16_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR) = *(uint16_t *)pBuffer++;
503 }
504
505 do
506 {
507 /* Wait till the Status = PCCARD_STATUS_WRITE_OK */
508 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
509 timeout--;
510 } while ((status != PCCARD_STATUS_WRITE_OK) && timeout);
511
512 if (timeout == 0U)
513 {
514 *pStatus = PCCARD_TIMEOUT_ERROR;
515 }
516
517 /* Update the PCCARD controller state */
518 hpccard->State = HAL_PCCARD_STATE_READY;
519
520 /* Process unlocked */
521 __HAL_UNLOCK(hpccard);
522
523 return HAL_OK;
524}
525
526
535HAL_StatusTypeDef HAL_PCCARD_Erase_Sector(PCCARD_HandleTypeDef *hpccard, uint16_t SectorAddress, uint8_t *pStatus)
536{
537 uint32_t timeout = PCCARD_TIMEOUT_ERASE_SECTOR;
538 uint8_t status = 0U;
539
540 /* Process Locked */
541 __HAL_LOCK(hpccard);
542
543 /* Check the PCCARD controller state */
544 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
545 {
546 return HAL_BUSY;
547 }
548
549 /* Update the PCCARD controller state */
550 hpccard->State = HAL_PCCARD_STATE_BUSY;
551
552 /* Initialize PCCARD status */
553 *pStatus = PCCARD_READY;
554
555 /* Set the parameters to write a sector */
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;
562
563 /* wait till the PCCARD is ready */
564 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
565
566 while ((status != PCCARD_STATUS_WRITE_OK) && timeout)
567 {
568 status = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
569 timeout--;
570 }
571
572 if (timeout == 0U)
573 {
574 *pStatus = PCCARD_TIMEOUT_ERROR;
575 }
576
577 /* Check the PCCARD controller state */
578 hpccard->State = HAL_PCCARD_STATE_READY;
579
580 /* Process unlocked */
581 __HAL_UNLOCK(hpccard);
582
583 return HAL_OK;
584}
585
592HAL_StatusTypeDef HAL_PCCARD_Reset(PCCARD_HandleTypeDef *hpccard)
593{
594 /* Process Locked */
595 __HAL_LOCK(hpccard);
596
597 /* Check the PCCARD controller state */
598 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
599 {
600 return HAL_BUSY;
601 }
602
603 /* Provide a SW reset and Read and verify the:
604 - PCCard Configuration Option Register at address 0x98000200 --> 0x80
605 - Card Configuration and Status Register at address 0x98000202 --> 0x00
606 - Pin Replacement Register at address 0x98000204 --> 0x0C
607 - Socket and Copy Register at address 0x98000206 --> 0x00
608 */
609
610 /* Check the PCCARD controller state */
611 hpccard->State = HAL_PCCARD_STATE_BUSY;
612
613 *(__IO uint8_t *)(PCCARD_ATTRIBUTE_SPACE_ADDRESS | ATA_CARD_CONFIGURATION) = 0x01;
614
615 /* Check the PCCARD controller state */
616 hpccard->State = HAL_PCCARD_STATE_READY;
617
618 /* Process unlocked */
619 __HAL_UNLOCK(hpccard);
620
621 return HAL_OK;
622}
623
630void HAL_PCCARD_IRQHandler(PCCARD_HandleTypeDef *hpccard)
631{
632 /* Check PCCARD interrupt Rising edge flag */
633 if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_RISING_EDGE))
634 {
635 /* PCCARD interrupt callback*/
636#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
637 hpccard->ItCallback(hpccard);
638#else
639 HAL_PCCARD_ITCallback(hpccard);
640#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */
641
642 /* Clear PCCARD interrupt Rising edge pending bit */
643 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_RISING_EDGE);
644 }
645
646 /* Check PCCARD interrupt Level flag */
647 if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_LEVEL))
648 {
649 /* PCCARD interrupt callback*/
650#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
651 hpccard->ItCallback(hpccard);
652#else
653 HAL_PCCARD_ITCallback(hpccard);
654#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */
655
656 /* Clear PCCARD interrupt Level pending bit */
657 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_LEVEL);
658 }
659
660 /* Check PCCARD interrupt Falling edge flag */
661 if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_FALLING_EDGE))
662 {
663 /* PCCARD interrupt callback*/
664#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
665 hpccard->ItCallback(hpccard);
666#else
667 HAL_PCCARD_ITCallback(hpccard);
668#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */
669
670 /* Clear PCCARD interrupt Falling edge pending bit */
671 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_FALLING_EDGE);
672 }
673
674 /* Check PCCARD interrupt FIFO empty flag */
675 if (__FMC_PCCARD_GET_FLAG(hpccard->Instance, FMC_FLAG_FEMPT))
676 {
677 /* PCCARD interrupt callback*/
678#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
679 hpccard->ItCallback(hpccard);
680#else
681 HAL_PCCARD_ITCallback(hpccard);
682#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */
683
684 /* Clear PCCARD interrupt FIFO empty pending bit */
685 __FMC_PCCARD_CLEAR_FLAG(hpccard->Instance, FMC_FLAG_FEMPT);
686 }
687}
688
695__weak void HAL_PCCARD_ITCallback(PCCARD_HandleTypeDef *hpccard)
696{
697 /* Prevent unused argument(s) compilation warning */
698 UNUSED(hpccard);
699 /* NOTE : This function Should not be modified, when the callback is needed,
700 the HAL_PCCARD_ITCallback could be implemented in the user file
701 */
702}
703
704#if (USE_HAL_PCCARD_REGISTER_CALLBACKS == 1)
717HAL_StatusTypeDef HAL_PCCARD_RegisterCallback(PCCARD_HandleTypeDef *hpccard, HAL_PCCARD_CallbackIDTypeDef CallbackId,
718 pPCCARD_CallbackTypeDef pCallback)
719{
720 HAL_StatusTypeDef status = HAL_OK;
721
722 if (pCallback == NULL)
723 {
724 return HAL_ERROR;
725 }
726
727 /* Process locked */
728 __HAL_LOCK(hpccard);
729
730 if (hpccard->State == HAL_PCCARD_STATE_READY)
731 {
732 switch (CallbackId)
733 {
734 case HAL_PCCARD_MSP_INIT_CB_ID :
735 hpccard->MspInitCallback = pCallback;
736 break;
737 case HAL_PCCARD_MSP_DEINIT_CB_ID :
738 hpccard->MspDeInitCallback = pCallback;
739 break;
740 case HAL_PCCARD_IT_CB_ID :
741 hpccard->ItCallback = pCallback;
742 break;
743 default :
744 /* update return status */
745 status = HAL_ERROR;
746 break;
747 }
748 }
749 else if (hpccard->State == HAL_PCCARD_STATE_RESET)
750 {
751 switch (CallbackId)
752 {
753 case HAL_PCCARD_MSP_INIT_CB_ID :
754 hpccard->MspInitCallback = pCallback;
755 break;
756 case HAL_PCCARD_MSP_DEINIT_CB_ID :
757 hpccard->MspDeInitCallback = pCallback;
758 break;
759 default :
760 /* update return status */
761 status = HAL_ERROR;
762 break;
763 }
764 }
765 else
766 {
767 /* update return status */
768 status = HAL_ERROR;
769 }
770
771 /* Release Lock */
772 __HAL_UNLOCK(hpccard);
773 return status;
774}
775
787HAL_StatusTypeDef HAL_PCCARD_UnRegisterCallback(PCCARD_HandleTypeDef *hpccard, HAL_PCCARD_CallbackIDTypeDef CallbackId)
788{
789 HAL_StatusTypeDef status = HAL_OK;
790
791 /* Process locked */
792 __HAL_LOCK(hpccard);
793
794 if (hpccard->State == HAL_PCCARD_STATE_READY)
795 {
796 switch (CallbackId)
797 {
798 case HAL_PCCARD_MSP_INIT_CB_ID :
799 hpccard->MspInitCallback = HAL_PCCARD_MspInit;
800 break;
801 case HAL_PCCARD_MSP_DEINIT_CB_ID :
802 hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit;
803 break;
804 case HAL_PCCARD_IT_CB_ID :
805 hpccard->ItCallback = HAL_PCCARD_ITCallback;
806 break;
807 default :
808 /* update return status */
809 status = HAL_ERROR;
810 break;
811 }
812 }
813 else if (hpccard->State == HAL_PCCARD_STATE_RESET)
814 {
815 switch (CallbackId)
816 {
817 case HAL_PCCARD_MSP_INIT_CB_ID :
818 hpccard->MspInitCallback = HAL_PCCARD_MspInit;
819 break;
820 case HAL_PCCARD_MSP_DEINIT_CB_ID :
821 hpccard->MspDeInitCallback = HAL_PCCARD_MspDeInit;
822 break;
823 default :
824 /* update return status */
825 status = HAL_ERROR;
826 break;
827 }
828 }
829 else
830 {
831 /* update return status */
832 status = HAL_ERROR;
833 }
834
835 /* Release Lock */
836 __HAL_UNLOCK(hpccard);
837 return status;
838}
839#endif /* USE_HAL_PCCARD_REGISTER_CALLBACKS */
840
844
859
866HAL_PCCARD_StateTypeDef HAL_PCCARD_GetState(PCCARD_HandleTypeDef *hpccard)
867{
868 return hpccard->State;
869}
870
880HAL_PCCARD_StatusTypeDef HAL_PCCARD_GetStatus(PCCARD_HandleTypeDef *hpccard)
881{
882 uint32_t timeout = PCCARD_TIMEOUT_STATUS;
883 uint32_t status_pccard = 0U;
884
885 /* Check the PCCARD controller state */
886 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
887 {
888 return HAL_PCCARD_STATUS_ONGOING;
889 }
890
891 status_pccard = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
892
893 while ((status_pccard == PCCARD_BUSY) && timeout)
894 {
895 status_pccard = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
896 timeout--;
897 }
898
899 if (timeout == 0U)
900 {
901 status_pccard = PCCARD_TIMEOUT_ERROR;
902 }
903
904 /* Return the operation status */
905 return (HAL_PCCARD_StatusTypeDef) status_pccard;
906}
907
917HAL_PCCARD_StatusTypeDef HAL_PCCARD_ReadStatus(PCCARD_HandleTypeDef *hpccard)
918{
919 uint8_t data = 0U;
920 uint8_t status_pccard = PCCARD_BUSY;
921
922 /* Check the PCCARD controller state */
923 if (hpccard->State == HAL_PCCARD_STATE_BUSY)
924 {
925 return HAL_PCCARD_STATUS_ONGOING;
926 }
927
928 /* Read status operation */
929 data = *(__IO uint8_t *)(PCCARD_IO_SPACE_PRIMARY_ADDR | ATA_STATUS_CMD_ALTERNATE);
930
931 if ((data & PCCARD_TIMEOUT_ERROR) == PCCARD_TIMEOUT_ERROR)
932 {
933 status_pccard = PCCARD_TIMEOUT_ERROR;
934 }
935 else if ((data & PCCARD_READY) == PCCARD_READY)
936 {
937 status_pccard = PCCARD_READY;
938 }
939
940 return (HAL_PCCARD_StatusTypeDef) status_pccard;
941}
942
946
950
954
955#endif /* HAL_PCCARD_MODULE_ENABLED */
956
960
961#endif /* FMC_Bank4 || FSMC_Bank4 */
#define FMC_FLAG_RISING_EDGE
#define FMC_FLAG_LEVEL
#define FMC_FLAG_FALLING_EDGE
#define FMC_FLAG_FEMPT
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition.
@ HAL_ERROR
@ HAL_OK
@ HAL_BUSY
#define __HAL_UNLOCK(__HANDLE__)
@ HAL_UNLOCKED
#define __HAL_LOCK(__HANDLE__)