123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- #include "fsl_flexio.h"
- #ifndef FSL_COMPONENT_ID
- #define FSL_COMPONENT_ID "platform.drivers.flexio"
- #endif
- #define FLEXIO_HANDLE_COUNT 2
- FLEXIO_Type *const s_flexioBases[] = FLEXIO_BASE_PTRS;
- #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
- const clock_ip_name_t s_flexioClocks[] = FLEXIO_CLOCKS;
- #endif
- static void *s_flexioHandle[FLEXIO_HANDLE_COUNT];
- static void *s_flexioType[FLEXIO_HANDLE_COUNT];
- static flexio_isr_t s_flexioIsr[FLEXIO_HANDLE_COUNT];
- uint32_t FLEXIO_GetInstance(FLEXIO_Type *base)
- {
- uint32_t instance;
-
- for (instance = 0; instance < ARRAY_SIZE(s_flexioBases); instance++)
- {
- if (s_flexioBases[instance] == base)
- {
- break;
- }
- }
- assert(instance < ARRAY_SIZE(s_flexioBases));
- return instance;
- }
- void FLEXIO_Init(FLEXIO_Type *base, const flexio_config_t *userConfig)
- {
- uint32_t ctrlReg = 0;
- #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
- CLOCK_EnableClock(s_flexioClocks[FLEXIO_GetInstance(base)]);
- #endif
- FLEXIO_Reset(base);
- ctrlReg = base->CTRL;
- ctrlReg &= ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK);
- ctrlReg |= (FLEXIO_CTRL_DBGE(userConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(userConfig->enableFastAccess) |
- FLEXIO_CTRL_FLEXEN(userConfig->enableFlexio));
- if (!userConfig->enableInDoze)
- {
- ctrlReg |= FLEXIO_CTRL_DOZEN_MASK;
- }
- base->CTRL = ctrlReg;
- }
- void FLEXIO_Deinit(FLEXIO_Type *base)
- {
- FLEXIO_Enable(base, false);
- #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
- CLOCK_DisableClock(s_flexioClocks[FLEXIO_GetInstance(base)]);
- #endif
- }
- void FLEXIO_GetDefaultConfig(flexio_config_t *userConfig)
- {
- assert(userConfig);
- userConfig->enableFlexio = true;
- userConfig->enableInDoze = false;
- userConfig->enableInDebug = true;
- userConfig->enableFastAccess = false;
- }
- void FLEXIO_Reset(FLEXIO_Type *base)
- {
-
- base->CTRL |= FLEXIO_CTRL_SWRST_MASK;
- base->CTRL = 0;
- }
- uint32_t FLEXIO_GetShifterBufferAddress(FLEXIO_Type *base, flexio_shifter_buffer_type_t type, uint8_t index)
- {
- assert(index < FLEXIO_SHIFTBUF_COUNT);
- uint32_t address = 0;
- switch (type)
- {
- case kFLEXIO_ShifterBuffer:
- address = (uint32_t) & (base->SHIFTBUF[index]);
- break;
- case kFLEXIO_ShifterBufferBitSwapped:
- address = (uint32_t) & (base->SHIFTBUFBIS[index]);
- break;
- case kFLEXIO_ShifterBufferByteSwapped:
- address = (uint32_t) & (base->SHIFTBUFBYS[index]);
- break;
- case kFLEXIO_ShifterBufferBitByteSwapped:
- address = (uint32_t) & (base->SHIFTBUFBBS[index]);
- break;
- #if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_BYTE_SWAP
- case kFLEXIO_ShifterBufferNibbleByteSwapped:
- address = (uint32_t) & (base->SHIFTBUFNBS[index]);
- break;
- #endif
- #if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_HALF_WORD_SWAP
- case kFLEXIO_ShifterBufferHalfWordSwapped:
- address = (uint32_t) & (base->SHIFTBUFHWS[index]);
- break;
- #endif
- #if defined(FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP) && FSL_FEATURE_FLEXIO_HAS_SHFT_BUFFER_NIBBLE_SWAP
- case kFLEXIO_ShifterBufferNibbleSwapped:
- address = (uint32_t) & (base->SHIFTBUFNIS[index]);
- break;
- #endif
- default:
- break;
- }
- return address;
- }
- void FLEXIO_SetShifterConfig(FLEXIO_Type *base, uint8_t index, const flexio_shifter_config_t *shifterConfig)
- {
- base->SHIFTCFG[index] = FLEXIO_SHIFTCFG_INSRC(shifterConfig->inputSource)
- #if FSL_FEATURE_FLEXIO_HAS_PARALLEL_WIDTH
- | FLEXIO_SHIFTCFG_PWIDTH(shifterConfig->parallelWidth)
- #endif
- | FLEXIO_SHIFTCFG_SSTOP(shifterConfig->shifterStop) |
- FLEXIO_SHIFTCFG_SSTART(shifterConfig->shifterStart);
- base->SHIFTCTL[index] =
- FLEXIO_SHIFTCTL_TIMSEL(shifterConfig->timerSelect) | FLEXIO_SHIFTCTL_TIMPOL(shifterConfig->timerPolarity) |
- FLEXIO_SHIFTCTL_PINCFG(shifterConfig->pinConfig) | FLEXIO_SHIFTCTL_PINSEL(shifterConfig->pinSelect) |
- FLEXIO_SHIFTCTL_PINPOL(shifterConfig->pinPolarity) | FLEXIO_SHIFTCTL_SMOD(shifterConfig->shifterMode);
- }
- void FLEXIO_SetTimerConfig(FLEXIO_Type *base, uint8_t index, const flexio_timer_config_t *timerConfig)
- {
- base->TIMCFG[index] =
- FLEXIO_TIMCFG_TIMOUT(timerConfig->timerOutput) | FLEXIO_TIMCFG_TIMDEC(timerConfig->timerDecrement) |
- FLEXIO_TIMCFG_TIMRST(timerConfig->timerReset) | FLEXIO_TIMCFG_TIMDIS(timerConfig->timerDisable) |
- FLEXIO_TIMCFG_TIMENA(timerConfig->timerEnable) | FLEXIO_TIMCFG_TSTOP(timerConfig->timerStop) |
- FLEXIO_TIMCFG_TSTART(timerConfig->timerStart);
- base->TIMCMP[index] = FLEXIO_TIMCMP_CMP(timerConfig->timerCompare);
- base->TIMCTL[index] = FLEXIO_TIMCTL_TRGSEL(timerConfig->triggerSelect) |
- FLEXIO_TIMCTL_TRGPOL(timerConfig->triggerPolarity) |
- FLEXIO_TIMCTL_TRGSRC(timerConfig->triggerSource) |
- FLEXIO_TIMCTL_PINCFG(timerConfig->pinConfig) | FLEXIO_TIMCTL_PINSEL(timerConfig->pinSelect) |
- FLEXIO_TIMCTL_PINPOL(timerConfig->pinPolarity) | FLEXIO_TIMCTL_TIMOD(timerConfig->timerMode);
- }
- status_t FLEXIO_RegisterHandleIRQ(void *base, void *handle, flexio_isr_t isr)
- {
- assert(base);
- assert(handle);
- assert(isr);
- uint8_t index = 0;
-
- for (index = 0; index < FLEXIO_HANDLE_COUNT; index++)
- {
- if (s_flexioHandle[index] == NULL)
- {
-
- s_flexioType[index] = base;
- s_flexioHandle[index] = handle;
- s_flexioIsr[index] = isr;
- break;
- }
- }
- if (index == FLEXIO_HANDLE_COUNT)
- {
- return kStatus_OutOfRange;
- }
- else
- {
- return kStatus_Success;
- }
- }
- status_t FLEXIO_UnregisterHandleIRQ(void *base)
- {
- assert(base);
- uint8_t index = 0;
-
- for (index = 0; index < FLEXIO_HANDLE_COUNT; index++)
- {
- if (s_flexioType[index] == base)
- {
-
- s_flexioType[index] = NULL;
- s_flexioHandle[index] = NULL;
- s_flexioIsr[index] = NULL;
- break;
- }
- }
- if (index == FLEXIO_HANDLE_COUNT)
- {
- return kStatus_OutOfRange;
- }
- else
- {
- return kStatus_Success;
- }
- }
- void FLEXIO_CommonIRQHandler(void)
- {
- uint8_t index;
- for (index = 0; index < FLEXIO_HANDLE_COUNT; index++)
- {
- if (s_flexioHandle[index])
- {
- s_flexioIsr[index](s_flexioType[index], s_flexioHandle[index]);
- }
- }
- #if defined __CORTEX_M && (__CORTEX_M == 4U)
- __DSB();
- #endif
- }
- void FLEXIO_DriverIRQHandler(void)
- {
- FLEXIO_CommonIRQHandler();
- }
- void FLEXIO0_DriverIRQHandler(void)
- {
- FLEXIO_CommonIRQHandler();
- }
- void FLEXIO1_DriverIRQHandler(void)
- {
- FLEXIO_CommonIRQHandler();
- }
- void UART2_FLEXIO_DriverIRQHandler(void)
- {
- FLEXIO_CommonIRQHandler();
- }
- void FLEXIO2_DriverIRQHandler(void)
- {
- FLEXIO_CommonIRQHandler();
- }
|