mirror of
https://github.com/thelsing/knx.git
synced 2025-10-12 11:15:54 +02:00
git-subtree-dir: examples/knx-cc1310/coresdk_cc13xx_cc26xx git-subtree-split: 0d78d3280357416a5c0388148cda13717c9ffaa5
293 lines
11 KiB
C
293 lines
11 KiB
C
/******************************************************************************
|
|
* Filename: aon_ioc.h
|
|
* Revised: 2016-10-06 17:21:09 +0200 (Thu, 06 Oct 2016)
|
|
* Revision: 47343
|
|
*
|
|
* Description: Defines and prototypes for the AON IO Controller
|
|
*
|
|
* Copyright (c) 2015 - 2017, 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 aon_group
|
|
//! @{
|
|
//! \addtogroup aonioc_api
|
|
//! @{
|
|
//
|
|
//*****************************************************************************
|
|
|
|
#ifndef __AON_IOC_H__
|
|
#define __AON_IOC_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_aon_ioc.h"
|
|
#include "debug.h"
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Defines for the drive strength
|
|
//
|
|
//*****************************************************************************
|
|
#define AONIOC_DRV_STR_1 0x00000000 // Lowest drive strength
|
|
#define AONIOC_DRV_STR_2 0x00000001
|
|
#define AONIOC_DRV_STR_3 0x00000003
|
|
#define AONIOC_DRV_STR_4 0x00000002
|
|
#define AONIOC_DRV_STR_5 0x00000006
|
|
#define AONIOC_DRV_STR_6 0x00000007
|
|
#define AONIOC_DRV_STR_7 0x00000005
|
|
#define AONIOC_DRV_STR_8 0x00000004 // Highest drive strength
|
|
|
|
#define AONIOC_DRV_LVL_MIN (AON_IOC_O_IOSTRMIN)
|
|
#define AONIOC_DRV_LVL_MED (AON_IOC_O_IOSTRMED)
|
|
#define AONIOC_DRV_LVL_MAX (AON_IOC_O_IOSTRMAX)
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// API Functions and prototypes
|
|
//
|
|
//*****************************************************************************
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! \brief Configure drive strength values for the manual drive strength options.
|
|
//!
|
|
//! This function defines the general drive strength settings for the non-AUTO
|
|
//! drive strength options in the MCU IOC. Consequently, if all IOs are using the
|
|
//! automatic drive strength option this function has no effect.
|
|
//!
|
|
//! Changing the drive strength values affects all current modes (Low-Current,
|
|
//! High-Current, and Extended-Current). Current mode for individual IOs is set in
|
|
//! MCU IOC by \ref IOCIODrvStrengthSet().
|
|
//!
|
|
//! \note Values are Gray encoded. Simply incrementing values to increase drive
|
|
//! strength will not work.
|
|
//!
|
|
//! \param ui32DriveLevel
|
|
//! - \ref AONIOC_DRV_LVL_MIN : Minimum drive strength option. Default value is selected
|
|
//! to give minimum 2/4/8 mA @3.3V for Low-Current mode, High-Current mode,
|
|
//! and Extended-Current mode respectively.
|
|
//! - \ref AONIOC_DRV_LVL_MED : Medium drive strength option. Default value is selected
|
|
//! to give minimum 2/4/8 mA @2.5V for Low-Current mode, High-Current mode,
|
|
//! and Extended-Current mode respectively.
|
|
//! - \ref AONIOC_DRV_LVL_MAX : Maximum drive strength option. Default value is selected
|
|
//! to give minimum 2/4/8 mA @1.8V for Low-Current mode, High-Current mode,
|
|
//! and Extended-Current mode respectively.
|
|
//! \param ui32DriveStrength sets the value used by IOs configured as non-AUTO drive strength in MCU IOC.
|
|
//! - \ref AONIOC_DRV_STR_1 : Lowest drive strength
|
|
//! - \ref AONIOC_DRV_STR_2
|
|
//! - \ref AONIOC_DRV_STR_3
|
|
//! - \ref AONIOC_DRV_STR_4
|
|
//! - \ref AONIOC_DRV_STR_5
|
|
//! - \ref AONIOC_DRV_STR_6
|
|
//! - \ref AONIOC_DRV_STR_7
|
|
//! - \ref AONIOC_DRV_STR_8 : Highest drive strength
|
|
//!
|
|
//! \return None
|
|
//!
|
|
//! \sa \ref AONIOCDriveStrengthGet(), \ref IOCIODrvStrengthSet()
|
|
//
|
|
//*****************************************************************************
|
|
__STATIC_INLINE void
|
|
AONIOCDriveStrengthSet(uint32_t ui32DriveLevel, uint32_t ui32DriveStrength)
|
|
{
|
|
ASSERT((ui32DriveLevel == AONIOC_DRV_LVL_MIN) ||
|
|
(ui32DriveLevel == AONIOC_DRV_LVL_MED) ||
|
|
(ui32DriveLevel == AONIOC_DRV_LVL_MAX));
|
|
ASSERT((ui32DriveStrength == AONIOC_DRV_STR_1) ||
|
|
(ui32DriveStrength == AONIOC_DRV_STR_2) ||
|
|
(ui32DriveStrength == AONIOC_DRV_STR_3) ||
|
|
(ui32DriveStrength == AONIOC_DRV_STR_4) ||
|
|
(ui32DriveStrength == AONIOC_DRV_STR_5) ||
|
|
(ui32DriveStrength == AONIOC_DRV_STR_6) ||
|
|
(ui32DriveStrength == AONIOC_DRV_STR_7) ||
|
|
(ui32DriveStrength == AONIOC_DRV_STR_8));
|
|
|
|
// Set the drive strength.
|
|
HWREG(AON_IOC_BASE + ui32DriveLevel) = ui32DriveStrength;
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! \brief Get a specific drive level setting for all IOs.
|
|
//!
|
|
//! Use this function to read the drive strength setting for a specific
|
|
//! IO drive level.
|
|
//!
|
|
//! \note Values are Gray encoded.
|
|
//!
|
|
//! \param ui32DriveLevel is the specific drive level to get the setting for.
|
|
//! - \ref AONIOC_DRV_LVL_MIN : Minimum drive strength option.
|
|
//! - \ref AONIOC_DRV_LVL_MED : Medium drive strength option.
|
|
//! - \ref AONIOC_DRV_LVL_MAX : Maximum drive strength option.
|
|
//!
|
|
//! \return Returns the requested drive strength level setting for all IOs.
|
|
//! Possible values are:
|
|
//! - \ref AONIOC_DRV_STR_1 : Lowest drive strength
|
|
//! - \ref AONIOC_DRV_STR_2
|
|
//! - \ref AONIOC_DRV_STR_3
|
|
//! - \ref AONIOC_DRV_STR_4
|
|
//! - \ref AONIOC_DRV_STR_5
|
|
//! - \ref AONIOC_DRV_STR_6
|
|
//! - \ref AONIOC_DRV_STR_7
|
|
//! - \ref AONIOC_DRV_STR_8 : Highest drive strength
|
|
//!
|
|
//! \sa AONIOCDriveStrengthSet()
|
|
//
|
|
//*****************************************************************************
|
|
__STATIC_INLINE uint32_t
|
|
AONIOCDriveStrengthGet(uint32_t ui32DriveLevel)
|
|
{
|
|
// Check the arguments.
|
|
ASSERT((ui32DriveLevel == AONIOC_DRV_LVL_MIN) ||
|
|
(ui32DriveLevel == AONIOC_DRV_LVL_MED) ||
|
|
(ui32DriveLevel == AONIOC_DRV_LVL_MAX));
|
|
|
|
// Return the drive strength value.
|
|
return( HWREG(AON_IOC_BASE + ui32DriveLevel) );
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! \brief Freeze the IOs.
|
|
//!
|
|
//! To retain the values of the output IOs during a powerdown/shutdown of the
|
|
//! device all IO latches in the AON domain should be frozen in their current
|
|
//! state. This ensures that software can regain control of the IOs after a
|
|
//! reboot without the IOs first falling back to the default values (i.e. input
|
|
//! and no pull).
|
|
//!
|
|
//! \return None
|
|
//!
|
|
//! \sa AONIOCFreezeDisable()
|
|
//
|
|
//*****************************************************************************
|
|
__STATIC_INLINE void
|
|
AONIOCFreezeEnable(void)
|
|
{
|
|
// Set the AON IO latches as static.
|
|
HWREG(AON_IOC_BASE + AON_IOC_O_IOCLATCH) = 0x0;
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! \brief Un-freeze the IOs.
|
|
//!
|
|
//! When rebooting the chip after it has entered powerdown/shutdown mode, the
|
|
//! software can regain control of the IOs by setting the IO latches as
|
|
//! transparent. The IOs should not be unfrozen before software has restored
|
|
//! the functionality of the IO.
|
|
//!
|
|
//! \return None
|
|
//!
|
|
//! \sa AONIOCFreezeEnable()
|
|
//
|
|
//*****************************************************************************
|
|
__STATIC_INLINE void
|
|
AONIOCFreezeDisable(void)
|
|
{
|
|
// Set the AON IOC latches as transparent.
|
|
HWREG(AON_IOC_BASE + AON_IOC_O_IOCLATCH) = AON_IOC_IOCLATCH_EN;
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! \brief Disable the 32kHz clock output.
|
|
//!
|
|
//! When outputting a 32 kHz clock on an IO, the output enable/disable functionality
|
|
//! in the IOC is bypassed. Therefore, the programmer needs to call this
|
|
//! function to disable the clock output.
|
|
//!
|
|
//! \return None
|
|
//!
|
|
//! \sa AONIOC32kHzOutputEnable()
|
|
//
|
|
//*****************************************************************************
|
|
__STATIC_INLINE void
|
|
AONIOC32kHzOutputDisable(void)
|
|
{
|
|
// Disable the LF clock output.
|
|
HWREG(AON_IOC_BASE + AON_IOC_O_CLK32KCTL) = AON_IOC_CLK32KCTL_OE_N;
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! \brief Enable the 32kHz clock output.
|
|
//!
|
|
//! When outputting a 32 kHz clock on an IO, the output enable/disable functionality
|
|
//! in the IOC is bypassed. Therefore, the programmer needs to call this
|
|
//! function to enable the clock output.
|
|
//!
|
|
//! \return None
|
|
//!
|
|
//! \sa AONIOC32kHzOutputDisable()
|
|
//
|
|
//*****************************************************************************
|
|
__STATIC_INLINE void
|
|
AONIOC32kHzOutputEnable(void)
|
|
{
|
|
// Enable the LF clock output.
|
|
HWREG(AON_IOC_BASE + AON_IOC_O_CLK32KCTL) = 0x0;
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Mark the end of the C bindings section for C++ compilers.
|
|
//
|
|
//*****************************************************************************
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // __AON_IOC_H__
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//! Close the Doxygen group.
|
|
//! @}
|
|
//! @}
|
|
//
|
|
//*****************************************************************************
|