1 | /* |
2 | * Copyright (c) 2015, Freescale Semiconductor, Inc. |
3 | * Copyright 2016-2019 NXP |
4 | * All rights reserved. |
5 | * |
6 | * SPDX-License-Identifier: BSD-3-Clause |
7 | */ |
8 | |
9 | #include "fsl_xbarb.h" |
10 | |
11 | /******************************************************************************* |
12 | * Definitions |
13 | ******************************************************************************/ |
14 | |
15 | /* Component ID definition, used by tools. */ |
16 | #ifndef FSL_COMPONENT_ID |
17 | #define FSL_COMPONENT_ID "platform.drivers.xbarb" |
18 | #endif |
19 | |
20 | typedef union |
21 | { |
22 | uint8_t _u8[2]; |
23 | uint16_t _u16; |
24 | } xbarb_u8_u16_t; |
25 | |
26 | /******************************************************************************* |
27 | * Prototypes |
28 | ******************************************************************************/ |
29 | |
30 | /*! |
31 | * @brief Get the XBARB instance from peripheral base address. |
32 | * |
33 | * @param base XBARB peripheral base address. |
34 | * @return XBARB instance. |
35 | */ |
36 | static uint32_t XBARB_GetInstance(XBARB_Type *base); |
37 | |
38 | /******************************************************************************* |
39 | * Variables |
40 | ******************************************************************************/ |
41 | |
42 | /* Array of XBARB peripheral base address. */ |
43 | static XBARB_Type *const s_xbarbBases[] = XBARB_BASE_PTRS; |
44 | |
45 | #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) |
46 | /* Array of XBARB clock name. */ |
47 | static const clock_ip_name_t s_xbarbClock[] = XBARB_CLOCKS; |
48 | #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ |
49 | |
50 | /******************************************************************************* |
51 | * Code |
52 | ******************************************************************************/ |
53 | |
54 | static uint32_t XBARB_GetInstance(XBARB_Type *base) |
55 | { |
56 | uint32_t instance; |
57 | |
58 | /* Find the instance index from base address mappings. */ |
59 | for (instance = 0; instance < ARRAY_SIZE(s_xbarbBases); instance++) |
60 | { |
61 | if (s_xbarbBases[instance] == base) |
62 | { |
63 | break; |
64 | } |
65 | } |
66 | |
67 | assert(instance < ARRAY_SIZE(s_xbarbBases)); |
68 | |
69 | return instance; |
70 | } |
71 | |
72 | /*! |
73 | * brief Initializes the XBARB module. |
74 | * |
75 | * This function un-gates the XBARB clock. |
76 | * |
77 | * param base XBARB peripheral address. |
78 | */ |
79 | void XBARB_Init(XBARB_Type *base) |
80 | { |
81 | #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) |
82 | /* Enable XBARB module clock. */ |
83 | CLOCK_EnableClock(s_xbarbClock[XBARB_GetInstance(base)]); |
84 | #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ |
85 | } |
86 | |
87 | /*! |
88 | * brief Shuts down the XBARB module. |
89 | * |
90 | * This function disables XBARB clock. |
91 | * |
92 | * param base XBARB peripheral address. |
93 | */ |
94 | void XBARB_Deinit(XBARB_Type *base) |
95 | { |
96 | #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) |
97 | /* Disable XBARB module clock. */ |
98 | CLOCK_DisableClock(s_xbarbClock[XBARB_GetInstance(base)]); |
99 | #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */ |
100 | } |
101 | |
102 | /*! |
103 | * brief Configures a connection between the selected XBARB_IN[*] input and the XBARB_OUT[*] output signal. |
104 | * |
105 | * This function configures which XBARB input is connected to the selected XBARB output. |
106 | * If more than one XBARB module is available, only the inputs and outputs from the same module |
107 | * can be connected. |
108 | * |
109 | * param base XBARB peripheral address. |
110 | * param input XBARB input signal. |
111 | * param output XBARB output signal. |
112 | */ |
113 | void XBARB_SetSignalsConnection(XBARB_Type *base, xbar_input_signal_t input, xbar_output_signal_t output) |
114 | { |
115 | xbarb_u8_u16_t regVal; |
116 | uint8_t byteInReg; |
117 | uint8_t outputIndex = (uint8_t)output; |
118 | |
119 | byteInReg = outputIndex % 2U; |
120 | |
121 | regVal._u16 = XBARB_SELx(base, outputIndex); |
122 | |
123 | regVal._u8[byteInReg] = (uint8_t)input; |
124 | |
125 | XBARB_SELx(base, outputIndex) = regVal._u16; |
126 | } |
127 |