blob: 2a8f70cba461c0a13151bc8e09396b8517c2cd0d [file] [log] [blame]
/******************************************************************************
* 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.
//! @}
//! @}
//
//*****************************************************************************