| /****************************************************************************** |
| * Filename: vims.h |
| * Revised: 2015-09-01 10:40:32 +0200 (Tue, 01 Sep 2015) |
| * Revision: 44488 |
| * |
| * Description: Defines and prototypes for the VIMS. |
| * |
| * Copyright (c) 2015 - 2016, Texas Instruments Incorporated |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1) Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * 2) 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. |
| * |
| * 3) Neither the name of the ORGANIZATION 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 HOLDER 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. |
| * |
| ******************************************************************************/ |
| |
| //***************************************************************************** |
| // |
| //! \addtogroup system_control_group |
| //! @{ |
| //! \addtogroup vims_api |
| //! @{ |
| // |
| //***************************************************************************** |
| |
| #ifndef __VIMS_H__ |
| #define __VIMS_H__ |
| |
| //***************************************************************************** |
| // |
| // If building with a C++ compiler, make all of the definitions in this header |
| // have a C binding. |
| // |
| //***************************************************************************** |
| #ifdef __cplusplus |
| extern "C" |
| { |
| #endif |
| |
| #include <stdbool.h> |
| #include <stdint.h> |
| #include <inc/hw_types.h> |
| #include <inc/hw_memmap.h> |
| #include <inc/hw_vims.h> |
| #include <driverlib/debug.h> |
| |
| //***************************************************************************** |
| // |
| // Support for DriverLib in ROM: |
| // This section renames all functions that are not "static inline", so that |
| // calling these functions will default to implementation in flash. At the end |
| // of this file a second renaming will change the defaults to implementation in |
| // ROM for available functions. |
| // |
| // To force use of the implementation in flash, e.g. for debugging: |
| // - Globally: Define DRIVERLIB_NOROM at project level |
| // - Per function: Use prefix "NOROM_" when calling the function |
| // |
| //***************************************************************************** |
| #if !defined(DOXYGEN) |
| #define VIMSConfigure NOROM_VIMSConfigure |
| #define VIMSModeSet NOROM_VIMSModeSet |
| #define VIMSModeGet NOROM_VIMSModeGet |
| #define VIMSModeSafeSet NOROM_VIMSModeSafeSet |
| #endif |
| |
| //***************************************************************************** |
| // |
| // Values that can be passed to VIMSModeSet() as the ui32IntFlags parameter, |
| // and returned from VIMSModeGet(). |
| // |
| //***************************************************************************** |
| #define VIMS_MODE_CHANGING 0x4 // VIMS mode is changing now and VIMS_MODE |
| // can not be changed at moment. |
| #define VIMS_MODE_DISABLED (VIMS_CTL_MODE_GPRAM) // Disabled mode (GPRAM enabled). |
| #define VIMS_MODE_ENABLED (VIMS_CTL_MODE_CACHE) // Enabled mode, only USERCODE is cached. |
| #define VIMS_MODE_OFF (VIMS_CTL_MODE_OFF) // VIMS Cache RAM is off |
| |
| //***************************************************************************** |
| // |
| // API Functions and prototypes |
| // |
| //***************************************************************************** |
| |
| #ifdef DRIVERLIB_DEBUG |
| //***************************************************************************** |
| // |
| //! \brief Checks a VIMS base address. |
| //! |
| //! This function determines if the VIMS base address is valid. |
| //! |
| //! \param ui32Base is the base address of the VIMS. |
| //! |
| //! \return Returns \c true if the base address is valid and \c false |
| //! otherwise. |
| // |
| //***************************************************************************** |
| static bool |
| VIMSBaseValid(uint32_t ui32Base) |
| { |
| return(ui32Base == VIMS_BASE); |
| } |
| #endif |
| |
| //***************************************************************************** |
| // |
| //! \brief Configures the VIMS. |
| //! |
| //! This function sets general control settings of the VIMS system. |
| //! |
| //! \note The VIMS mode must be set using the \ref VIMSModeSet() call. |
| //! |
| //! \param ui32Base is the base address of the VIMS. |
| //! \param bRoundRobin specifies the arbitration method. |
| //! - \c true : Round Robin arbitration between the two available read/write interfaces |
| //! (i.e. Icode/Dcode and Sysbus) is to be used. |
| //! - \c false : Strict arbitration will be used, where Icode/Dcode |
| //! is preferred over the Sysbus. |
| //! \param bPrefetch specifies if prefetching is to be used. |
| //! - \c true : Cache is to prefetch tag data for the following address. |
| //! - \c false : No prefetch. |
| //! |
| //! \return None |
| //! |
| //! \sa \ref VIMSModeSet() |
| // |
| //***************************************************************************** |
| extern void VIMSConfigure(uint32_t ui32Base, bool bRoundRobin, |
| bool bPrefetch); |
| |
| //***************************************************************************** |
| // |
| //! \brief Set the operational mode of the VIMS. |
| //! |
| //! This function sets the operational mode of the VIMS. |
| //! |
| //! Upon reset the VIMS will be in \ref VIMS_MODE_CHANGING mode. |
| //! In this mode the VIMS will initialize the cache (GP) RAM (to all zeros). |
| //! The GP RAM will not be operational (read/write will result in bus fault). |
| //! The Cache will not be operational. |
| //! Reads and writes to flash will be uncached. |
| //! After a short delay (approx. 1029 clock cycles) the VIMS will |
| //! automatically switch mode to \ref VIMS_MODE_DISABLED (GPRAM enabled). |
| //! |
| //! In \ref VIMS_MODE_DISABLED mode, the cache is disabled but the GP RAM is |
| //! accessible: |
| //! The GP RAM will be accessible. |
| //! The Cache will not be operational. |
| //! Reads from flash will be uncached. |
| //! From this mode, the VIMS may be put in \ref VIMS_MODE_ENABLED (CACHE mode). |
| //! |
| //! In \ref VIMS_MODE_ENABLED mode, the cache is enabled for \b USERCODE space. |
| //! The GP RAM will not be operational (read/write will result in bus fault). |
| //! The Cache will be operational for SYSCODE space. |
| //! Reads from flash in USERCODE space will be uncached. |
| //! |
| //! In \ref VIMS_MODE_OFF the cache RAM is off to conserve power. |
| //! |
| //! \note The VIMS must be invalidated when switching mode. |
| //! This is done by setting VIMS_MODE_OFF before setting any new mode. |
| //! This is automatically handled in \ref VIMSModeSafeSet() |
| //! |
| //! \note It is highly recommended that the VIMS is put in disabled mode before |
| //! \b writing to flash, since the cache will not be updated nor invalidated |
| //! by flash writes. The line buffers should also be disabled when updating the |
| //! flash. Once \ref VIMSModeSet() is used to set the VIMS in |
| //! \ref VIMS_MODE_CHANGING mode, the user should check using |
| //! \ref VIMSModeGet() when the mode switches to \ref VIMS_MODE_DISABLED. Only when |
| //! the mode has changed the cache has been completely invalidated. |
| //! |
| //! \note Access from System Bus is never cached. Only access through ICODE |
| //! DCODE bus from the System CPU is cached. |
| //! |
| //! \param ui32Base is the base address of the VIMS. |
| //! \param ui32Mode is the operational mode. |
| //! - \ref VIMS_MODE_DISABLED (GPRAM enabled) |
| //! - \ref VIMS_MODE_ENABLED (CACHE mode) |
| //! - \ref VIMS_MODE_OFF |
| //! |
| //! \return None |
| //! |
| //! \sa \ref VIMSModeGet() and \ref VIMSModeSafeSet() |
| // |
| //***************************************************************************** |
| extern void VIMSModeSet(uint32_t ui32Base, uint32_t ui32Mode); |
| |
| //***************************************************************************** |
| // |
| //! \brief Get the current operational mode of the VIMS. |
| //! |
| //! This function returns the operational mode of the VIMS. |
| //! |
| //! \param ui32Base is the base address of the VIMS. |
| //! |
| //! \return Returns one of: |
| //! - \ref VIMS_MODE_CHANGING |
| //! - \ref VIMS_MODE_DISABLED (GPRAM enabled) |
| //! - \ref VIMS_MODE_ENABLED (CACHE mode) |
| //! - \ref VIMS_MODE_OFF |
| //! |
| //! \sa \ref VIMSModeSet() |
| // |
| //***************************************************************************** |
| extern uint32_t VIMSModeGet(uint32_t ui32Base); |
| |
| //***************************************************************************** |
| // |
| //! \brief Set the operational mode of the VIMS in a safe sequence. |
| //! |
| //! This function sets the operational mode of the VIMS in a safe sequence |
| //! |
| //! Upon reset the VIMS will be in \ref VIMS_MODE_CHANGING mode. |
| //! In this mode the VIMS will initialize the cache (GP) RAM (to all zeros). |
| //! The GP RAM will not be operational (read/write will result in bus fault). |
| //! The Cache will not be operational (read/write to flash will be uncached). |
| //! After a short delay (approx. 1029 clock cycles) the VIMS will |
| //! automatically switch mode to \ref VIMS_MODE_DISABLED (GPRAM enabled). |
| //! |
| //! In \ref VIMS_MODE_DISABLED mode, the cache is disabled but the GP RAM is |
| //! accessible: |
| //! The GP RAM will be accessible. |
| //! The Cache will not be operational. |
| //! Reads from flash will be uncached. |
| //! From this mode, the VIMS may be put in \ref VIMS_MODE_ENABLED (CACHE mode). |
| //! |
| //! In \ref VIMS_MODE_ENABLED mode, the cache is enabled for \b USERCODE space. |
| //! The GP RAM will not be operational (read/write will result in bus fault). |
| //! The Cache will be operational for SYSCODE space. |
| //! Reads from flash in USERCODE space will be uncached. |
| //! |
| //! In \ref VIMS_MODE_OFF the cache RAM is off to conserve power. |
| //! |
| //! \note The VIMS must be invalidated when switching mode. |
| //! This is done by setting VIMS_MODE_OFF before setting any new mode. |
| //! This is automatically handled in this function. |
| //! |
| //! \note It is highly recommended that the VIMS is put in disabled mode before |
| //! \b writing to flash, since the cache will not be updated nor invalidated |
| //! by flash writes. The line buffers should also be disabled when updating the |
| //! flash. |
| //! |
| //! \note Access from System Bus is never cached. Only access through ICODE |
| //! DCODE bus from the System CPU is cached. |
| //! |
| //! \param ui32Base is the base address of the VIMS. |
| //! \param ui32NewMode is the new operational mode: |
| //! - \ref VIMS_MODE_DISABLED (GPRAM enabled) |
| //! - \ref VIMS_MODE_ENABLED (CACHE mode) |
| //! - \ref VIMS_MODE_OFF |
| //! \param blocking shall be set to TRUE if further code execution shall be |
| //! blocked (delayed) until mode change is completed. |
| //! |
| //! \return None |
| //! |
| //! \sa \ref VIMSModeSet() and \ref VIMSModeGet() |
| // |
| //***************************************************************************** |
| extern void VIMSModeSafeSet( uint32_t ui32Base , |
| uint32_t ui32NewMode , |
| bool blocking ); |
| |
| //***************************************************************************** |
| // |
| //! \brief Disable VIMS linebuffers. |
| //! |
| //! Linebuffers should only be disabled when attempting to update the flash, to |
| //! ensure that the content of the buffers is not stale. As soon as flash is |
| //! updated the linebuffers should be reenabled. Failing to enable |
| //! will have a performance impact. |
| //! |
| //! \param ui32Base is the base address of the VIMS. |
| //! |
| //! \return None. |
| // |
| //***************************************************************************** |
| __STATIC_INLINE void |
| VIMSLineBufDisable(uint32_t ui32Base) |
| { |
| // |
| // Disable line buffers |
| // |
| HWREG(ui32Base + VIMS_O_CTL) |= VIMS_CTL_IDCODE_LB_DIS_M | |
| VIMS_CTL_SYSBUS_LB_DIS_M; |
| } |
| |
| //***************************************************************************** |
| // |
| //! \brief Enable VIMS linebuffers. |
| //! |
| //! Linebuffers should only be disabled when attempting to update the flash, to |
| //! ensure that the content of the buffers is not stale. As soon as flash is |
| //! updated the linebuffers should be reenabled. Failing to enable |
| //! will have a performance impact. |
| //! |
| //! \param ui32Base is the base address of the VIMS. |
| //! |
| //! \return None. |
| // |
| //***************************************************************************** |
| __STATIC_INLINE void |
| VIMSLineBufEnable(uint32_t ui32Base) |
| { |
| // |
| // Enable linebuffers |
| // |
| HWREG(ui32Base + VIMS_O_CTL) &= ~(VIMS_CTL_IDCODE_LB_DIS_M | |
| VIMS_CTL_SYSBUS_LB_DIS_M); |
| } |
| |
| //***************************************************************************** |
| // |
| // Support for DriverLib in ROM: |
| // Redirect to implementation in ROM when available. |
| // |
| //***************************************************************************** |
| #if !defined(DRIVERLIB_NOROM) && !defined(DOXYGEN) |
| #include <driverlib/rom.h> |
| #ifdef ROM_VIMSConfigure |
| #undef VIMSConfigure |
| #define VIMSConfigure ROM_VIMSConfigure |
| #endif |
| #ifdef ROM_VIMSModeSet |
| #undef VIMSModeSet |
| #define VIMSModeSet ROM_VIMSModeSet |
| #endif |
| #ifdef ROM_VIMSModeGet |
| #undef VIMSModeGet |
| #define VIMSModeGet ROM_VIMSModeGet |
| #endif |
| #ifdef ROM_VIMSModeSafeSet |
| #undef VIMSModeSafeSet |
| #define VIMSModeSafeSet ROM_VIMSModeSafeSet |
| #endif |
| #endif |
| |
| //***************************************************************************** |
| // |
| // Mark the end of the C bindings section for C++ compilers. |
| // |
| //***************************************************************************** |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif // __VIMS_H__ |
| |
| //***************************************************************************** |
| // |
| //! Close the Doxygen group. |
| //! @} |
| //! @} |
| // |
| //***************************************************************************** |