//########################################################################### // // FILE: xbar.c // // TITLE: C28x X-BAR driver. // //########################################################################### // $Copyright: // Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the // distribution. // // Neither the name of Texas Instruments Incorporated nor the names of // its contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // $ //########################################################################### #include "xbar.h" //***************************************************************************** // // XBAR_setOutputMuxConfig // //***************************************************************************** void XBAR_setOutputMuxConfig(XBAR_OutputNum output, XBAR_OutputMuxConfig muxConfig) { uint32_t shift; uint16_t offset; // // If the configuration is for MUX16-31, we'll need an odd value to index // into the config registers. // if(((uint32_t)muxConfig & 0x2000U) != 0U) { offset = ((uint16_t)output << 1U) + 2U; } else { offset = (uint16_t)output << 1U; } // // Extract the shift from the input value. // shift = ((uint32_t)muxConfig >> 8U) & 0x1FU; // // Write the requested muxing value for this XBAR output. // EALLOW; HWREG(XBAR_OUTPUT_CFG_REG_BASE + offset) = (HWREG(XBAR_OUTPUT_CFG_REG_BASE + offset) & ~((uint32_t)0x3U << shift)) | (((uint32_t)muxConfig & 0x3U) << shift); EDIS; } //***************************************************************************** // // XBAR_setEPWMMuxConfig // //***************************************************************************** void XBAR_setEPWMMuxConfig(XBAR_TripNum trip, XBAR_EPWMMuxConfig muxConfig) { uint32_t shift; uint16_t offset; // // If the configuration is for MUX16-31, we'll need an odd value to index // into the config registers. // if(((uint32_t)muxConfig & 0x2000U) != 0U) { offset = ((uint16_t)trip << 1U) + 2U; } else { offset = (uint16_t)trip << 1U; } // // Extract the shift from the input value. // shift = ((uint32_t)muxConfig >> 8U) & 0x1FU; // // Write the requested muxing value for this XBAR trip. // EALLOW; HWREG(XBAR_EPWM_CFG_REG_BASE + (uint32_t)offset) = (HWREG(XBAR_EPWM_CFG_REG_BASE + (uint32_t)offset) & ~(0x3UL << shift)) | (((uint32_t)muxConfig & 0x3UL) << shift); EDIS; } //***************************************************************************** // // XBAR_setCLBMuxConfig // //***************************************************************************** void XBAR_setCLBMuxConfig(XBAR_AuxSigNum auxSignal, XBAR_CLBMuxConfig muxConfig) { uint32_t shift; uint16_t offset; // // If the configuration is for MUX16-31, we'll need an odd value to index // into the config registers. // if(((uint32_t)muxConfig & 0x2000U) != 0U) { offset = ((uint16_t)auxSignal << 1U) + 2U; } else { offset = (uint16_t)auxSignal << 1U; } // // Extract the shift from the input value. // shift = ((uint32_t)muxConfig >> 8U) & 0x1FU; // // Write the requested muxing value for this XBAR auxSignal. // EALLOW; HWREG(XBAR_CLB_CFG_REG_BASE + (uint32_t)offset) = (HWREG(XBAR_CLB_CFG_REG_BASE + (uint32_t)offset) & ~(0x3UL << shift)) | (((uint32_t)muxConfig & 0x3UL) << shift); EDIS; } //***************************************************************************** // // XBAR_getInputFlagStatus // //***************************************************************************** bool XBAR_getInputFlagStatus(XBAR_InputFlag inputFlag) { uint32_t offset; uint32_t inputMask; // // Determine flag register offset. // switch((uint16_t)inputFlag & XBAR_INPUT_FLG_REG_M) { case XBAR_INPUT_FLG_REG_1: offset = XBAR_O_FLG1; break; case XBAR_INPUT_FLG_REG_2: offset = XBAR_O_FLG2; break; case XBAR_INPUT_FLG_REG_3: offset = XBAR_O_FLG3; break; default: // // This should never happen if a valid inputFlag value is used. // offset = 0U; break; } // // Get the status of the X-BAR input latch. // inputMask = (uint32_t)1U << ((uint32_t)inputFlag & XBAR_INPUT_FLG_INPUT_M); return((HWREG(XBAR_BASE + offset) & inputMask) != 0U); } //***************************************************************************** // // XBAR_clearInputFlag // //***************************************************************************** void XBAR_clearInputFlag(XBAR_InputFlag inputFlag) { uint32_t offset; uint32_t inputMask; // // Determine flag clear register offset. // switch((uint16_t)inputFlag & XBAR_INPUT_FLG_REG_M) { case XBAR_INPUT_FLG_REG_1: offset = XBAR_O_CLR1; break; case XBAR_INPUT_FLG_REG_2: offset = XBAR_O_CLR2; break; case XBAR_INPUT_FLG_REG_3: offset = XBAR_O_CLR3; break; default: // // This should never happen if a valid inputFlag value is used. // offset = 0U; break; } // // Set the bit that clears the X-BAR input latch. // inputMask = 1UL << ((uint32_t)inputFlag & XBAR_INPUT_FLG_INPUT_M); HWREG(XBAR_BASE + offset) = inputMask; }