blob: 4c2545c9ed44b869fa78996cf71823c23c7d1e46 [file] [log] [blame]
/******************************************************************************
*
* Copyright (C) 2016 Xilinx, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* Use of the Software is limited solely to applications:
* (a) running on a Xilinx device, or
* (b) that interact with a Xilinx device through a bus or interconnect.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Except as contained in this notice, the name of the Xilinx shall not be used
* in advertising or otherwise to promote the sale, use or other dealings in
* this Software without prior written authorization from Xilinx.
*
******************************************************************************/
/*****************************************************************************/
/**
*
* @file xsysmonpsu.c
*
* Functions in this file are the minimum required functions for the XSysMonPsu
* driver. See xsysmonpsu.h for a detailed description of the driver.
*
* @note None.
*
* <pre>
*
* MODIFICATION HISTORY:
*
* Ver Who Date Changes
* ----- ----- -------- -----------------------------------------------
* 1.0 kvn 12/15/15 First release.
* 02/15/16 Corrected Assert function call in
* XSysMonPsu_GetMonitorStatus API.
* 03/03/16 Added Temperature remote channel for Setsingle
* channel API. Also corrected external mux channel
* numbers.
* 1.1 kvn 05/05/16 Modified code for MISRA-C:2012 Compliance.
* 2.0 vns 08/14/16 Fixed CR #956780, added support for enabling/disabling
* SEQ_CH2 and SEQ_AVG2 registers, modified function
* prototypes of XSysMonPsu_GetSeqAvgEnables,
* XSysMonPsu_SetSeqAvgEnables, XSysMonPsu_SetSeqChEnables,
* XSysMonPsu_GetSeqChEnables,
* XSysMonPsu_SetSeqInputMode, XSysMonPsu_GetSeqInputMode,
* XSysMonPsu_SetSeqAcqTime
* and XSysMonPsu_GetSeqAcqTime to provide support for
* set/get 64 bit value.
* 2.1 sk 03/03/16 Check for PL reset before doing PL Sysmon reset.
* 2.3 mn 12/13/17 Correct the AMS block channel numbers
* mn 03/08/18 Update Clock Divisor to the proper value
*
* </pre>
*
******************************************************************************/
/***************************** Include Files *********************************/
#include "xsysmonpsu.h"
/************************** Constant Definitions ****************************/
/**************************** Type Definitions ******************************/
/***************** Macros (Inline Functions) Definitions ********************/
/************************** Function Prototypes *****************************/
static void XSysMonPsu_StubHandler(void *CallBackRef);
/************************** Variable Definitions ****************************/
/*****************************************************************************/
/**
*
* This function initializes XSysMonPsu device/instance. This function
* must be called prior to using the System Monitor device.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param ConfigPtr points to the XSysMonPsu device configuration structure.
* @param EffectiveAddr is the device base address in the virtual memory
* address space. If the address translation is not used then the
* physical address is passed.
* Unexpected errors may occur if the address mapping is changed
* after this function is invoked.
*
* @return
* - XST_SUCCESS if successful.
*
* @note The user needs to first call the XSysMonPsu_LookupConfig() API
* which returns the Configuration structure pointer which is
* passed as a parameter to the XSysMonPsu_CfgInitialize() API.
*
******************************************************************************/
s32 XSysMonPsu_CfgInitialize(XSysMonPsu *InstancePtr, XSysMonPsu_Config *ConfigPtr,
u32 EffectiveAddr)
{
u32 PsSysmonControlStatus;
u32 PlSysmonControlStatus;
u32 IntrStatus;
/* Assert the input arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(ConfigPtr != NULL);
/* Set the values read from the device config and the base address. */
InstancePtr->Config.DeviceId = ConfigPtr->DeviceId;
InstancePtr->Config.BaseAddress = EffectiveAddr;
InstancePtr->Config.InputClockMHz = ConfigPtr->InputClockMHz;
/* Set all handlers to stub values, let user configure this data later. */
InstancePtr->Handler = XSysMonPsu_StubHandler;
XSysMonPsu_UpdateAdcClkDivisor(InstancePtr, XSYSMON_PS);
XSysMonPsu_UpdateAdcClkDivisor(InstancePtr, XSYSMON_PL);
/* Reset the device such that it is in a known state. */
XSysMonPsu_Reset(InstancePtr);
PsSysmonControlStatus = XSysmonPsu_ReadReg(InstancePtr->Config.BaseAddress +
XSYSMONPSU_PS_SYSMON_CSTS_OFFSET);
/* Check if the PS Sysmon is in Idle / ready state or not */
while(PsSysmonControlStatus != XSYSMONPSU_PS_SYSMON_READY) {
PsSysmonControlStatus = XSysmonPsu_ReadReg(InstancePtr->Config.BaseAddress +
XSYSMONPSU_PS_SYSMON_CSTS_OFFSET);
}
PlSysmonControlStatus = XSysmonPsu_ReadReg(InstancePtr->Config.BaseAddress +
XSYSMONPSU_PL_SYSMON_CSTS_OFFSET);
/* Check if the PL Sysmon is accessible to PS Sysmon or not */
while((PlSysmonControlStatus & XSYSMONPSU_PL_SYSMON_CSTS_ACESBLE_MASK)
!= XSYSMONPSU_PL_SYSMON_CSTS_ACESBLE_MASK) {
PlSysmonControlStatus = XSysmonPsu_ReadReg(InstancePtr->Config.BaseAddress +
XSYSMONPSU_PL_SYSMON_CSTS_OFFSET);
}
/* Indicate the instance is now ready to use, initialized without error */
InstancePtr->IsReady = XIL_COMPONENT_IS_READY;
/* Clear any bits set in the Interrupt Status Register. */
IntrStatus = XSysMonPsu_IntrGetStatus(InstancePtr);
XSysMonPsu_IntrClear(InstancePtr, IntrStatus);
return XST_SUCCESS;
}
/****************************************************************************/
/**
*
* This function is a stub handler that is the default handler such that if the
* application has not set the handler when interrupts are enabled, this
* function will be called.
*
* @param CallBackRef is unused by this function.
*
* @return None.
*
* @note None.
*
*****************************************************************************/
static void XSysMonPsu_StubHandler(void *CallBackRef)
{
(void) CallBackRef;
/* Assert occurs always since this is a stub and should never be called */
Xil_AssertVoidAlways();
}
/*****************************************************************************/
/**
*
* This function resets the SystemMonitor
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
*
* @return None.
*
* @note Upon reset, all Maximum and Minimum status registers will be
* reset to their default values. Currently running and any averaging
* will restart. Refer to the device data sheet for the device status and
* register values after the reset.
*
******************************************************************************/
void XSysMonPsu_Reset(XSysMonPsu *InstancePtr)
{
u8 IsPlReset;
/* Assert the arguments. */
Xil_AssertVoid(InstancePtr != NULL);
/* RESET the PS SYSMON */
XSysmonPsu_WriteReg(InstancePtr->Config.BaseAddress + XPS_BA_OFFSET +
XSYSMONPSU_VP_VN_OFFSET, XSYSMONPSU_VP_VN_MASK);
/* Check for PL is under reset or not */
IsPlReset = (XSysmonPsu_ReadReg(CSU_BASEADDR + PCAP_STATUS_OFFSET) &
PL_CFG_RESET_MASK) >> PL_CFG_RESET_SHIFT;
if (IsPlReset != 0U) {
/* RESET the PL SYSMON */
XSysmonPsu_WriteReg(InstancePtr->Config.BaseAddress + XPL_BA_OFFSET +
XSYSMONPSU_VP_VN_OFFSET, XSYSMONPSU_VP_VN_MASK);
}
}
/****************************************************************************/
/**
*
* This function reads the contents of the Status Register.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return A 32-bit value representing the contents of the Status Register.
* Use the XSYSMONPSU_MON_STS_* constants defined in xsysmonpsu_hw.h to
* interpret the returned value.
*
* @note None.
*****************************************************************************/
u32 XSysMonPsu_GetStatus(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u32 Status;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Read the Sysmon Status Register and return the value. */
Status = XSysmonPsu_ReadReg(EffectiveBaseAddress + XSYSMONPSU_MON_STS_OFFSET);
return Status;
}
/****************************************************************************/
/**
*
* This function starts the ADC conversion in the Single Channel event driven
* sampling mode. The EOC bit in Status Register will be set once the conversion
* is finished. Refer to the device specification for more details.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
*
* @return None.
*
* @note The default state of the CONVST bit is a logic 0. The conversion
* is started when the CONVST bit is set to 1 from 0.
* This bit is self-clearing so that the next conversion
* can be started by setting this bit.
*
*****************************************************************************/
void XSysMonPsu_StartAdcConversion(XSysMonPsu *InstancePtr)
{
u32 ControlStatus;
/* Assert the arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
/*
* Start the conversion by setting the CONVST bit to 1 only if auto-convst
* bit is not enabled. This convst bit is self-clearing.
*/
ControlStatus = XSysmonPsu_ReadReg(InstancePtr->Config.BaseAddress +
XSYSMONPSU_PS_SYSMON_CSTS_OFFSET);
if ((ControlStatus & XSYSMONPSU_PS_SYSMON_CSTS_AUTO_CONVST_MASK )
!= XSYSMONPSU_PS_SYSMON_CSTS_AUTO_CONVST_MASK) {
XSysmonPsu_WriteReg(InstancePtr->Config.BaseAddress +
XSYSMONPSU_PS_SYSMON_CSTS_OFFSET,
(ControlStatus | (u32)XSYSMONPSU_PS_SYSMON_CSTS_CONVST_MASK));
}
}
/****************************************************************************/
/**
*
* Get the ADC converted data for the specified channel.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param Channel is the channel number. Use the XSM_CH_* defined in
* the file xsysmonpsu.h. The valid channels for PS / PL SysMon are 0 - 6,
* 8 - 10 and 13 - 37. For AMS, 38 - 53 channels are valid.
* @param Block is the value that tells whether it is for PS Sysmon block
* or PL Sysmon block or the AMS controller register region.
*
* @return A 16-bit value representing the ADC converted data for the
* specified channel. The System Monitor device guarantees
* a 10 bit resolution for the ADC converted data and data is the
* 10 MSB bits of the 16 data read from the device.
*
* @note Please make sure that the proper channel number is passed.
*
*****************************************************************************/
u16 XSysMonPsu_GetAdcData(XSysMonPsu *InstancePtr, u8 Channel, u32 Block)
{
u16 AdcData;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((Channel <= XSM_CH_SUPPLY3) ||
((Channel >= XSM_CH_SUPPLY_CALIB) &&
(Channel <= XSM_CH_GAINERR_CALIB)) ||
((Channel >= XSM_CH_SUPPLY4) &&
(Channel <= XSM_CH_RESERVE1)));
Xil_AssertNonvoid((Block == XSYSMON_PS)||(Block == XSYSMON_PL)
||(Block == XSYSMON_AMS));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
Block);
/*
* Read the selected ADC converted data for the specified channel
* and return the value.
*/
if (Channel <= XSM_CH_AUX_MAX) {
AdcData = (u16) (XSysmonPsu_ReadReg(EffectiveBaseAddress + ((u32)Channel << 2U)));
} else if ((Channel >= XSM_CH_SUPPLY7) && (Channel <= XSM_CH_TEMP_REMTE)){
AdcData = (u16) (XSysmonPsu_ReadReg(EffectiveBaseAddress + XSM_ADC_CH_OFFSET +
(((u32)Channel - XSM_CH_SUPPLY7) << 2U)));
} else {
AdcData = (u16) (XSysmonPsu_ReadReg(EffectiveBaseAddress + XSM_AMS_CH_OFFSET +
(((u32)Channel - XSM_CH_VCC_PSLL0) << 2U)));
}
return AdcData;
}
/****************************************************************************/
/**
*
* This function gets the calibration coefficient data for the specified
* parameter.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param CoeffType specifies the calibration coefficient
* to be read. Use XSM_CALIB_* constants defined in xsysmonpsu.h to
* specify the calibration coefficient to be read.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return A 16-bit value representing the calibration coefficient.
* The System Monitor device guarantees a 10 bit resolution for
* the ADC converted data and data is the 10 MSB bits of the 16
* data read from the device.
*
* @note None.
*
*****************************************************************************/
u16 XSysMonPsu_GetCalibCoefficient(XSysMonPsu *InstancePtr, u8 CoeffType,
u32 SysmonBlk)
{
u16 CalibData;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid(CoeffType <= XSM_CALIB_GAIN_ERROR_COEFF);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Read the selected calibration coefficient. */
CalibData = (u16) XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CAL_SUP_OFF_OFFSET + ((u32)CoeffType << 2U));
return CalibData;
}
/****************************************************************************/
/**
*
* This function reads the Minimum/Maximum measurement for one of the
* XSM_MIN_* or XSM_MAX_* constants defined in xsysmonpsu.h
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param MeasurementType specifies the parameter for which the
* Minimum/Maximum measurement has to be read.
* Use XSM_MAX_* and XSM_MIN_* constants defined in xsysmonpsu.h to
* specify the data to be read.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return A 16-bit value representing the maximum/minimum measurement for
* specified parameter.
* The System Monitor device guarantees a 10 bit resolution for
* the ADC converted data and data is the 10 MSB bits of 16 bit
* data read from the device.
*
*****************************************************************************/
u16 XSysMonPsu_GetMinMaxMeasurement(XSysMonPsu *InstancePtr, u8 MeasurementType,
u32 SysmonBlk)
{
u16 MinMaxData;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((MeasurementType <= XSM_MAX_SUPPLY6) ||
((MeasurementType >= XSM_MIN_SUPPLY4) &&
(MeasurementType <= XSM_MIN_SUPPLY6)) ||
((MeasurementType >= XSM_MAX_SUPPLY7) &&
(MeasurementType <= XSM_MAX_TEMP_REMOTE)) ||
((MeasurementType >= XSM_MIN_SUPPLY7) &&
(MeasurementType <= XSM_MIN_TEMP_REMOTE)));
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Read and return the specified Minimum/Maximum measurement. */
MinMaxData = (u16) (XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSM_MIN_MAX_CH_OFFSET + ((u32)MeasurementType << 2U)));
return MinMaxData;
}
/****************************************************************************/
/**
*
* This function sets the number of samples of averaging that is to be done for
* all the channels in both the single channel mode and sequence mode of
* operations.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param Average is the number of samples of averaging programmed to the
* Configuration Register 0. Use the XSM_AVG_* definitions defined
* in xsysmonpsu.h file :
* - XSM_AVG_0_SAMPLES for no averaging
* - XSM_AVG_16_SAMPLES for 16 samples of averaging
* - XSM_AVG_64_SAMPLES for 64 samples of averaging
* - XSM_AVG_256_SAMPLES for 256 samples of averaging
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return None.
*
* @note None.
*
*****************************************************************************/
void XSysMonPsu_SetAvg(XSysMonPsu *InstancePtr, u8 Average, u32 SysmonBlk)
{
u32 RegValue;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertVoid(Average <= XSM_AVG_256_SAMPLES);
Xil_AssertVoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Write the averaging value into the Configuration Register 0. */
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress + XSYSMONPSU_CFG_REG0_OFFSET)
& (u32)(~XSYSMONPSU_CFG_REG0_AVRGNG_MASK);
RegValue |= (((u32) Average << XSYSMONPSU_CFG_REG0_AVRGNG_SHIFT));
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_CFG_REG0_OFFSET,
RegValue);
}
/****************************************************************************/
/**
*
* This function returns the number of samples of averaging configured for all
* the channels in the Configuration Register 0.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return The averaging read from the Configuration Register 0 is
* returned. Use the XSM_AVG_* bit definitions defined in xsysmonpsu.h
* file to interpret the returned value :
* - XSM_AVG_0_SAMPLES means no averaging
* - XSM_AVG_16_SAMPLES means 16 samples of averaging
* - XSM_AVG_64_SAMPLES means 64 samples of averaging
* - XSM_AVG_256_SAMPLES means 256 samples of averaging
*
* @note None.
*
*****************************************************************************/
u8 XSysMonPsu_GetAvg(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u32 Average;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Read the averaging value from the Configuration Register 0. */
Average = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG0_OFFSET) & XSYSMONPSU_CFG_REG0_AVRGNG_MASK;
return (u8)(Average >> XSYSMONPSU_CFG_REG0_AVRGNG_SHIFT);
}
/****************************************************************************/
/**
*
* The function sets the given parameters in the Configuration Register 0 in
* the single channel mode.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param Channel is the channel number for conversion. The valid
* channels are 0 - 6, 8 - 10, 13 - 37.
* @param IncreaseAcqCycles is a boolean parameter which specifies whether
* the Acquisition time for the external channels has to be
* increased to 10 ADCCLK cycles (specify TRUE) or remain at the
* default 4 ADCCLK cycles (specify FALSE). This parameter is
* only valid for the external channels.
* @param IsEventMode is a boolean parameter that specifies continuous
* sampling (specify FALSE) or event driven sampling mode (specify
* TRUE) for the given channel.
* @param IsDifferentialMode is a boolean parameter which specifies
* unipolar(specify FALSE) or differential mode (specify TRUE) for
* the analog inputs. The input mode is only valid for the
* external channels.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return
* - XST_SUCCESS if the given values were written successfully to
* the Configuration Register 0.
* - XST_FAILURE if the channel sequencer is enabled or the input
* parameters are not valid for the selected channel.
*
* @note
* - The number of samples for the averaging for all the channels
* is set by using the function XSysMonPsu_SetAvg.
* - The calibration of the device is done by doing a ADC
* conversion on the calibration channel(channel 8). The input
* parameters IncreaseAcqCycles, IsDifferentialMode and
* IsEventMode are not valid for this channel.
*
*****************************************************************************/
s32 XSysMonPsu_SetSingleChParams(XSysMonPsu *InstancePtr, u8 Channel,
u32 IncreaseAcqCycles, u32 IsEventMode,
u32 IsDifferentialMode, u32 SysmonBlk)
{
u32 RegValue;
u32 EffectiveBaseAddress;
s32 Status;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((Channel <= XSM_CH_SUPPLY3) ||
((Channel >= XSM_CH_SUPPLY_CALIB) &&
(Channel <= XSM_CH_GAINERR_CALIB)) ||
((Channel >= XSM_CH_SUPPLY4) &&
(Channel <= XSM_CH_TEMP_REMTE)) ||
((Channel >= XSM_CH_VCC_PSLL0) &&
(Channel <= XSM_CH_RESERVE1)));
Xil_AssertNonvoid((IncreaseAcqCycles == TRUE) ||
(IncreaseAcqCycles == FALSE));
Xil_AssertNonvoid((IsEventMode == TRUE) || (IsEventMode == FALSE));
Xil_AssertNonvoid((IsDifferentialMode == TRUE) ||
(IsDifferentialMode == FALSE));
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Check if the device is in single channel mode else return failure */
if ((XSysMonPsu_GetSequencerMode(InstancePtr, SysmonBlk)
!= XSM_SEQ_MODE_SINGCHAN)) {
Status = (s32)XST_FAILURE;
goto End;
}
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Read the Configuration Register 0 and extract out Averaging value. */
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG0_OFFSET) & XSYSMONPSU_CFG_REG0_AVRGNG_MASK;
/*
* Select the number of acquisition cycles. The acquisition cycles is
* only valid for the external channels.
*/
if (IncreaseAcqCycles == TRUE) {
if (((Channel >= XSM_CH_AUX_MIN) && (Channel <= XSM_CH_AUX_MAX))
|| (Channel == XSM_CH_VPVN)) {
RegValue |= XSYSMONPSU_CFG_REG0_ACQ_MASK;
} else {
Status = (s32)XST_FAILURE;
goto End;
}
}
/*
* Select the input mode. The input mode is only valid for the
* external channels.
*/
if (IsDifferentialMode == TRUE) {
if (((Channel >= XSM_CH_AUX_MIN) && (Channel <= XSM_CH_AUX_MAX))
|| (Channel == XSM_CH_VPVN)) {
RegValue |= XSYSMONPSU_CFG_REG0_BU_MASK;
} else {
Status = (s32)XST_FAILURE;
goto End;
}
}
/* Select the ADC mode. */
if (IsEventMode == TRUE) {
RegValue |= XSYSMONPSU_CFG_REG0_EC_MASK;
}
/* Write the given values into the Configuration Register 0. */
RegValue |= ((u32)Channel & XSYSMONPSU_CFG_REG0_MUX_CH_MASK);
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_CFG_REG0_OFFSET,
RegValue);
Status = (s32)XST_SUCCESS;
End:
return Status;
}
/****************************************************************************/
/**
*
* This function enables the alarm outputs for the specified alarms in the
* Configuration Registers 1:
*
* - OT for Over Temperature (XSYSMONPSU_CFR_REG1_ALRM_OT_MASK)
* - ALM0 for On board Temperature (XSYSMONPSU_CFR_REG1_ALRM_TEMP_MASK)
* - ALM1 for SUPPLY1 (XSYSMONPSU_CFR_REG1_ALRM_SUPPLY1_MASK)
* - ALM2 for SUPPLY2 (XSYSMONPSU_CFR_REG1_ALRM_SUPPLY2_MASK)
* - ALM3 for SUPPLY3 (XSYSMONPSU_CFR_REG1_ALRM_SUPPLY3_MASK)
* - ALM4 for SUPPLY4 (XSYSMONPSU_CFR_REG1_ALRM__SUPPLY4_MASK)
* - ALM5 for SUPPLY5 (XSYSMONPSU_CFR_REG1_ALRM_SUPPLY5_MASK)
* - ALM6 for SUPPLY6 (XSYSMONPSU_CFR_REG1_ALRM_SUPPLY6_MASK)
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param AlmEnableMask is the bit-mask of the alarm outputs to be enabled
* in the Configuration Registers 1 and 3.
* Bit positions of 1 will be enabled. Bit positions of 0 will be
* disabled. This mask is formed by OR'ing XSYSMONPSU_CFR_REG1_ALRM_*_MASK
* masks defined in xsysmonpsu.h, but XSM_CFR_ALM_SUPPLY8_MASK to
* XSM_CFR_ALM_SUPPLY13_MASK are applicable only for PS.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return None.
*
* @note The implementation of the alarm enables in the Configuration
* register 1 is such that the alarms for bit positions of 0 will
* be enabled and alarms for bit positions of 1 will be disabled.
* The alarm outputs specified by the AlmEnableMask are negated
* before writing to the Configuration Register 1 because it
* was Disable register bits.
* Upper 16 bits of AlmEnableMask are applicable only for PS.
*
*****************************************************************************/
void XSysMonPsu_SetAlarmEnables(XSysMonPsu *InstancePtr, u32 AlmEnableMask,
u32 SysmonBlk)
{
u32 RegValue;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertVoid(AlmEnableMask <=
(XSYSMONPSU_CFG_REG1_ALRM_ALL_MASK |
(XSYSMONPSU_CFG_REG3_ALRM_ALL_MASK << XSM_CFG_ALARM_SHIFT)));
Xil_AssertVoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG1_OFFSET);
RegValue &= (u32)(~XSYSMONPSU_CFG_REG1_ALRM_ALL_MASK);
RegValue |= (~AlmEnableMask & (u32)XSYSMONPSU_CFG_REG1_ALRM_ALL_MASK);
/*
* Enable/disables the alarm enables for the specified alarm bits in the
* Configuration Register 1.
*/
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_CFG_REG1_OFFSET,
RegValue);
/* Upper 16 bits of AlmEnableMask are valid only for PS */
if (SysmonBlk == XSYSMON_PS) {
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG3_OFFSET);
RegValue &= (u32)(~XSYSMONPSU_CFG_REG3_ALRM_ALL_MASK);
RegValue |= (~(AlmEnableMask >> XSM_CFG_ALARM_SHIFT) &
(u32)XSYSMONPSU_CFG_REG3_ALRM_ALL_MASK);
XSysmonPsu_WriteReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG3_OFFSET, RegValue);
}
}
/****************************************************************************/
/**
*
* This function gets the status of the alarm output enables in the
* Configuration Register 1.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return This is the bit-mask of the enabled alarm outputs in the
* Configuration Register 1. Use the masks XSYSMONPSU_CFG_REG1_ALRM_*_MASK
* masks defined in xsysmonpsu.h to interpret the returned value.
*
* Bit positions of 1 indicate that the alarm output is enabled.
* Bit positions of 0 indicate that the alarm output is disabled.
*
*
* @note The implementation of the alarm enables in the Configuration
* register 1 is such that alarms for the bit positions of 1 will
* be disabled and alarms for bit positions of 0 will be enabled.
* The enabled alarm outputs returned by this function is the
* negated value of the the data read from the Configuration
* Register 1. Upper 16 bits of return value are valid only if the
* channel selected is PS.
*
*****************************************************************************/
u32 XSysMonPsu_GetAlarmEnables(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u32 RegValue;
u32 EffectiveBaseAddress;
u32 ReadReg;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Read the status of alarm output enables from the Configuration
* Register 1.
*/
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG1_OFFSET) & XSYSMONPSU_CFG_REG1_ALRM_ALL_MASK;
RegValue = (~RegValue & XSYSMONPSU_CFG_REG1_ALRM_ALL_MASK);
if (SysmonBlk == XSYSMON_PS) {
ReadReg = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG3_OFFSET) & XSYSMONPSU_CFG_REG3_ALRM_ALL_MASK;
ReadReg = (~ReadReg & XSYSMONPSU_CFG_REG3_ALRM_ALL_MASK);
RegValue |= ReadReg << XSM_CFG_ALARM_SHIFT;
}
return RegValue;
}
/****************************************************************************/
/**
*
* This function sets the specified Channel Sequencer Mode in the Configuration
* Register 1 :
* - Default safe mode (XSM_SEQ_MODE_SAFE)
* - One pass through sequence (XSM_SEQ_MODE_ONEPASS)
* - Continuous channel sequencing (XSM_SEQ_MODE_CONTINPASS)
* - Single Channel/Sequencer off (XSM_SEQ_MODE_SINGCHAN)
* - Olympus sampling mode (XSM_SEQ_MODE_OYLMPUS)
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SequencerMode is the sequencer mode to be set.
* Use XSM_SEQ_MODE_* bits defined in xsysmonpsu.h.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return None.
*
* @note Only one of the modes can be enabled at a time.
*
*****************************************************************************/
void XSysMonPsu_SetSequencerMode(XSysMonPsu *InstancePtr, u8 SequencerMode,
u32 SysmonBlk)
{
u32 RegValue;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertVoid((SequencerMode <= XSM_SEQ_MODE_SINGCHAN) ||
(SequencerMode == XSM_SEQ_MODE_OYLMPUS));
Xil_AssertVoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Set the specified sequencer mode in the Configuration Register 1. */
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG1_OFFSET);
RegValue &= (u32)(~ XSYSMONPSU_CFG_REG1_SEQ_MDE_MASK);
RegValue |= (((u32)SequencerMode << XSYSMONPSU_CFG_REG1_SEQ_MDE_SHIFT) &
XSYSMONPSU_CFG_REG1_SEQ_MDE_MASK);
XSysmonPsu_WriteReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG1_OFFSET, RegValue);
}
/****************************************************************************/
/**
*
* This function gets the channel sequencer mode from the Configuration
* Register 1.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return The channel sequencer mode :
* - XSM_SEQ_MODE_SAFE : Default safe mode
* - XSM_SEQ_MODE_ONEPASS : One pass through sequence
* - XSM_SEQ_MODE_CONTINPASS : Continuous channel sequencing
* - XSM_SEQ_MODE_SINGCHAN : Single channel/Sequencer off
* - XSM_SEQ_MODE_OLYMPUS : Olympus sampling mode
*
* @note None.
*
*****************************************************************************/
u8 XSysMonPsu_GetSequencerMode(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u8 SequencerMode;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Read the channel sequencer mode from the Configuration Register 1. */
SequencerMode = ((u8) ((XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG1_OFFSET) & XSYSMONPSU_CFG_REG1_SEQ_MDE_MASK) >>
XSYSMONPSU_CFG_REG1_SEQ_MDE_SHIFT));
return SequencerMode;
}
/****************************************************************************/
/**
*
* The function enables the Event mode or Continuous mode in the sequencer mode.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param IsEventMode is a boolean parameter that specifies continuous
* sampling (specify FALSE) or event driven sampling mode (specify
* TRUE) for the channel.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return None.
*
* @note None.
*
*****************************************************************************/
void XSysMonPsu_SetSequencerEvent(XSysMonPsu *InstancePtr, u32 IsEventMode,
u32 SysmonBlk)
{
u32 RegValue;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertVoid((IsEventMode == TRUE) || (IsEventMode == FALSE));
Xil_AssertVoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Read the Configuration Register 0. */
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG0_OFFSET);
/* Set the ADC mode. */
if (IsEventMode == TRUE) {
RegValue |= XSYSMONPSU_CFG_REG0_EC_MASK;
} else {
RegValue &= (u32)(~XSYSMONPSU_CFG_REG0_EC_MASK);
}
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_CFG_REG0_OFFSET,
RegValue);
}
/****************************************************************************/
/**
*
* The function returns the mode of the sequencer.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return Returns the Sequencer mode. XSYSMONPSU_EVENT_MODE for Event mode
* and XSYSMONPSU_CONTINUOUS_MODE for continuous mode.
*
* @note None.
*
*****************************************************************************/
s32 XSysMonPsu_GetSequencerEvent(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
s32 Mode;
u32 RegValue;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Read the Configuration Register 0. */
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG0_OFFSET);
RegValue &= XSYSMONPSU_CFG_REG0_EC_MASK;
if (RegValue == XSYSMONPSU_CFG_REG0_EC_MASK) {
Mode = XSYSMONPSU_EVENT_MODE;
} else {
Mode = XSYSMONPSU_CONTINUOUS_MODE;
}
return Mode;
}
/****************************************************************************/
/**
*
* The function enables the external mux and connects a channel to the mux.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param Channel is the channel number used to connect to the external
* Mux. The valid channels are 0 to 5 and 16 to 31.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return
* - XST_SUCCESS if the given values were written successfully to
* the Configuration Register 0.
* - XST_FAILURE if the channel sequencer is enabled or the input
* parameters are not valid for the selected channel.
*
* @note None.
*
*****************************************************************************/
void XSysMonPsu_SetExtenalMux(XSysMonPsu *InstancePtr, u8 Channel, u32 SysmonBlk)
{
u32 RegValue;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertVoid((Channel <= XSM_CH_VREFN) ||
((Channel >= XSM_CH_AUX_MIN) &&
(Channel <= XSM_CH_AUX_MAX)));
Xil_AssertVoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Read the Configuration Register 0 and the clear the channel selection
* bits.
*/
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG0_OFFSET);
RegValue &= ~(XSYSMONPSU_CFG_REG0_MUX_CH_MASK);
/* Enable the External Mux and select the channel. */
RegValue |= (XSYSMONPSU_CFG_REG0_XTRNL_MUX_MASK | (u32)Channel);
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_CFG_REG0_OFFSET,
RegValue);
}
/****************************************************************************/
/**
*
* The function returns the external mux channel.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return Returns the channel number used to connect to the external
* Mux. The valid channels are 0 to 6, 8 to 16, and 31 to 36..
*
* @note None.
*
*****************************************************************************/
u32 XSysMonPsu_GetExtenalMux(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u32 RegValue;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Read the Configuration Register 0 and derive the channel selection
* bits.
*/
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG0_OFFSET);
RegValue &= XSYSMONPSU_CFG_REG0_MUX_CH_MASK;
return RegValue;
}
/****************************************************************************/
/**
*
* The function sets the frequency of the ADCCLK by configuring the DCLK to
* ADCCLK ratio in the Configuration Register #2.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param Divisor is clock divisor used to derive ADCCLK from DCLK.
* Valid values of the divisor are
* PS:
* - 0 means divide by 8.
* - 1,2 means divide by 2.
* - 3 to 255 means divide by that value.
* PL:
* - 0,1,2 means divide by 2.
* - 3 to 255 means divide by that value.
* Refer to the device specification for more details.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return None.
*
* @note - The ADCCLK is an internal clock used by the ADC and is
* synchronized to the DCLK clock. The ADCCLK is equal to DCLK
* divided by the user selection in the Configuration Register 2.
* - There is no Assert on the minimum value of the Divisor.
*
*****************************************************************************/
void XSysMonPsu_SetAdcClkDivisor(XSysMonPsu *InstancePtr, u8 Divisor,
u32 SysmonBlk)
{
u32 RegValue;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertVoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Read the Configuration Register 2 and the clear the clock divisor
* bits.
*/
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG2_OFFSET);
RegValue &= ~(XSYSMONPSU_CFG_REG2_CLK_DVDR_MASK);
/* Write the divisor value into the Configuration Register 2. */
RegValue |= ((u32)Divisor << XSYSMONPSU_CFG_REG2_CLK_DVDR_SHIFT) &
XSYSMONPSU_CFG_REG2_CLK_DVDR_MASK;
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_CFG_REG2_OFFSET,
RegValue);
}
/****************************************************************************/
/**
*
* The function gets the ADCCLK divisor from the Configuration Register 2.
*
* @param InstancePtr is a pointer to the XSysMon instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return The divisor read from the Configuration Register 2.
*
* @note The ADCCLK is an internal clock used by the ADC and is
* synchronized to the DCLK clock. The ADCCLK is equal to DCLK
* divided by the user selection in the Configuration Register 2.
*
*****************************************************************************/
u8 XSysMonPsu_GetAdcClkDivisor(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u16 Divisor;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Read the divisor value from the Configuration Register 2. */
Divisor = (u16) XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG2_OFFSET);
return (u8) (Divisor >> XSYSMONPSU_CFG_REG2_CLK_DVDR_SHIFT);
}
u8 XSysMonPsu_UpdateAdcClkDivisor(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u16 Divisor;
u32 EffectiveBaseAddress;
u32 RegValue;
u32 InputFreq = InstancePtr->Config.InputClockMHz;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Read the divisor value from the Configuration Register 2. */
Divisor = (u16) XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG2_OFFSET);
Divisor = Divisor >> XSYSMONPSU_CFG_REG2_CLK_DVDR_SHIFT;
while (1) {
if (!Divisor) {
if ((SysmonBlk == XSYSMON_PS) &&
(InputFreq/8 >= 1) && (InputFreq/8 <= 26)) {
break;
} else if ((SysmonBlk == XSYSMON_PL) &&
(InputFreq/2 >= 1) && (InputFreq/2 <= 26)) {
break;
}
} else if ((InputFreq/Divisor >= 1) &&
(InputFreq/Divisor <= 26)) {
break;
} else {
Divisor += 1;
}
}
/*
* Read the Configuration Register 2 and the clear the clock divisor
* bits.
*/
RegValue = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_CFG_REG2_OFFSET);
RegValue &= ~(XSYSMONPSU_CFG_REG2_CLK_DVDR_MASK);
/* Write the divisor value into the Configuration Register 2. */
RegValue |= ((u32)Divisor << XSYSMONPSU_CFG_REG2_CLK_DVDR_SHIFT) &
XSYSMONPSU_CFG_REG2_CLK_DVDR_MASK;
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_CFG_REG2_OFFSET,
RegValue);
return (u8)Divisor;
}
/****************************************************************************/
/**
*
* This function enables the specified channels in the ADC Channel Selection
* Sequencer Registers. The sequencer must be in the Safe Mode before writing
* to these registers.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param ChEnableMask is the bit mask of all the channels to be enabled.
* Use XSYSMONPSU_SEQ_CH* defined in xsysmon_hw.h to specify the Channel
* numbers. Bit masks of 1 will be enabled and bit mask of 0 will
* be disabled.
* The ChEnableMask is a 64 bit mask that is written to the three
* 16 bit ADC Channel Selection Sequencer Registers.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return
* - XST_SUCCESS if the given values were written successfully to
* the ADC Channel Selection Sequencer Registers.
* - XST_FAILURE if the channel sequencer is enabled.
*
* @note None.
*
*****************************************************************************/
s32 XSysMonPsu_SetSeqChEnables(XSysMonPsu *InstancePtr, u64 ChEnableMask,
u32 SysmonBlk)
{
s32 Status;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/*
* The sequencer must be in the Default Safe Mode before writing
* to these registers. Return XST_FAILURE if the channel sequencer
* is enabled.
*/
if ((XSysMonPsu_GetSequencerMode(InstancePtr,SysmonBlk) != XSM_SEQ_MODE_SAFE)) {
Status = (s32)XST_FAILURE;
goto End;
}
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Enable the specified channels in the ADC Channel Selection Sequencer
* Registers.
*/
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_SEQ_CH0_OFFSET,
(ChEnableMask & XSYSMONPSU_SEQ_CH0_VALID_MASK));
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_SEQ_CH1_OFFSET,
(ChEnableMask >> XSM_SEQ_CH_SHIFT) &
XSYSMONPSU_SEQ_CH1_VALID_MASK);
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_SEQ_CH2_OFFSET,
(ChEnableMask >> XSM_SEQ_CH2_SHIFT) &
XSYSMONPSU_SEQ_CH2_VALID_MASK);
Status = (s32)XST_SUCCESS;
End:
return Status;
}
/****************************************************************************/
/**
*
* This function gets the channel enable bits status from the ADC Channel
* Selection Sequencer Registers.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return Gets the channel enable bits. Use XSYSMONPSU_SEQ_CH* defined in
* xsysmonpsu_hw.h to interpret the Channel numbers. Bit masks of 1
* are the channels that are enabled and bit mask of 0 are
* the channels that are disabled.
*
* @return None.
*
* @note None.
*
*****************************************************************************/
u64 XSysMonPsu_GetSeqChEnables(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u64 RegVal;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Read the channel enable bits for all the channels from the ADC
* Channel Selection Register.
*/
RegVal = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_CH0_OFFSET) & XSYSMONPSU_SEQ_CH0_VALID_MASK;
RegVal |= (XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_CH1_OFFSET) & XSYSMONPSU_SEQ_CH1_VALID_MASK) <<
XSM_SEQ_CH_SHIFT;
RegVal |= (u64)(XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_CH2_OFFSET) &
XSYSMONPSU_SEQ_CH2_VALID_MASK) << XSM_SEQ_CH2_SHIFT;
return RegVal;
}
/****************************************************************************/
/**
*
* This function enables the averaging for the specified channels in the ADC
* Channel Averaging Enable Sequencer Registers. The sequencer must be in
* the Safe Mode before writing to these registers.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param AvgEnableChMask is the bit mask of all the channels for which
* averaging is to be enabled. Use XSYSMONPSU_SEQ_AVERAGE* defined in
* xsysmonpsu_hw.h to specify the Channel numbers. Averaging will be
* enabled for bit masks of 1 and disabled for bit mask of 0.
* The AvgEnableChMask is a 64 bit mask that is written to the
* three 16 bit ADC Channel Averaging Enable Sequencer Registers.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return
* - XST_SUCCESS if the given values were written successfully to
* the ADC Channel Averaging Enables Sequencer Registers.
* - XST_FAILURE if the channel sequencer is enabled.
*
* @note None.
*
*****************************************************************************/
s32 XSysMonPsu_SetSeqAvgEnables(XSysMonPsu *InstancePtr, u64 AvgEnableChMask,
u32 SysmonBlk)
{
s32 Status;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/*
* The sequencer must be disabled for writing any of these registers.
* Return XST_FAILURE if the channel sequencer is enabled.
*/
if ((XSysMonPsu_GetSequencerMode(InstancePtr,SysmonBlk)
!= XSM_SEQ_MODE_SAFE)) {
Status = (s32)XST_FAILURE;
} else {
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Enable/disable the averaging for the specified channels in the
* ADC Channel Averaging Enables Sequencer Registers.
*/
XSysmonPsu_WriteReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_AVERAGE0_OFFSET,
(AvgEnableChMask & XSYSMONPSU_SEQ_AVERAGE0_MASK));
XSysmonPsu_WriteReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_AVERAGE1_OFFSET,
(AvgEnableChMask >> XSM_SEQ_CH_SHIFT) &
XSYSMONPSU_SEQ_AVERAGE1_MASK);
XSysmonPsu_WriteReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_AVERAGE2_OFFSET,
(AvgEnableChMask >> XSM_SEQ_CH2_SHIFT) &
XSYSMONPSU_SEQ_AVERAGE2_MASK);
Status = (s32)XST_SUCCESS;
}
return Status;
}
/****************************************************************************/
/**
*
* This function returns the channels for which the averaging has been enabled
* in the ADC Channel Averaging Enables Sequencer Registers.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @returns The status of averaging (enabled/disabled) for all the channels.
* Use XSYSMONPSU_SEQ_AVERAGE* defined in xsysmonpsu_hw.h to interpret the
* Channel numbers. Bit masks of 1 are the channels for which
* averaging is enabled and bit mask of 0 are the channels for
* averaging is disabled.
*
* @note None.
*
*****************************************************************************/
u64 XSysMonPsu_GetSeqAvgEnables(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u64 RegVal;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Read the averaging enable status for all the channels from the
* ADC Channel Averaging Enables Sequencer Registers.
*/
RegVal = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_AVERAGE0_OFFSET) & XSYSMONPSU_SEQ_AVERAGE0_MASK;
RegVal |= (XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_AVERAGE1_OFFSET) & XSYSMONPSU_SEQ_AVERAGE1_MASK) <<
XSM_SEQ_CH_SHIFT;
RegVal |= (u64)(XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_AVERAGE2_OFFSET) &
XSYSMONPSU_SEQ_AVERAGE2_MASK) << XSM_SEQ_CH2_SHIFT;
return RegVal;
}
/****************************************************************************/
/**
*
* This function sets the Analog input mode for the specified channels in the
* ADC Channel Analog-Input Mode Sequencer Registers. The sequencer must be in
* the Safe Mode before writing to these registers.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param InputModeChMask is the bit mask of all the channels for which
* the input mode is differential mode. Use XSYSMONPSU_SEQ_INPUT_MDE*
* defined in xsysmonpsu_hw.h to specify the channel numbers. Differential
* or Bipolar input mode will be set for bit masks of 1 and unipolar input
* mode for bit masks of 0.
* The InputModeChMask is a 64 bit mask that is written to the three
* 16 bit ADC Channel Analog-Input Mode Sequencer Registers.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return
* - XST_SUCCESS if the given values were written successfully to
* the ADC Channel Analog-Input Mode Sequencer Registers.
* - XST_FAILURE if the channel sequencer is enabled.
*
* @note None.
*
*****************************************************************************/
s32 XSysMonPsu_SetSeqInputMode(XSysMonPsu *InstancePtr, u64 InputModeChMask,
u32 SysmonBlk)
{
s32 Status;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/*
* The sequencer must be in the Safe Mode before writing to
* these registers. Return XST_FAILURE if the channel sequencer
* is enabled.
*/
if ((XSysMonPsu_GetSequencerMode(InstancePtr,SysmonBlk)
!= XSM_SEQ_MODE_SAFE)) {
Status = (s32)XST_FAILURE;
goto End;
}
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Set the input mode for the specified channels in the ADC Channel
* Analog-Input Mode Sequencer Registers.
*/
XSysmonPsu_WriteReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_INPUT_MDE0_OFFSET,
(InputModeChMask & XSYSMONPSU_SEQ_INPUT_MDE0_MASK));
XSysmonPsu_WriteReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_INPUT_MDE1_OFFSET,
(InputModeChMask >> XSM_SEQ_CH_SHIFT) &
XSYSMONPSU_SEQ_INPUT_MDE1_MASK);
XSysmonPsu_WriteReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_INPUT_MDE2_OFFSET,
(InputModeChMask >> XSM_SEQ_CH2_SHIFT) &
XSYSMONPSU_SEQ_INPUT_MDE2_MASK);
Status = (s32)XST_SUCCESS;
End:
return Status;
}
/****************************************************************************/
/**
*
* This function gets the Analog input mode for all the channels from
* the ADC Channel Analog-Input Mode Sequencer Registers.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @returns The input mode for all the channels.
* Use XSYSMONPSU_SEQ_INPUT_MDE* defined in xsysmonpsu_hw.h to interpret the
* Channel numbers. Bit masks of 1 are the channels for which
* input mode is differential/Bipolar and bit mask of 0 are the channels
* for which input mode is unipolar.
*
* @note None.
*
*****************************************************************************/
u64 XSysMonPsu_GetSeqInputMode(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u64 InputMode;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Get the input mode for all the channels from the ADC Channel
* Analog-Input Mode Sequencer Registers.
*/
InputMode = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_INPUT_MDE0_OFFSET) & XSYSMONPSU_SEQ_INPUT_MDE0_MASK;
InputMode |= (XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_INPUT_MDE1_OFFSET) & XSYSMONPSU_SEQ_INPUT_MDE1_MASK) <<
XSM_SEQ_CH_SHIFT;
InputMode |= (u64)(XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_INPUT_MDE2_OFFSET) &
XSYSMONPSU_SEQ_INPUT_MDE2_MASK) << XSM_SEQ_CH2_SHIFT;
return InputMode;
}
/****************************************************************************/
/**
*
* This function sets the number of Acquisition cycles in the ADC Channel
* Acquisition Time Sequencer Registers. The sequencer must be in the Safe Mode
* before writing to these registers.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param AcqCyclesChMask is the bit mask of all the channels for which
* the number of acquisition cycles is to be extended.
* Use XSYSMONPSU_SEQ_ACQ* defined in xsysmonpsu_hw.h to specify the Channel
* numbers. Acquisition cycles will be extended to 10 ADCCLK cycles
* for bit masks of 1 and will be the default 4 ADCCLK cycles for
* bit masks of 0.
* The AcqCyclesChMask is a 64 bit mask that is written to the three
* 16 bit ADC Channel Acquisition Time Sequencer Registers.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return
* - XST_SUCCESS if the given values were written successfully to
* the Channel Sequencer Registers.
* - XST_FAILURE if the channel sequencer is enabled.
*
* @note None.
*
*****************************************************************************/
s32 XSysMonPsu_SetSeqAcqTime(XSysMonPsu *InstancePtr, u64 AcqCyclesChMask,
u32 SysmonBlk)
{
s32 Status;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/*
* The sequencer must be in the Safe Mode before writing
* to these registers. Return XST_FAILURE if the channel
* sequencer is enabled.
*/
if ((XSysMonPsu_GetSequencerMode(InstancePtr,SysmonBlk)
!= XSM_SEQ_MODE_SAFE)) {
Status = (s32)XST_FAILURE;
goto End;
}
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Set the Acquisition time for the specified channels in the
* ADC Channel Acquisition Time Sequencer Registers.
*/
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_SEQ_ACQ0_OFFSET,
(AcqCyclesChMask & XSYSMONPSU_SEQ_ACQ0_MASK));
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_SEQ_ACQ1_OFFSET,
(AcqCyclesChMask >> XSM_SEQ_CH_SHIFT) & XSYSMONPSU_SEQ_ACQ1_MASK);
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_SEQ_ACQ2_OFFSET,
(AcqCyclesChMask >> XSM_SEQ_CH2_SHIFT) &
XSYSMONPSU_SEQ_ACQ2_MASK);
Status = (s32)XST_SUCCESS;
End:
return Status;
}
/****************************************************************************/
/**
*
* This function gets the status of acquisition time from the ADC Channel Acquisition
* Time Sequencer Registers.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @returns The acquisition time for all the channels.
* Use XSYSMONPSU_SEQ_ACQ* defined in xsysmonpsu_hw.h to interpret the
* Channel numbers. Bit masks of 1 are the channels for which
* acquisition cycles are extended and bit mask of 0 are the
* channels for which acquisition cycles are not extended.
*
* @note None.
*
*****************************************************************************/
u64 XSysMonPsu_GetSeqAcqTime(XSysMonPsu *InstancePtr, u32 SysmonBlk)
{
u64 RegValAcq;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Get the Acquisition cycles for the specified channels from the ADC
* Channel Acquisition Time Sequencer Registers.
*/
RegValAcq = XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_ACQ0_OFFSET) & XSYSMONPSU_SEQ_ACQ0_MASK;
RegValAcq |= (XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_ACQ1_OFFSET) & XSYSMONPSU_SEQ_ACQ1_MASK) <<
XSM_SEQ_CH_SHIFT;
RegValAcq |= (u64)(XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_SEQ_ACQ2_OFFSET) &
XSYSMONPSU_SEQ_ACQ2_MASK) << XSM_SEQ_CH2_SHIFT;
return RegValAcq;
}
/****************************************************************************/
/**
*
* This functions sets the contents of the given Alarm Threshold Register.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param AlarmThrReg is the index of an Alarm Threshold Register to
* be set. Use XSM_ATR_* constants defined in xsysmonpsu.h to
* specify the index.
* @param Value is the 16-bit threshold value to write into the register.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return None.
*
* @note None.
*
*****************************************************************************/
void XSysMonPsu_SetAlarmThreshold(XSysMonPsu *InstancePtr, u8 AlarmThrReg,
u16 Value, u32 SysmonBlk)
{
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertVoid((AlarmThrReg <= XSM_ATR_TEMP_RMTE_UPPER) ||
((AlarmThrReg >= XSM_ATR_SUP7_LOWER) &&
(AlarmThrReg <= XSM_ATR_TEMP_RMTE_LOWER)));
Xil_AssertVoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/* Write the value into the specified Alarm Threshold Register. */
XSysmonPsu_WriteReg(EffectiveBaseAddress + XSYSMONPSU_ALRM_TEMP_UPR_OFFSET +
((u32)AlarmThrReg << 2U), Value);
}
/****************************************************************************/
/**
*
* This function returns the contents of the specified Alarm Threshold Register.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
* @param AlarmThrReg is the index of an Alarm Threshold Register
* to be read. Use XSM_ATR_* constants defined in xsysmonpsu.h
* to specify the index.
* @param SysmonBlk is the value that tells whether it is for PS Sysmon
* block or PL Sysmon block register region.
*
* @return A 16-bit value representing the contents of the selected Alarm
* Threshold Register.
*
* @note None.
*
*****************************************************************************/
u16 XSysMonPsu_GetAlarmThreshold(XSysMonPsu *InstancePtr, u8 AlarmThrReg,
u32 SysmonBlk)
{
u16 AlarmThreshold;
u32 EffectiveBaseAddress;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertNonvoid((AlarmThrReg <= XSM_ATR_TEMP_RMTE_UPPER) ||
((AlarmThrReg >= XSM_ATR_SUP7_LOWER) &&
(AlarmThrReg <= XSM_ATR_TEMP_RMTE_LOWER)));
Xil_AssertNonvoid((SysmonBlk == XSYSMON_PS)||(SysmonBlk == XSYSMON_PL));
/* Calculate the effective baseaddress based on the Sysmon instance. */
EffectiveBaseAddress =
XSysMonPsu_GetEffBaseAddress(InstancePtr->Config.BaseAddress,
SysmonBlk);
/*
* Read the specified Alarm Threshold Register and return
* the value.
*/
AlarmThreshold = (u16) XSysmonPsu_ReadReg(EffectiveBaseAddress +
XSYSMONPSU_ALRM_TEMP_UPR_OFFSET + ((u32)AlarmThrReg << 2));
return AlarmThreshold;
}
/****************************************************************************/
/**
*
* This function sets the conversion to be automatic for PS SysMon.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
*
* @return None
*
* @note In the auto-trigger mode, sample rate is of 1 Million samples.
*
*****************************************************************************/
void XSysMonPsu_SetPSAutoConversion(XSysMonPsu *InstancePtr)
{
u32 PSSysMonStatusReg;
/* Assert the arguments. */
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
/* Set the automatic conversion triggering in PS control register. */
PSSysMonStatusReg = XSysmonPsu_ReadReg(InstancePtr->Config.BaseAddress +
XSYSMONPSU_PS_SYSMON_CSTS_OFFSET);
PSSysMonStatusReg |= XSYSMONPSU_PS_SYSMON_CSTS_AUTO_CONVST_MASK;
XSysmonPsu_WriteReg(InstancePtr->Config.BaseAddress +
XSYSMONPSU_PS_SYSMON_CSTS_OFFSET, PSSysMonStatusReg);
}
/****************************************************************************/
/**
*
* This function gets the AMS monitor status.
*
* @param InstancePtr is a pointer to the XSysMonPsu instance.
*
* @return Returns the monitor status. See XSYSMONPSU_MON_STS_*_MASK
* definations present in xsysmonpsu_hw.h for knowing the status.
*
* @note None
* .
*****************************************************************************/
u32 XSysMonPsu_GetMonitorStatus(XSysMonPsu *InstancePtr)
{
u32 AMSMonStatusReg;
/* Assert the arguments. */
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
/*
* Read the AMS monitor status. This gives tells about JTAG Locked / ADC
* busy / ADC Current Channel number and its ADC output.
*/
AMSMonStatusReg = XSysmonPsu_ReadReg(InstancePtr->Config.BaseAddress +
XSYSMONPSU_MON_STS_OFFSET);
return AMSMonStatusReg;
}
/** @} */