File indexing completed on 2025-05-11 08:23:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213 #include "stm32h7xx_hal.h"
0214
0215 #if defined(FMAC)
0216 #ifdef HAL_FMAC_MODULE_ENABLED
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235 #define MAX_FILTER_DATA_SIZE_TO_HANDLE ((uint16_t) 0xFFU)
0236 #define MAX_PRELOAD_INDEX 0xFFU
0237 #define PRELOAD_ACCESS_DMA 0x00U
0238 #define PRELOAD_ACCESS_POLLING 0x01U
0239 #define POLLING_DISABLED 0U
0240 #define POLLING_ENABLED 1U
0241 #define POLLING_NOT_STOPPED 0U
0242 #define POLLING_STOPPED 1U
0243
0244 #define HAL_FMAC_TIMEOUT_VALUE 1000U
0245
0246 #define HAL_FMAC_RESET_TIMEOUT_VALUE 500U
0247
0248 #define FMAC_DMA_REN FMAC_CR_DMAREN
0249
0250 #define FMAC_DMA_WEN FMAC_CR_DMAWEN
0251
0252 #define FMAC_START FMAC_PARAM_START
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269 #define FMAC_GET_X1_SIZE(__HANDLE__) \
0270 ((((__HANDLE__)->Instance->X1BUFCFG) & (FMAC_X1BUFCFG_X1_BUF_SIZE)) >> (FMAC_X1BUFCFG_X1_BUF_SIZE_Pos))
0271
0272
0273
0274
0275
0276
0277 #define FMAC_GET_X1_FULL_WM(__HANDLE__) \
0278 (((__HANDLE__)->Instance->X1BUFCFG) & (FMAC_X1BUFCFG_FULL_WM))
0279
0280
0281
0282
0283
0284
0285 #define FMAC_GET_X2_SIZE(__HANDLE__) \
0286 ((((__HANDLE__)->Instance->X2BUFCFG) & (FMAC_X2BUFCFG_X2_BUF_SIZE)) >> (FMAC_X2BUFCFG_X2_BUF_SIZE_Pos))
0287
0288
0289
0290
0291
0292
0293 #define FMAC_GET_Y_SIZE(__HANDLE__) \
0294 ((((__HANDLE__)->Instance->YBUFCFG) & (FMAC_YBUFCFG_Y_BUF_SIZE)) >> (FMAC_YBUFCFG_Y_BUF_SIZE_Pos))
0295
0296
0297
0298
0299
0300
0301 #define FMAC_GET_Y_EMPTY_WM(__HANDLE__) \
0302 (((__HANDLE__)->Instance->YBUFCFG) & (FMAC_YBUFCFG_EMPTY_WM))
0303
0304
0305
0306
0307
0308
0309 #define FMAC_GET_START_BIT(__HANDLE__) \
0310 ((((__HANDLE__)->Instance->PARAM) & (FMAC_PARAM_START)) >> (FMAC_PARAM_START_Pos))
0311
0312
0313
0314
0315
0316
0317 #define FMAC_GET_THRESHOLD_FROM_WM(__WM__) (((__WM__) == FMAC_THRESHOLD_1)? 1U: \
0318 ((__WM__) == FMAC_THRESHOLD_2)? 2U: \
0319 ((__WM__) == FMAC_THRESHOLD_4)? 4U:8U)
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329 static HAL_StatusTypeDef FMAC_Reset(FMAC_HandleTypeDef *hfmac);
0330 static void FMAC_ResetDataPointers(FMAC_HandleTypeDef *hfmac);
0331 static void FMAC_ResetOutputStateAndDataPointers(FMAC_HandleTypeDef *hfmac);
0332 static void FMAC_ResetInputStateAndDataPointers(FMAC_HandleTypeDef *hfmac);
0333 static HAL_StatusTypeDef FMAC_FilterConfig(FMAC_HandleTypeDef *hfmac, FMAC_FilterConfigTypeDef *pConfig,
0334 uint8_t PreloadAccess);
0335 static HAL_StatusTypeDef FMAC_FilterPreload(FMAC_HandleTypeDef *hfmac, int16_t *pInput, uint8_t InputSize,
0336 int16_t *pOutput, uint8_t OutputSize, uint8_t PreloadAccess);
0337 static void FMAC_WritePreloadDataIncrementPtr(FMAC_HandleTypeDef *hfmac, int16_t **ppData, uint8_t Size);
0338 static HAL_StatusTypeDef FMAC_WaitOnStartUntilTimeout(FMAC_HandleTypeDef *hfmac, uint32_t Tickstart, uint32_t Timeout);
0339 static HAL_StatusTypeDef FMAC_AppendFilterDataUpdateState(FMAC_HandleTypeDef *hfmac, int16_t *pInput,
0340 uint16_t *pInputSize);
0341 static HAL_StatusTypeDef FMAC_ConfigFilterOutputBufferUpdateState(FMAC_HandleTypeDef *hfmac, int16_t *pOutput,
0342 uint16_t *pOutputSize);
0343 static void FMAC_WriteDataIncrementPtr(FMAC_HandleTypeDef *hfmac, uint16_t MaxSizeToWrite);
0344 static void FMAC_ReadDataIncrementPtr(FMAC_HandleTypeDef *hfmac, uint16_t MaxSizeToRead);
0345 static void FMAC_DMAHalfGetData(DMA_HandleTypeDef *hdma);
0346 static void FMAC_DMAGetData(DMA_HandleTypeDef *hdma);
0347 static void FMAC_DMAHalfOutputDataReady(DMA_HandleTypeDef *hdma);
0348 static void FMAC_DMAOutputDataReady(DMA_HandleTypeDef *hdma);
0349 static void FMAC_DMAFilterConfig(DMA_HandleTypeDef *hdma);
0350 static void FMAC_DMAFilterPreload(DMA_HandleTypeDef *hdma);
0351 static void FMAC_DMAError(DMA_HandleTypeDef *hdma);
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387 HAL_StatusTypeDef HAL_FMAC_Init(FMAC_HandleTypeDef *hfmac)
0388 {
0389 HAL_StatusTypeDef status;
0390
0391
0392 if (hfmac == NULL)
0393 {
0394 return HAL_ERROR;
0395 }
0396
0397
0398 assert_param(IS_FMAC_ALL_INSTANCE(hfmac->Instance));
0399
0400 if (hfmac->State == HAL_FMAC_STATE_RESET)
0401 {
0402
0403 hfmac->Lock = HAL_UNLOCKED;
0404
0405 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
0406
0407 hfmac->ErrorCallback = HAL_FMAC_ErrorCallback;
0408 hfmac->HalfGetDataCallback = HAL_FMAC_HalfGetDataCallback;
0409 hfmac->GetDataCallback = HAL_FMAC_GetDataCallback;
0410 hfmac->HalfOutputDataReadyCallback = HAL_FMAC_HalfOutputDataReadyCallback;
0411 hfmac->OutputDataReadyCallback = HAL_FMAC_OutputDataReadyCallback;
0412 hfmac->FilterConfigCallback = HAL_FMAC_FilterConfigCallback;
0413 hfmac->FilterPreloadCallback = HAL_FMAC_FilterPreloadCallback;
0414
0415 if (hfmac->MspInitCallback == NULL)
0416 {
0417 hfmac->MspInitCallback = HAL_FMAC_MspInit;
0418 }
0419
0420
0421 hfmac->MspInitCallback(hfmac);
0422 #else
0423
0424 HAL_FMAC_MspInit(hfmac);
0425 #endif
0426 }
0427
0428
0429 hfmac->FilterParam = 0U;
0430 FMAC_ResetDataPointers(hfmac);
0431
0432
0433 if (FMAC_Reset(hfmac) == HAL_ERROR)
0434 {
0435
0436 hfmac->ErrorCode |= HAL_FMAC_ERROR_RESET;
0437 hfmac->State = HAL_FMAC_STATE_TIMEOUT;
0438
0439 status = HAL_ERROR;
0440 }
0441 else
0442 {
0443
0444 hfmac->ErrorCode = HAL_FMAC_ERROR_NONE;
0445 hfmac->State = HAL_FMAC_STATE_READY;
0446
0447 status = HAL_OK;
0448 }
0449
0450 __HAL_UNLOCK(hfmac);
0451
0452 return status;
0453 }
0454
0455
0456
0457
0458
0459
0460 HAL_StatusTypeDef HAL_FMAC_DeInit(FMAC_HandleTypeDef *hfmac)
0461 {
0462
0463 if (hfmac == NULL)
0464 {
0465 return HAL_ERROR;
0466 }
0467
0468
0469 assert_param(IS_FMAC_ALL_INSTANCE(hfmac->Instance));
0470
0471
0472 hfmac->State = HAL_FMAC_STATE_BUSY;
0473
0474
0475 hfmac->ErrorCode = HAL_FMAC_ERROR_NONE;
0476
0477
0478 hfmac->FilterParam = 0U;
0479 FMAC_ResetDataPointers(hfmac);
0480
0481 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
0482 if (hfmac->MspDeInitCallback == NULL)
0483 {
0484 hfmac->MspDeInitCallback = HAL_FMAC_MspDeInit;
0485 }
0486
0487 hfmac->MspDeInitCallback(hfmac);
0488 #else
0489
0490 HAL_FMAC_MspDeInit(hfmac);
0491 #endif
0492
0493
0494 hfmac->State = HAL_FMAC_STATE_RESET;
0495
0496
0497 __HAL_UNLOCK(hfmac);
0498
0499 return HAL_OK;
0500 }
0501
0502
0503
0504
0505
0506
0507 __weak void HAL_FMAC_MspInit(FMAC_HandleTypeDef *hfmac)
0508 {
0509
0510 UNUSED(hfmac);
0511
0512
0513
0514
0515 }
0516
0517
0518
0519
0520
0521
0522 __weak void HAL_FMAC_MspDeInit(FMAC_HandleTypeDef *hfmac)
0523 {
0524
0525 UNUSED(hfmac);
0526
0527
0528
0529
0530 }
0531
0532 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554 HAL_StatusTypeDef HAL_FMAC_RegisterCallback(FMAC_HandleTypeDef *hfmac, HAL_FMAC_CallbackIDTypeDef CallbackID,
0555 pFMAC_CallbackTypeDef pCallback)
0556 {
0557 HAL_StatusTypeDef status = HAL_OK;
0558
0559
0560 if (hfmac == NULL)
0561 {
0562 return HAL_ERROR;
0563 }
0564
0565 if (pCallback == NULL)
0566 {
0567
0568 hfmac->ErrorCode |= HAL_FMAC_ERROR_INVALID_CALLBACK;
0569
0570 return HAL_ERROR;
0571 }
0572
0573 if (hfmac->State == HAL_FMAC_STATE_READY)
0574 {
0575 switch (CallbackID)
0576 {
0577 case HAL_FMAC_ERROR_CB_ID :
0578 hfmac->ErrorCallback = pCallback;
0579 break;
0580
0581 case HAL_FMAC_HALF_GET_DATA_CB_ID :
0582 hfmac->HalfGetDataCallback = pCallback;
0583 break;
0584
0585 case HAL_FMAC_GET_DATA_CB_ID :
0586 hfmac->GetDataCallback = pCallback;
0587 break;
0588
0589 case HAL_FMAC_HALF_OUTPUT_DATA_READY_CB_ID :
0590 hfmac->HalfOutputDataReadyCallback = pCallback;
0591 break;
0592
0593 case HAL_FMAC_OUTPUT_DATA_READY_CB_ID :
0594 hfmac->OutputDataReadyCallback = pCallback;
0595 break;
0596
0597 case HAL_FMAC_FILTER_CONFIG_CB_ID :
0598 hfmac->FilterConfigCallback = pCallback;
0599 break;
0600
0601 case HAL_FMAC_FILTER_PRELOAD_CB_ID :
0602 hfmac->FilterPreloadCallback = pCallback;
0603 break;
0604
0605 case HAL_FMAC_MSPINIT_CB_ID :
0606 hfmac->MspInitCallback = pCallback;
0607 break;
0608
0609 case HAL_FMAC_MSPDEINIT_CB_ID :
0610 hfmac->MspDeInitCallback = pCallback;
0611 break;
0612
0613 default :
0614
0615 hfmac->ErrorCode |= HAL_FMAC_ERROR_INVALID_CALLBACK;
0616
0617
0618 status = HAL_ERROR;
0619 break;
0620 }
0621 }
0622 else if (hfmac->State == HAL_FMAC_STATE_RESET)
0623 {
0624 switch (CallbackID)
0625 {
0626 case HAL_FMAC_MSPINIT_CB_ID :
0627 hfmac->MspInitCallback = pCallback;
0628 break;
0629
0630 case HAL_FMAC_MSPDEINIT_CB_ID :
0631 hfmac->MspDeInitCallback = pCallback;
0632 break;
0633
0634 default :
0635
0636 hfmac->ErrorCode |= HAL_FMAC_ERROR_INVALID_CALLBACK;
0637
0638
0639 status = HAL_ERROR;
0640 break;
0641 }
0642 }
0643 else
0644 {
0645
0646 hfmac->ErrorCode |= HAL_FMAC_ERROR_INVALID_CALLBACK;
0647
0648
0649 status = HAL_ERROR;
0650 }
0651
0652 return status;
0653 }
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675 HAL_StatusTypeDef HAL_FMAC_UnRegisterCallback(FMAC_HandleTypeDef *hfmac, HAL_FMAC_CallbackIDTypeDef CallbackID)
0676 {
0677 HAL_StatusTypeDef status = HAL_OK;
0678
0679
0680 if (hfmac == NULL)
0681 {
0682 return HAL_ERROR;
0683 }
0684
0685 if (hfmac->State == HAL_FMAC_STATE_READY)
0686 {
0687 switch (CallbackID)
0688 {
0689 case HAL_FMAC_ERROR_CB_ID :
0690 hfmac->ErrorCallback = HAL_FMAC_ErrorCallback;
0691 break;
0692
0693 case HAL_FMAC_HALF_GET_DATA_CB_ID :
0694 hfmac->HalfGetDataCallback = HAL_FMAC_HalfGetDataCallback;
0695 break;
0696
0697 case HAL_FMAC_GET_DATA_CB_ID :
0698 hfmac->GetDataCallback = HAL_FMAC_GetDataCallback;
0699 break;
0700
0701 case HAL_FMAC_HALF_OUTPUT_DATA_READY_CB_ID :
0702 hfmac->HalfOutputDataReadyCallback = HAL_FMAC_HalfOutputDataReadyCallback;
0703
0704 break;
0705
0706 case HAL_FMAC_OUTPUT_DATA_READY_CB_ID :
0707 hfmac->OutputDataReadyCallback = HAL_FMAC_OutputDataReadyCallback;
0708
0709 break;
0710
0711 case HAL_FMAC_FILTER_CONFIG_CB_ID :
0712 hfmac->FilterConfigCallback = HAL_FMAC_FilterConfigCallback;
0713
0714 break;
0715
0716 case HAL_FMAC_FILTER_PRELOAD_CB_ID :
0717 hfmac->FilterPreloadCallback = HAL_FMAC_FilterPreloadCallback;
0718 break;
0719
0720 case HAL_FMAC_MSPINIT_CB_ID :
0721 hfmac->MspInitCallback = HAL_FMAC_MspInit;
0722 break;
0723
0724 case HAL_FMAC_MSPDEINIT_CB_ID :
0725 hfmac->MspDeInitCallback = HAL_FMAC_MspDeInit;
0726 break;
0727
0728 default :
0729
0730 hfmac->ErrorCode |= HAL_FMAC_ERROR_INVALID_CALLBACK;
0731
0732
0733 status = HAL_ERROR;
0734 break;
0735 }
0736 }
0737 else if (hfmac->State == HAL_FMAC_STATE_RESET)
0738 {
0739 switch (CallbackID)
0740 {
0741 case HAL_FMAC_MSPINIT_CB_ID :
0742 hfmac->MspInitCallback = HAL_FMAC_MspInit;
0743 break;
0744
0745 case HAL_FMAC_MSPDEINIT_CB_ID :
0746 hfmac->MspDeInitCallback = HAL_FMAC_MspDeInit;
0747 break;
0748
0749 default :
0750
0751 hfmac->ErrorCode |= HAL_FMAC_ERROR_INVALID_CALLBACK;
0752
0753
0754 status = HAL_ERROR;
0755 break;
0756 }
0757 }
0758 else
0759 {
0760
0761 hfmac->ErrorCode |= HAL_FMAC_ERROR_INVALID_CALLBACK;
0762
0763
0764 status = HAL_ERROR;
0765 }
0766
0767 return status;
0768 }
0769 #endif
0770
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806 HAL_StatusTypeDef HAL_FMAC_FilterConfig(FMAC_HandleTypeDef *hfmac, FMAC_FilterConfigTypeDef *pConfig)
0807 {
0808 return (FMAC_FilterConfig(hfmac, pConfig, PRELOAD_ACCESS_POLLING));
0809 }
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822 HAL_StatusTypeDef HAL_FMAC_FilterConfig_DMA(FMAC_HandleTypeDef *hfmac, FMAC_FilterConfigTypeDef *pConfig)
0823 {
0824 return (FMAC_FilterConfig(hfmac, pConfig, PRELOAD_ACCESS_DMA));
0825 }
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846 HAL_StatusTypeDef HAL_FMAC_FilterPreload(FMAC_HandleTypeDef *hfmac, int16_t *pInput, uint8_t InputSize,
0847 int16_t *pOutput, uint8_t OutputSize)
0848 {
0849 return (FMAC_FilterPreload(hfmac, pInput, InputSize, pOutput, OutputSize, PRELOAD_ACCESS_POLLING));
0850 }
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871 HAL_StatusTypeDef HAL_FMAC_FilterPreload_DMA(FMAC_HandleTypeDef *hfmac, int16_t *pInput, uint8_t InputSize,
0872 int16_t *pOutput, uint8_t OutputSize)
0873 {
0874 return (FMAC_FilterPreload(hfmac, pInput, InputSize, pOutput, OutputSize, PRELOAD_ACCESS_DMA));
0875 }
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889 HAL_StatusTypeDef HAL_FMAC_FilterStart(FMAC_HandleTypeDef *hfmac, int16_t *pOutput, uint16_t *pOutputSize)
0890 {
0891 uint32_t tmpcr = 0U;
0892 HAL_StatusTypeDef status;
0893
0894
0895 if (FMAC_GET_START_BIT(hfmac) != 0U)
0896 {
0897 return HAL_ERROR;
0898 }
0899
0900
0901 if (hfmac->FilterParam == 0U)
0902 {
0903 return HAL_ERROR;
0904 }
0905
0906
0907 if (hfmac->State == HAL_FMAC_STATE_READY)
0908 {
0909
0910 hfmac->State = HAL_FMAC_STATE_BUSY;
0911
0912
0913 if (hfmac->InputAccess == FMAC_BUFFER_ACCESS_DMA)
0914 {
0915 tmpcr |= FMAC_DMA_WEN;
0916 }
0917 else if (hfmac->InputAccess == FMAC_BUFFER_ACCESS_IT)
0918 {
0919 tmpcr |= FMAC_IT_WIEN;
0920 }
0921 else
0922 {
0923
0924 }
0925
0926
0927 if (hfmac->OutputAccess == FMAC_BUFFER_ACCESS_DMA)
0928 {
0929 tmpcr |= FMAC_DMA_REN;
0930 }
0931 else if (hfmac->OutputAccess == FMAC_BUFFER_ACCESS_IT)
0932 {
0933 tmpcr |= FMAC_IT_RIEN;
0934 }
0935 else
0936 {
0937
0938 }
0939
0940
0941 MODIFY_REG(hfmac->Instance->CR, \
0942 FMAC_IT_RIEN | FMAC_IT_WIEN | FMAC_DMA_REN | FMAC_CR_DMAWEN, \
0943 tmpcr);
0944
0945
0946 status = FMAC_ConfigFilterOutputBufferUpdateState(hfmac, pOutput, pOutputSize);
0947
0948 if (status == HAL_OK)
0949 {
0950
0951 WRITE_REG(hfmac->Instance->PARAM, (uint32_t)(hfmac->FilterParam));
0952 }
0953
0954
0955 hfmac->State = HAL_FMAC_STATE_READY;
0956 }
0957 else
0958 {
0959 status = HAL_ERROR;
0960 }
0961
0962 return status;
0963 }
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974 HAL_StatusTypeDef HAL_FMAC_AppendFilterData(FMAC_HandleTypeDef *hfmac, int16_t *pInput, uint16_t *pInputSize)
0975 {
0976 HAL_StatusTypeDef status;
0977
0978
0979 if ((pInput == NULL) || (pInputSize == NULL))
0980 {
0981 return HAL_ERROR;
0982 }
0983 if (*pInputSize == 0U)
0984 {
0985 return HAL_ERROR;
0986 }
0987
0988
0989 if (FMAC_GET_START_BIT(hfmac) == 0U)
0990 {
0991 return HAL_ERROR;
0992 }
0993
0994
0995 if (hfmac->InputAccess == FMAC_BUFFER_ACCESS_NONE)
0996 {
0997 return HAL_ERROR;
0998 }
0999
1000
1001 if ((hfmac->pInputSize != NULL) && (hfmac->InputCurrentSize < * (hfmac->pInputSize)))
1002 {
1003 return HAL_ERROR;
1004 }
1005
1006
1007 if (hfmac->WrState == HAL_FMAC_STATE_READY)
1008 {
1009
1010 status = FMAC_AppendFilterDataUpdateState(hfmac, pInput, pInputSize);
1011 }
1012 else
1013 {
1014 status = HAL_ERROR;
1015 }
1016
1017 return status;
1018 }
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030 HAL_StatusTypeDef HAL_FMAC_ConfigFilterOutputBuffer(FMAC_HandleTypeDef *hfmac, int16_t *pOutput, uint16_t *pOutputSize)
1031 {
1032 HAL_StatusTypeDef status;
1033
1034
1035 if ((pOutput == NULL) || (pOutputSize == NULL))
1036 {
1037 return HAL_ERROR;
1038 }
1039 if (*pOutputSize == 0U)
1040 {
1041 return HAL_ERROR;
1042 }
1043
1044
1045 if (FMAC_GET_START_BIT(hfmac) == 0U)
1046 {
1047 return HAL_ERROR;
1048 }
1049
1050
1051 if (hfmac->OutputAccess == FMAC_BUFFER_ACCESS_NONE)
1052 {
1053 return HAL_ERROR;
1054 }
1055
1056
1057 if ((hfmac->pOutputSize != NULL) && (hfmac->OutputCurrentSize < * (hfmac->pOutputSize)))
1058 {
1059 return HAL_ERROR;
1060 }
1061
1062
1063 if (hfmac->RdState == HAL_FMAC_STATE_READY)
1064 {
1065
1066 status = FMAC_ConfigFilterOutputBufferUpdateState(hfmac, pOutput, pOutputSize);
1067 }
1068 else
1069 {
1070 status = HAL_ERROR;
1071 }
1072
1073 return status;
1074 }
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091 HAL_StatusTypeDef HAL_FMAC_PollFilterData(FMAC_HandleTypeDef *hfmac, uint32_t Timeout)
1092 {
1093 uint32_t tickstart;
1094 uint8_t inpolling;
1095 uint8_t inpollingover = POLLING_NOT_STOPPED;
1096 uint8_t outpolling;
1097 uint8_t outpollingover = POLLING_NOT_STOPPED;
1098 HAL_StatusTypeDef status;
1099
1100
1101 if (FMAC_GET_START_BIT(hfmac) == 0U)
1102 {
1103 return HAL_ERROR;
1104 }
1105
1106
1107
1108
1109 if ((hfmac->InputAccess == FMAC_BUFFER_ACCESS_POLLING) && (hfmac->pInput != NULL))
1110 {
1111 inpolling = POLLING_ENABLED;
1112 }
1113 else
1114 {
1115 inpolling = POLLING_DISABLED;
1116 }
1117 if ((hfmac->OutputAccess == FMAC_BUFFER_ACCESS_POLLING) && (hfmac->pOutput != NULL))
1118 {
1119 outpolling = POLLING_ENABLED;
1120 }
1121 else
1122 {
1123 outpolling = POLLING_DISABLED;
1124 }
1125
1126
1127 if ((inpolling == POLLING_DISABLED) && (outpolling == POLLING_DISABLED))
1128 {
1129 return HAL_ERROR;
1130 }
1131
1132
1133 if (hfmac->State == HAL_FMAC_STATE_READY)
1134 {
1135
1136 hfmac->State = HAL_FMAC_STATE_BUSY;
1137
1138
1139 tickstart = HAL_GetTick();
1140
1141
1142 while ((HAL_GetTick() - tickstart) < Timeout)
1143 {
1144
1145 if (inpolling != POLLING_DISABLED)
1146 {
1147 FMAC_WriteDataIncrementPtr(hfmac, MAX_FILTER_DATA_SIZE_TO_HANDLE);
1148 if (hfmac->InputCurrentSize == *(hfmac->pInputSize))
1149 {
1150 inpollingover = POLLING_STOPPED;
1151 }
1152 }
1153
1154
1155 if (outpolling != POLLING_DISABLED)
1156 {
1157 FMAC_ReadDataIncrementPtr(hfmac, MAX_FILTER_DATA_SIZE_TO_HANDLE);
1158 if (hfmac->OutputCurrentSize == *(hfmac->pOutputSize))
1159 {
1160 outpollingover = POLLING_STOPPED;
1161 }
1162 }
1163
1164
1165 if ((inpollingover != POLLING_NOT_STOPPED) || (outpollingover != POLLING_NOT_STOPPED))
1166 {
1167 break;
1168 }
1169 }
1170
1171
1172 if (inpolling != POLLING_DISABLED)
1173 {
1174 (*(hfmac->pInputSize)) = hfmac->InputCurrentSize;
1175 FMAC_ResetInputStateAndDataPointers(hfmac);
1176 }
1177 if (outpolling != POLLING_DISABLED)
1178 {
1179 (*(hfmac->pOutputSize)) = hfmac->OutputCurrentSize;
1180 FMAC_ResetOutputStateAndDataPointers(hfmac);
1181 }
1182
1183
1184 hfmac->State = HAL_FMAC_STATE_READY;
1185
1186 if ((HAL_GetTick() - tickstart) >= Timeout)
1187 {
1188 hfmac->ErrorCode |= HAL_FMAC_ERROR_TIMEOUT;
1189 status = HAL_ERROR;
1190 }
1191 else
1192 {
1193 status = HAL_OK;
1194 }
1195 }
1196 else
1197 {
1198 status = HAL_ERROR;
1199 }
1200
1201 return status;
1202 }
1203
1204
1205
1206
1207
1208
1209
1210 HAL_StatusTypeDef HAL_FMAC_FilterStop(FMAC_HandleTypeDef *hfmac)
1211 {
1212 HAL_StatusTypeDef status;
1213
1214
1215 if (hfmac->State == HAL_FMAC_STATE_READY)
1216 {
1217
1218 hfmac->State = HAL_FMAC_STATE_BUSY;
1219
1220
1221 CLEAR_BIT(hfmac->Instance->PARAM, FMAC_PARAM_START);
1222
1223
1224 CLEAR_BIT(hfmac->Instance->CR, FMAC_DMA_REN | FMAC_DMA_WEN | FMAC_IT_RIEN | FMAC_IT_WIEN);
1225
1226
1227 if ((hfmac->InputAccess == FMAC_BUFFER_ACCESS_IT) && (hfmac->pInput != NULL))
1228 {
1229 (*(hfmac->pInputSize)) = hfmac->InputCurrentSize;
1230 }
1231 if ((hfmac->OutputAccess == FMAC_BUFFER_ACCESS_IT) && (hfmac->pOutput != NULL))
1232 {
1233 (*(hfmac->pOutputSize)) = hfmac->OutputCurrentSize;
1234 }
1235
1236
1237 if (FMAC_Reset(hfmac) == HAL_ERROR)
1238 {
1239
1240 hfmac->ErrorCode = HAL_FMAC_ERROR_RESET;
1241 hfmac->State = HAL_FMAC_STATE_TIMEOUT;
1242 status = HAL_ERROR;
1243 }
1244 else
1245 {
1246
1247 FMAC_ResetDataPointers(hfmac);
1248
1249 status = HAL_OK;
1250 }
1251
1252
1253 hfmac->State = HAL_FMAC_STATE_READY;
1254 }
1255 else
1256 {
1257 status = HAL_ERROR;
1258 }
1259
1260 return status;
1261 }
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292 __weak void HAL_FMAC_ErrorCallback(FMAC_HandleTypeDef *hfmac)
1293 {
1294
1295 UNUSED(hfmac);
1296
1297
1298
1299
1300 }
1301
1302
1303
1304
1305
1306
1307
1308 __weak void HAL_FMAC_HalfGetDataCallback(FMAC_HandleTypeDef *hfmac)
1309 {
1310
1311 UNUSED(hfmac);
1312
1313
1314
1315
1316 }
1317
1318
1319
1320
1321
1322
1323
1324 __weak void HAL_FMAC_GetDataCallback(FMAC_HandleTypeDef *hfmac)
1325 {
1326
1327 UNUSED(hfmac);
1328
1329
1330
1331
1332 }
1333
1334
1335
1336
1337
1338
1339
1340 __weak void HAL_FMAC_HalfOutputDataReadyCallback(FMAC_HandleTypeDef *hfmac)
1341 {
1342
1343 UNUSED(hfmac);
1344
1345
1346
1347
1348 }
1349
1350
1351
1352
1353
1354
1355
1356 __weak void HAL_FMAC_OutputDataReadyCallback(FMAC_HandleTypeDef *hfmac)
1357 {
1358
1359 UNUSED(hfmac);
1360
1361
1362
1363
1364 }
1365
1366
1367
1368
1369
1370
1371
1372 __weak void HAL_FMAC_FilterConfigCallback(FMAC_HandleTypeDef *hfmac)
1373 {
1374
1375 UNUSED(hfmac);
1376
1377
1378
1379
1380 }
1381
1382
1383
1384
1385
1386
1387
1388 __weak void HAL_FMAC_FilterPreloadCallback(FMAC_HandleTypeDef *hfmac)
1389 {
1390
1391 UNUSED(hfmac);
1392
1393
1394
1395
1396 }
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422 void HAL_FMAC_IRQHandler(FMAC_HandleTypeDef *hfmac)
1423 {
1424 uint32_t itsource;
1425
1426
1427 itsource = __HAL_FMAC_GET_IT_SOURCE(hfmac, FMAC_IT_RIEN);
1428 if ((__HAL_FMAC_GET_FLAG(hfmac, FMAC_FLAG_YEMPTY) == 0U) && (itsource != 0U))
1429 {
1430
1431
1432
1433 if (hfmac->pOutput != NULL)
1434 {
1435 FMAC_ReadDataIncrementPtr(hfmac, (uint16_t)FMAC_GET_Y_SIZE(hfmac));
1436 }
1437
1438
1439 if ((hfmac->pOutput == NULL) || (hfmac->OutputCurrentSize == *(hfmac->pOutputSize)))
1440 {
1441
1442 FMAC_ResetOutputStateAndDataPointers(hfmac);
1443
1444
1445 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
1446 hfmac->OutputDataReadyCallback(hfmac);
1447 #else
1448 HAL_FMAC_OutputDataReadyCallback(hfmac);
1449 #endif
1450 }
1451 }
1452
1453
1454 itsource = __HAL_FMAC_GET_IT_SOURCE(hfmac, FMAC_IT_WIEN);
1455 if ((__HAL_FMAC_GET_FLAG(hfmac, FMAC_FLAG_X1FULL) == 0U) && (itsource != 0U))
1456 {
1457
1458
1459
1460 if (hfmac->pInput != NULL)
1461 {
1462 FMAC_WriteDataIncrementPtr(hfmac, (uint16_t)FMAC_GET_X1_SIZE(hfmac));
1463 }
1464
1465
1466 if ((hfmac->pInput == NULL) || (hfmac->InputCurrentSize == *(hfmac->pInputSize)))
1467 {
1468
1469 FMAC_ResetInputStateAndDataPointers(hfmac);
1470
1471
1472 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
1473 hfmac->GetDataCallback(hfmac);
1474 #else
1475 HAL_FMAC_GetDataCallback(hfmac);
1476 #endif
1477 }
1478 }
1479
1480
1481 itsource = __HAL_FMAC_GET_IT_SOURCE(hfmac, FMAC_IT_OVFLIEN);
1482 if ((__HAL_FMAC_GET_FLAG(hfmac, FMAC_FLAG_OVFL) != 0U) && (itsource != 0U))
1483 {
1484 hfmac->ErrorCode |= HAL_FMAC_ERROR_OVFL;
1485 }
1486
1487
1488 itsource = __HAL_FMAC_GET_IT_SOURCE(hfmac, FMAC_IT_UNFLIEN);
1489 if ((__HAL_FMAC_GET_FLAG(hfmac, FMAC_FLAG_UNFL) != 0U) && (itsource != 0U))
1490 {
1491 hfmac->ErrorCode |= HAL_FMAC_ERROR_UNFL;
1492 }
1493
1494
1495 itsource = __HAL_FMAC_GET_IT_SOURCE(hfmac, FMAC_IT_SATIEN);
1496 if ((__HAL_FMAC_GET_FLAG(hfmac, FMAC_FLAG_SAT) != 0U) && (itsource != 0U))
1497 {
1498 hfmac->ErrorCode |= HAL_FMAC_ERROR_SAT;
1499 }
1500
1501
1502 if (hfmac->ErrorCode != HAL_FMAC_ERROR_NONE)
1503 {
1504
1505 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
1506 hfmac->ErrorCallback(hfmac);
1507 #else
1508 HAL_FMAC_ErrorCallback(hfmac);
1509 #endif
1510 }
1511 }
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539 HAL_FMAC_StateTypeDef HAL_FMAC_GetState(const FMAC_HandleTypeDef *hfmac)
1540 {
1541
1542 return hfmac->State;
1543 }
1544
1545
1546
1547
1548
1549
1550
1551
1552 uint32_t HAL_FMAC_GetError(const FMAC_HandleTypeDef *hfmac)
1553 {
1554
1555 return hfmac->ErrorCode;
1556 }
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581 static HAL_StatusTypeDef FMAC_Reset(FMAC_HandleTypeDef *hfmac)
1582 {
1583 uint32_t tickstart;
1584
1585
1586 tickstart = HAL_GetTick();
1587
1588
1589 SET_BIT(hfmac->Instance->CR, FMAC_CR_RESET);
1590
1591
1592 while (READ_BIT(hfmac->Instance->CR, FMAC_CR_RESET) != 0U)
1593 {
1594 if ((HAL_GetTick() - tickstart) > HAL_FMAC_RESET_TIMEOUT_VALUE)
1595 {
1596 hfmac->ErrorCode |= HAL_FMAC_ERROR_TIMEOUT;
1597 return HAL_ERROR;
1598 }
1599 }
1600
1601 hfmac->ErrorCode = HAL_FMAC_ERROR_NONE;
1602 return HAL_OK;
1603 }
1604
1605
1606
1607
1608
1609
1610 static void FMAC_ResetDataPointers(FMAC_HandleTypeDef *hfmac)
1611 {
1612 FMAC_ResetInputStateAndDataPointers(hfmac);
1613 FMAC_ResetOutputStateAndDataPointers(hfmac);
1614 }
1615
1616
1617
1618
1619
1620
1621 static void FMAC_ResetInputStateAndDataPointers(FMAC_HandleTypeDef *hfmac)
1622 {
1623 hfmac->pInput = NULL;
1624 hfmac->pInputSize = NULL;
1625 hfmac->InputCurrentSize = 0U;
1626 hfmac->WrState = HAL_FMAC_STATE_READY;
1627 }
1628
1629
1630
1631
1632
1633
1634 static void FMAC_ResetOutputStateAndDataPointers(FMAC_HandleTypeDef *hfmac)
1635 {
1636 hfmac->pOutput = NULL;
1637 hfmac->pOutputSize = NULL;
1638 hfmac->OutputCurrentSize = 0U;
1639 hfmac->RdState = HAL_FMAC_STATE_READY;
1640 }
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653 static HAL_StatusTypeDef FMAC_FilterConfig(FMAC_HandleTypeDef *hfmac, FMAC_FilterConfigTypeDef *pConfig,
1654 uint8_t PreloadAccess)
1655 {
1656 uint32_t tickstart;
1657 uint32_t tmpcr;
1658 #if defined(USE_FULL_ASSERT)
1659 uint32_t x2size;
1660 #endif
1661
1662
1663 assert_param(IS_FMAC_THRESHOLD(pConfig->InputThreshold));
1664 assert_param(IS_FMAC_THRESHOLD(pConfig->OutputThreshold));
1665 assert_param(IS_FMAC_BUFFER_ACCESS(pConfig->InputAccess));
1666 assert_param(IS_FMAC_BUFFER_ACCESS(pConfig->OutputAccess));
1667 assert_param(IS_FMAC_CLIP_STATE(pConfig->Clip));
1668 assert_param(IS_FMAC_FILTER_FUNCTION(pConfig->Filter));
1669 assert_param(IS_FMAC_PARAM_P(pConfig->Filter, pConfig->P));
1670 assert_param(IS_FMAC_PARAM_Q(pConfig->Filter, pConfig->Q));
1671 assert_param(IS_FMAC_PARAM_R(pConfig->Filter, pConfig->R));
1672
1673
1674 if (FMAC_GET_START_BIT(hfmac) != 0U)
1675 {
1676 return HAL_ERROR;
1677 }
1678
1679
1680 if (hfmac->State != HAL_FMAC_STATE_READY)
1681 {
1682 return HAL_ERROR;
1683 }
1684
1685
1686 hfmac->State = HAL_FMAC_STATE_BUSY;
1687
1688
1689 tickstart = HAL_GetTick();
1690
1691
1692 hfmac->FilterParam = 0U;
1693
1694
1695 if (pConfig->InputBufferSize != 0U)
1696 {
1697 MODIFY_REG(hfmac->Instance->X1BUFCFG, \
1698 (FMAC_X1BUFCFG_X1_BASE | FMAC_X1BUFCFG_X1_BUF_SIZE), \
1699 (((((uint32_t)(pConfig->InputBaseAddress)) << FMAC_X1BUFCFG_X1_BASE_Pos) & FMAC_X1BUFCFG_X1_BASE) | \
1700 ((((uint32_t)(pConfig->InputBufferSize)) << FMAC_X1BUFCFG_X1_BUF_SIZE_Pos) & \
1701 FMAC_X1BUFCFG_X1_BUF_SIZE)));
1702 }
1703
1704
1705 if (pConfig->InputThreshold != FMAC_THRESHOLD_NO_VALUE)
1706 {
1707
1708 assert_param(IS_FMAC_THRESHOLD_APPLICABLE(FMAC_GET_X1_SIZE(hfmac), pConfig->InputThreshold, pConfig->InputAccess));
1709
1710 MODIFY_REG(hfmac->Instance->X1BUFCFG, \
1711 FMAC_X1BUFCFG_FULL_WM, \
1712 ((pConfig->InputThreshold) & FMAC_X1BUFCFG_FULL_WM));
1713 }
1714
1715
1716 if (pConfig->CoeffBufferSize != 0U)
1717 {
1718 MODIFY_REG(hfmac->Instance->X2BUFCFG, \
1719 (FMAC_X2BUFCFG_X2_BASE | FMAC_X2BUFCFG_X2_BUF_SIZE), \
1720 (((((uint32_t)(pConfig->CoeffBaseAddress)) << FMAC_X2BUFCFG_X2_BASE_Pos) & FMAC_X2BUFCFG_X2_BASE) | \
1721 ((((uint32_t)(pConfig->CoeffBufferSize)) << FMAC_X2BUFCFG_X2_BUF_SIZE_Pos) &\
1722 FMAC_X2BUFCFG_X2_BUF_SIZE)));
1723 }
1724
1725
1726 if (pConfig->OutputBufferSize != 0U)
1727 {
1728 MODIFY_REG(hfmac->Instance->YBUFCFG, \
1729 (FMAC_YBUFCFG_Y_BASE | FMAC_YBUFCFG_Y_BUF_SIZE), \
1730 (((((uint32_t)(pConfig->OutputBaseAddress)) << FMAC_YBUFCFG_Y_BASE_Pos) & FMAC_YBUFCFG_Y_BASE) | \
1731 ((((uint32_t)(pConfig->OutputBufferSize)) << FMAC_YBUFCFG_Y_BUF_SIZE_Pos) & FMAC_YBUFCFG_Y_BUF_SIZE)));
1732 }
1733
1734
1735 if (pConfig->OutputThreshold != FMAC_THRESHOLD_NO_VALUE)
1736 {
1737
1738 assert_param(IS_FMAC_THRESHOLD_APPLICABLE(FMAC_GET_Y_SIZE(hfmac), pConfig->OutputThreshold, pConfig->OutputAccess));
1739
1740 MODIFY_REG(hfmac->Instance->YBUFCFG, \
1741 FMAC_YBUFCFG_EMPTY_WM, \
1742 ((pConfig->OutputThreshold) & FMAC_YBUFCFG_EMPTY_WM));
1743 }
1744
1745
1746 tmpcr = pConfig->Clip & FMAC_CR_CLIPEN;
1747
1748
1749
1750 if ((pConfig->InputAccess == FMAC_BUFFER_ACCESS_DMA) || (pConfig->InputAccess == FMAC_BUFFER_ACCESS_IT) ||
1751 (pConfig->OutputAccess == FMAC_BUFFER_ACCESS_DMA) || (pConfig->OutputAccess == FMAC_BUFFER_ACCESS_IT))
1752 {
1753 tmpcr |= FMAC_IT_UNFLIEN | FMAC_IT_OVFLIEN;
1754 }
1755
1756
1757 WRITE_REG(hfmac->Instance->CR, tmpcr);
1758
1759
1760 hfmac->InputAccess = pConfig->InputAccess;
1761 hfmac->OutputAccess = pConfig->OutputAccess;
1762
1763
1764 #if defined(USE_FULL_ASSERT)
1765 x2size = FMAC_GET_X2_SIZE(hfmac);
1766 #endif
1767 assert_param(((pConfig->Filter == FMAC_FUNC_CONVO_FIR) && (x2size >= pConfig->P)) || \
1768 ((pConfig->Filter == FMAC_FUNC_IIR_DIRECT_FORM_1) && \
1769 (x2size >= ((uint32_t)pConfig->P + (uint32_t)pConfig->Q))));
1770
1771
1772 hfmac->FilterParam = (FMAC_PARAM_START | pConfig->Filter | \
1773 ((((uint32_t)(pConfig->P)) << FMAC_PARAM_P_Pos) & FMAC_PARAM_P) | \
1774 ((((uint32_t)(pConfig->Q)) << FMAC_PARAM_Q_Pos) & FMAC_PARAM_Q) | \
1775 ((((uint32_t)(pConfig->R)) << FMAC_PARAM_R_Pos) & FMAC_PARAM_R));
1776
1777
1778 if ((pConfig->pCoeffB != NULL) && (pConfig->CoeffBSize != 0U))
1779 {
1780
1781 assert_param(((uint32_t)pConfig->CoeffASize + (uint32_t)pConfig->CoeffBSize) <= x2size);
1782
1783 assert_param(pConfig->CoeffBSize >= pConfig->P);
1784
1785
1786
1787 assert_param(((pConfig->Filter == FMAC_FUNC_CONVO_FIR) &&
1788 (pConfig->pCoeffA == NULL) && (pConfig->CoeffASize == 0U)) ||
1789 ((pConfig->Filter == FMAC_FUNC_IIR_DIRECT_FORM_1) &&
1790 (pConfig->pCoeffA != NULL) && (pConfig->CoeffASize != 0U) &&
1791 (pConfig->CoeffASize >= pConfig->Q)));
1792
1793
1794 WRITE_REG(hfmac->Instance->PARAM, \
1795 (((uint32_t)(pConfig->CoeffBSize) << FMAC_PARAM_P_Pos) | \
1796 ((uint32_t)(pConfig->CoeffASize) << FMAC_PARAM_Q_Pos) | \
1797 FMAC_FUNC_LOAD_X2 | FMAC_PARAM_START));
1798
1799 if (PreloadAccess == PRELOAD_ACCESS_POLLING)
1800 {
1801
1802 FMAC_WritePreloadDataIncrementPtr(hfmac, &(pConfig->pCoeffB), pConfig->CoeffBSize);
1803
1804
1805 if ((pConfig->pCoeffA != NULL) && (pConfig->CoeffASize != 0U))
1806 {
1807
1808 FMAC_WritePreloadDataIncrementPtr(hfmac, &(pConfig->pCoeffA), pConfig->CoeffASize);
1809 }
1810
1811
1812 if (FMAC_WaitOnStartUntilTimeout(hfmac, tickstart, HAL_FMAC_TIMEOUT_VALUE) != HAL_OK)
1813 {
1814 hfmac->ErrorCode |= HAL_FMAC_ERROR_TIMEOUT;
1815 hfmac->State = HAL_FMAC_STATE_TIMEOUT;
1816 return HAL_ERROR;
1817 }
1818
1819
1820 hfmac->State = HAL_FMAC_STATE_READY;
1821 }
1822 else
1823 {
1824 hfmac->pInput = pConfig->pCoeffA;
1825 hfmac->InputCurrentSize = pConfig->CoeffASize;
1826
1827
1828 hfmac->hdmaPreload->XferHalfCpltCallback = NULL;
1829 hfmac->hdmaPreload->XferCpltCallback = FMAC_DMAFilterConfig;
1830
1831 hfmac->hdmaPreload->XferErrorCallback = FMAC_DMAError;
1832
1833
1834 return (HAL_DMA_Start_IT(hfmac->hdmaPreload, (uint32_t)pConfig->pCoeffB, (uint32_t)&hfmac->Instance->WDATA,
1835 pConfig->CoeffBSize));
1836 }
1837 }
1838 else
1839 {
1840
1841 hfmac->State = HAL_FMAC_STATE_READY;
1842 }
1843
1844 return HAL_OK;
1845 }
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866 static HAL_StatusTypeDef FMAC_FilterPreload(FMAC_HandleTypeDef *hfmac, int16_t *pInput, uint8_t InputSize,
1867 int16_t *pOutput, uint8_t OutputSize, uint8_t PreloadAccess)
1868 {
1869 uint32_t tickstart;
1870 HAL_StatusTypeDef status;
1871
1872
1873 if (FMAC_GET_START_BIT(hfmac) != 0U)
1874 {
1875 return HAL_ERROR;
1876 }
1877
1878
1879 if (hfmac->FilterParam == 0U)
1880 {
1881 return HAL_ERROR;
1882 }
1883
1884
1885 if ((InputSize > FMAC_GET_X1_SIZE(hfmac)) && (pInput != NULL))
1886 {
1887 return HAL_ERROR;
1888 }
1889
1890
1891 if ((OutputSize > FMAC_GET_Y_SIZE(hfmac)) && (pOutput != NULL))
1892 {
1893 return HAL_ERROR;
1894 }
1895
1896
1897 if (hfmac->State != HAL_FMAC_STATE_READY)
1898 {
1899 return HAL_ERROR;
1900 }
1901
1902
1903 hfmac->State = HAL_FMAC_STATE_BUSY;
1904
1905
1906 tickstart = HAL_GetTick();
1907
1908
1909 if ((pInput != NULL) && (InputSize != 0U))
1910 {
1911
1912 WRITE_REG(hfmac->Instance->PARAM, \
1913 (((uint32_t)InputSize << FMAC_PARAM_P_Pos) | FMAC_FUNC_LOAD_X1 | FMAC_PARAM_START));
1914
1915 if (PreloadAccess == PRELOAD_ACCESS_POLLING)
1916 {
1917
1918 FMAC_WritePreloadDataIncrementPtr(hfmac, &pInput, InputSize);
1919
1920
1921 if (FMAC_WaitOnStartUntilTimeout(hfmac, tickstart, HAL_FMAC_TIMEOUT_VALUE) != HAL_OK)
1922 {
1923 hfmac->ErrorCode |= HAL_FMAC_ERROR_TIMEOUT;
1924 hfmac->State = HAL_FMAC_STATE_TIMEOUT;
1925 return HAL_ERROR;
1926 }
1927 }
1928 else
1929 {
1930 hfmac->pInput = pOutput;
1931 hfmac->InputCurrentSize = OutputSize;
1932
1933
1934 hfmac->hdmaPreload->XferHalfCpltCallback = NULL;
1935 hfmac->hdmaPreload->XferCpltCallback = FMAC_DMAFilterPreload;
1936
1937 hfmac->hdmaPreload->XferErrorCallback = FMAC_DMAError;
1938
1939
1940 return (HAL_DMA_Start_IT(hfmac->hdmaPreload, (uint32_t)pInput, (uint32_t)&hfmac->Instance->WDATA, InputSize));
1941 }
1942 }
1943
1944
1945 if ((pOutput != NULL) && (OutputSize != 0U))
1946 {
1947
1948 WRITE_REG(hfmac->Instance->PARAM, \
1949 (((uint32_t)OutputSize << FMAC_PARAM_P_Pos) | FMAC_FUNC_LOAD_Y | FMAC_PARAM_START));
1950
1951 if (PreloadAccess == PRELOAD_ACCESS_POLLING)
1952 {
1953
1954 FMAC_WritePreloadDataIncrementPtr(hfmac, &pOutput, OutputSize);
1955
1956
1957 if (FMAC_WaitOnStartUntilTimeout(hfmac, tickstart, HAL_FMAC_TIMEOUT_VALUE) != HAL_OK)
1958 {
1959 hfmac->ErrorCode |= HAL_FMAC_ERROR_TIMEOUT;
1960 hfmac->State = HAL_FMAC_STATE_TIMEOUT;
1961 return HAL_ERROR;
1962 }
1963 }
1964 else
1965 {
1966 hfmac->pInput = NULL;
1967 hfmac->InputCurrentSize = 0U;
1968
1969
1970 hfmac->hdmaPreload->XferHalfCpltCallback = NULL;
1971 hfmac->hdmaPreload->XferCpltCallback = FMAC_DMAFilterPreload;
1972
1973 hfmac->hdmaPreload->XferErrorCallback = FMAC_DMAError;
1974
1975
1976 return (HAL_DMA_Start_IT(hfmac->hdmaPreload, (uint32_t)pOutput, (uint32_t)&hfmac->Instance->WDATA, OutputSize));
1977 }
1978 }
1979
1980
1981 if (__HAL_FMAC_GET_FLAG(hfmac, FMAC_FLAG_OVFL))
1982 {
1983 hfmac->ErrorCode |= HAL_FMAC_ERROR_OVFL;
1984 }
1985 if (__HAL_FMAC_GET_FLAG(hfmac, FMAC_FLAG_UNFL))
1986 {
1987 hfmac->ErrorCode |= HAL_FMAC_ERROR_UNFL;
1988 }
1989 if (__HAL_FMAC_GET_FLAG(hfmac, FMAC_FLAG_SAT))
1990 {
1991 hfmac->ErrorCode |= HAL_FMAC_ERROR_SAT;
1992 }
1993
1994
1995 hfmac->State = HAL_FMAC_STATE_READY;
1996
1997
1998 if (hfmac->ErrorCode == HAL_FMAC_ERROR_NONE)
1999 {
2000 status = HAL_OK;
2001 }
2002 else
2003 {
2004 status = HAL_ERROR;
2005 }
2006 return status;
2007 }
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018 static void FMAC_WritePreloadDataIncrementPtr(FMAC_HandleTypeDef *hfmac, int16_t **ppData, uint8_t Size)
2019 {
2020 uint8_t index;
2021
2022
2023 for (index = Size; index > 0U; index--)
2024 {
2025 WRITE_REG(hfmac->Instance->WDATA, (((uint32_t)(*(*ppData))) & FMAC_WDATA_WDATA));
2026 (*ppData)++;
2027 }
2028 }
2029
2030
2031
2032
2033
2034
2035
2036
2037 static HAL_StatusTypeDef FMAC_WaitOnStartUntilTimeout(FMAC_HandleTypeDef *hfmac, uint32_t Tickstart, uint32_t Timeout)
2038 {
2039
2040 while (READ_BIT(hfmac->Instance->PARAM, FMAC_PARAM_START) != 0U)
2041 {
2042 if ((HAL_GetTick() - Tickstart) > Timeout)
2043 {
2044 hfmac->ErrorCode |= HAL_FMAC_ERROR_TIMEOUT;
2045
2046 return HAL_ERROR;
2047 }
2048 }
2049 return HAL_OK;
2050 }
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061 static HAL_StatusTypeDef FMAC_AppendFilterDataUpdateState(FMAC_HandleTypeDef *hfmac, int16_t *pInput,
2062 uint16_t *pInputSize)
2063 {
2064
2065 hfmac->WrState = HAL_FMAC_STATE_BUSY_WR;
2066
2067
2068 hfmac->InputCurrentSize = 0U;
2069
2070
2071 if (hfmac->InputAccess == FMAC_BUFFER_ACCESS_DMA)
2072 {
2073 hfmac->pInput = NULL;
2074 hfmac->pInputSize = NULL;
2075
2076
2077 hfmac->hdmaIn->XferHalfCpltCallback = FMAC_DMAHalfGetData;
2078 hfmac->hdmaIn->XferCpltCallback = FMAC_DMAGetData;
2079
2080 hfmac->hdmaIn->XferErrorCallback = FMAC_DMAError;
2081
2082
2083 return (HAL_DMA_Start_IT(hfmac->hdmaIn, (uint32_t)pInput, (uint32_t)&hfmac->Instance->WDATA, *pInputSize));
2084 }
2085 else
2086 {
2087
2088 hfmac->pInput = pInput;
2089 hfmac->pInputSize = pInputSize;
2090 }
2091
2092 return HAL_OK;
2093 }
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105 static HAL_StatusTypeDef FMAC_ConfigFilterOutputBufferUpdateState(FMAC_HandleTypeDef *hfmac, int16_t *pOutput,
2106 uint16_t *pOutputSize)
2107 {
2108
2109 hfmac->OutputCurrentSize = 0U;
2110
2111
2112 if ((pOutput == NULL) || (pOutputSize == NULL) || (*pOutputSize == 0U))
2113 {
2114
2115 hfmac->pOutput = NULL;
2116 hfmac->pOutputSize = NULL;
2117 hfmac->RdState = HAL_FMAC_STATE_READY;
2118 }
2119
2120 else if (hfmac->OutputAccess == FMAC_BUFFER_ACCESS_DMA)
2121 {
2122 hfmac->pOutput = NULL;
2123 hfmac->pOutputSize = NULL;
2124 hfmac->RdState = HAL_FMAC_STATE_BUSY_RD;
2125
2126
2127 hfmac->hdmaOut->XferHalfCpltCallback = FMAC_DMAHalfOutputDataReady;
2128 hfmac->hdmaOut->XferCpltCallback = FMAC_DMAOutputDataReady;
2129
2130 hfmac->hdmaOut->XferErrorCallback = FMAC_DMAError;
2131
2132
2133 return (HAL_DMA_Start_IT(hfmac->hdmaOut, (uint32_t)&hfmac->Instance->RDATA, (uint32_t)pOutput, *pOutputSize));
2134 }
2135 else if (hfmac->OutputAccess == FMAC_BUFFER_ACCESS_NONE)
2136 {
2137 hfmac->pOutput = NULL;
2138 hfmac->pOutputSize = NULL;
2139 hfmac->RdState = HAL_FMAC_STATE_READY;
2140 }
2141 else
2142 {
2143
2144 hfmac->pOutput = pOutput;
2145 hfmac->pOutputSize = pOutputSize;
2146 hfmac->RdState = HAL_FMAC_STATE_BUSY_RD;
2147 }
2148
2149 return HAL_OK;
2150 }
2151
2152
2153
2154
2155
2156
2157
2158
2159 static void FMAC_ReadDataIncrementPtr(FMAC_HandleTypeDef *hfmac, uint16_t MaxSizeToRead)
2160 {
2161 uint16_t maxsize;
2162 uint16_t threshold;
2163 uint32_t tmpvalue;
2164
2165
2166 if (READ_BIT(hfmac->Instance->SR, FMAC_SR_YEMPTY) != 0U)
2167 {
2168 return;
2169 }
2170
2171
2172 if ((hfmac->OutputCurrentSize + MaxSizeToRead) > *(hfmac->pOutputSize))
2173 {
2174 maxsize = *(hfmac->pOutputSize);
2175 }
2176 else
2177 {
2178 maxsize = hfmac->OutputCurrentSize + MaxSizeToRead;
2179 }
2180
2181
2182 do
2183 {
2184
2185 if (!(hfmac->OutputCurrentSize < maxsize))
2186 {
2187 return;
2188 }
2189
2190
2191 tmpvalue = ((READ_REG(hfmac->Instance->RDATA))& FMAC_RDATA_RDATA);
2192 *(hfmac->pOutput) = (int16_t)tmpvalue;
2193 hfmac->pOutput++;
2194 hfmac->OutputCurrentSize++;
2195 } while (READ_BIT(hfmac->Instance->SR, FMAC_SR_YEMPTY) == 0U);
2196
2197
2198 threshold = (uint16_t)FMAC_GET_THRESHOLD_FROM_WM(FMAC_GET_Y_EMPTY_WM(hfmac)) - 1U;
2199
2200
2201 if ((hfmac->OutputCurrentSize + threshold) < maxsize)
2202 {
2203 maxsize = hfmac->OutputCurrentSize + threshold;
2204 }
2205
2206
2207 while (hfmac->OutputCurrentSize < maxsize)
2208 {
2209 tmpvalue = ((READ_REG(hfmac->Instance->RDATA))& FMAC_RDATA_RDATA);
2210 *(hfmac->pOutput) = (int16_t)tmpvalue;
2211 hfmac->pOutput++;
2212 hfmac->OutputCurrentSize++;
2213 }
2214 }
2215
2216
2217
2218
2219
2220
2221
2222
2223 static void FMAC_WriteDataIncrementPtr(FMAC_HandleTypeDef *hfmac, uint16_t MaxSizeToWrite)
2224 {
2225 uint16_t maxsize;
2226 uint16_t threshold;
2227
2228
2229 if (READ_BIT(hfmac->Instance->SR, FMAC_SR_X1FULL) != 0U)
2230 {
2231 return;
2232 }
2233
2234
2235 if ((hfmac->InputCurrentSize + MaxSizeToWrite) > *(hfmac->pInputSize))
2236 {
2237 maxsize = *(hfmac->pInputSize);
2238 }
2239 else
2240 {
2241 maxsize = hfmac->InputCurrentSize + MaxSizeToWrite;
2242 }
2243
2244
2245 do
2246 {
2247
2248 if (!(hfmac->InputCurrentSize < maxsize))
2249 {
2250 return;
2251 }
2252
2253
2254 WRITE_REG(hfmac->Instance->WDATA, (((uint32_t)(*(hfmac->pInput))) & FMAC_WDATA_WDATA));
2255 hfmac->pInput++;
2256 hfmac->InputCurrentSize++;
2257 } while (READ_BIT(hfmac->Instance->SR, FMAC_SR_X1FULL) == 0U);
2258
2259
2260 threshold = (uint16_t)FMAC_GET_THRESHOLD_FROM_WM(FMAC_GET_X1_FULL_WM(hfmac)) - 1U;
2261
2262
2263 if ((hfmac->InputCurrentSize + threshold) < maxsize)
2264 {
2265 maxsize = hfmac->InputCurrentSize + threshold;
2266 }
2267
2268
2269 while (hfmac->InputCurrentSize < maxsize)
2270 {
2271 WRITE_REG(hfmac->Instance->WDATA, (((uint32_t)(*(hfmac->pInput))) & FMAC_WDATA_WDATA));
2272 hfmac->pInput++;
2273 hfmac->InputCurrentSize++;
2274 }
2275 }
2276
2277
2278
2279
2280
2281
2282 static void FMAC_DMAHalfGetData(DMA_HandleTypeDef *hdma)
2283 {
2284 FMAC_HandleTypeDef *hfmac = (FMAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2285
2286
2287 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
2288 hfmac->HalfGetDataCallback(hfmac);
2289 #else
2290 HAL_FMAC_HalfGetDataCallback(hfmac);
2291 #endif
2292 }
2293
2294
2295
2296
2297
2298
2299 static void FMAC_DMAGetData(DMA_HandleTypeDef *hdma)
2300 {
2301 FMAC_HandleTypeDef *hfmac = (FMAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2302
2303
2304 FMAC_ResetInputStateAndDataPointers(hfmac);
2305
2306
2307 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
2308 hfmac->GetDataCallback(hfmac);
2309 #else
2310 HAL_FMAC_GetDataCallback(hfmac);
2311 #endif
2312 }
2313
2314
2315
2316
2317
2318
2319 static void FMAC_DMAHalfOutputDataReady(DMA_HandleTypeDef *hdma)
2320 {
2321 FMAC_HandleTypeDef *hfmac = (FMAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2322
2323
2324 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
2325 hfmac->HalfOutputDataReadyCallback(hfmac);
2326 #else
2327 HAL_FMAC_HalfOutputDataReadyCallback(hfmac);
2328 #endif
2329 }
2330
2331
2332
2333
2334
2335
2336 static void FMAC_DMAOutputDataReady(DMA_HandleTypeDef *hdma)
2337 {
2338 FMAC_HandleTypeDef *hfmac = (FMAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2339
2340
2341 FMAC_ResetOutputStateAndDataPointers(hfmac);
2342
2343
2344 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
2345 hfmac->OutputDataReadyCallback(hfmac);
2346 #else
2347 HAL_FMAC_OutputDataReadyCallback(hfmac);
2348 #endif
2349 }
2350
2351
2352
2353
2354
2355
2356 static void FMAC_DMAFilterConfig(DMA_HandleTypeDef *hdma)
2357 {
2358 uint8_t index;
2359
2360 FMAC_HandleTypeDef *hfmac = (FMAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2361
2362
2363 if (hfmac->pInput != NULL)
2364 {
2365
2366 hfmac->hdmaPreload->XferHalfCpltCallback = NULL;
2367 hfmac->hdmaPreload->XferCpltCallback = FMAC_DMAFilterConfig;
2368
2369 hfmac->hdmaPreload->XferErrorCallback = FMAC_DMAError;
2370
2371
2372 if (HAL_DMA_Start_IT(hfmac->hdmaPreload, (uint32_t)hfmac->pInput, (uint32_t)&hfmac->Instance->WDATA,
2373 hfmac->InputCurrentSize) == HAL_OK)
2374 {
2375 hfmac->pInput = NULL;
2376 hfmac->InputCurrentSize = 0U;
2377 return;
2378 }
2379
2380
2381 hfmac->State = HAL_FMAC_STATE_ERROR;
2382 }
2383 else
2384 {
2385
2386 for (index = 0U; index < MAX_PRELOAD_INDEX; index++)
2387 {
2388 if (READ_BIT(hfmac->Instance->PARAM, FMAC_PARAM_START) == 0U)
2389 {
2390 break;
2391 }
2392 }
2393
2394
2395 if (READ_BIT(hfmac->Instance->PARAM, FMAC_PARAM_START) != 0U)
2396 {
2397 hfmac->State = HAL_FMAC_STATE_TIMEOUT;
2398 }
2399 else
2400 {
2401
2402 hfmac->State = HAL_FMAC_STATE_READY;
2403
2404
2405 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
2406 hfmac->FilterConfigCallback(hfmac);
2407 #else
2408 HAL_FMAC_FilterConfigCallback(hfmac);
2409 #endif
2410 return;
2411 }
2412 }
2413
2414
2415 hfmac->ErrorCode |= HAL_FMAC_ERROR_DMA;
2416
2417
2418 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
2419 hfmac->ErrorCallback(hfmac);
2420 #else
2421 HAL_FMAC_ErrorCallback(hfmac);
2422 #endif
2423
2424 }
2425
2426
2427
2428
2429
2430
2431 static void FMAC_DMAFilterPreload(DMA_HandleTypeDef *hdma)
2432 {
2433 uint8_t index;
2434
2435 FMAC_HandleTypeDef *hfmac = (FMAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2436
2437
2438 for (index = 0U; index < MAX_PRELOAD_INDEX; index++)
2439 {
2440 if (READ_BIT(hfmac->Instance->PARAM, FMAC_PARAM_START) == 0U)
2441 {
2442 break;
2443 }
2444 }
2445
2446
2447 if (READ_BIT(hfmac->Instance->PARAM, FMAC_PARAM_START) != 0U)
2448 {
2449 hfmac->State = HAL_FMAC_STATE_TIMEOUT;
2450 hfmac->ErrorCode |= HAL_FMAC_ERROR_TIMEOUT;
2451 }
2452
2453 else if ((hfmac->pInput != NULL) && (hfmac->InputCurrentSize != 0U))
2454 {
2455
2456 WRITE_REG(hfmac->Instance->PARAM, \
2457 (((uint32_t)(hfmac->InputCurrentSize) << FMAC_PARAM_P_Pos) | FMAC_FUNC_LOAD_Y | FMAC_PARAM_START));
2458
2459
2460 hfmac->hdmaPreload->XferHalfCpltCallback = NULL;
2461 hfmac->hdmaPreload->XferCpltCallback = FMAC_DMAFilterPreload;
2462
2463 hfmac->hdmaPreload->XferErrorCallback = FMAC_DMAError;
2464
2465
2466 if (HAL_DMA_Start_IT(hfmac->hdmaPreload, (uint32_t)hfmac->pInput, (uint32_t)&hfmac->Instance->WDATA,
2467 hfmac->InputCurrentSize) == HAL_OK)
2468 {
2469 hfmac->pInput = NULL;
2470 hfmac->InputCurrentSize = 0U;
2471 return;
2472 }
2473
2474
2475 hfmac->ErrorCode = HAL_FMAC_ERROR_DMA;
2476 hfmac->State = HAL_FMAC_STATE_ERROR;
2477 }
2478 else
2479 {
2480
2481 }
2482
2483 if (hfmac->ErrorCode == HAL_FMAC_ERROR_NONE)
2484 {
2485
2486 hfmac->State = HAL_FMAC_STATE_READY;
2487
2488
2489 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
2490 hfmac->FilterPreloadCallback(hfmac);
2491 #else
2492 HAL_FMAC_FilterPreloadCallback(hfmac);
2493 #endif
2494 }
2495 else
2496 {
2497
2498 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
2499 hfmac->ErrorCallback(hfmac);
2500 #else
2501 HAL_FMAC_ErrorCallback(hfmac);
2502 #endif
2503 }
2504 }
2505
2506
2507
2508
2509
2510
2511
2512 static void FMAC_DMAError(DMA_HandleTypeDef *hdma)
2513 {
2514 FMAC_HandleTypeDef *hfmac = (FMAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2515
2516
2517 hfmac->State = HAL_FMAC_STATE_ERROR;
2518
2519
2520 hfmac->ErrorCode |= HAL_FMAC_ERROR_DMA;
2521
2522
2523 #if (USE_HAL_FMAC_REGISTER_CALLBACKS == 1)
2524 hfmac->ErrorCallback(hfmac);
2525 #else
2526 HAL_FMAC_ErrorCallback(hfmac);
2527 #endif
2528 }
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542 #endif
2543 #endif