
This patch adds the support for Zynq Ultrascale Mp. Modified driver code for MISRA-C:2012 and cleaned up. Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
1201 lines
39 KiB
C
Executable file
1201 lines
39 KiB
C
Executable file
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2010 - 2014 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 THE
|
|
* XILINX CONSORTIUM 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 xcanps.c
|
|
*
|
|
* Functions in this file are the minimum required functions for the XCanPs
|
|
* driver. See xcanps.h for a detailed description of the driver.
|
|
*
|
|
* @note None.
|
|
*
|
|
*
|
|
* <pre>
|
|
* MODIFICATION HISTORY:
|
|
*
|
|
* Ver Who Date Changes
|
|
* ----- ----- -------- -----------------------------------------------
|
|
* 1.00a xd/sv 01/12/10 First release
|
|
* 1.01a bss 12/27/11 Added the APIs XCanPs_SetTxIntrWatermark and
|
|
* XCanPs_GetTxIntrWatermark.
|
|
* </pre>
|
|
*
|
|
******************************************************************************/
|
|
|
|
/***************************** Include Files *********************************/
|
|
|
|
#include "xcanps.h"
|
|
|
|
/************************** Constant Definitions *****************************/
|
|
|
|
/**************************** Type Definitions *******************************/
|
|
|
|
/***************** Macros (Inline Functions) Definitions *********************/
|
|
|
|
/************************** Variable Definitions *****************************/
|
|
|
|
/************************** Function Prototypes ******************************/
|
|
|
|
static void StubHandler(void);
|
|
|
|
/*****************************************************************************/
|
|
/*
|
|
*
|
|
* This function initializes a XCanPs instance/driver.
|
|
*
|
|
* The initialization entails:
|
|
* - Initialize all members of the XCanPs structure.
|
|
* - Reset the CAN device. The CAN device will enter Configuration Mode
|
|
* immediately after the reset is finished.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param ConfigPtr points to the XCanPs 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 always.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
s32 XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr,
|
|
u32 EffectiveAddr)
|
|
{
|
|
s32 Status;
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(ConfigPtr != NULL);
|
|
|
|
/*
|
|
* Set some default values for instance data, don't indicate the device
|
|
* is ready to use until everything has been initialized successfully.
|
|
*/
|
|
InstancePtr->IsReady = 0U;
|
|
InstancePtr->CanConfig.BaseAddr = EffectiveAddr;
|
|
InstancePtr->CanConfig.DeviceId = ConfigPtr->DeviceId;
|
|
|
|
/*
|
|
* Set all handlers to stub values, let user configure this data later.
|
|
*/
|
|
InstancePtr->SendHandler = (XCanPs_SendRecvHandler) StubHandler;
|
|
InstancePtr->RecvHandler = (XCanPs_SendRecvHandler) StubHandler;
|
|
InstancePtr->ErrorHandler = (XCanPs_ErrorHandler) StubHandler;
|
|
InstancePtr->EventHandler = (XCanPs_EventHandler) StubHandler;
|
|
|
|
/*
|
|
* Indicate the component is now ready to use.
|
|
*/
|
|
InstancePtr->IsReady = XIL_COMPONENT_IS_READY;
|
|
|
|
/*
|
|
* Reset the device to get it into its initial state.
|
|
*/
|
|
XCanPs_Reset(InstancePtr);
|
|
|
|
Status = XST_SUCCESS;
|
|
return Status;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function resets the CAN device. Calling this function resets the device
|
|
* immediately, and any pending transmission or reception is terminated at once.
|
|
* Both Object Layer and Transfer Layer are reset. This function does not reset
|
|
* the Physical Layer. All registers are reset to the default values, and no
|
|
* previous status will be restored. TX FIFO, RX FIFO and TX High Priority
|
|
* Buffer are also reset.
|
|
*
|
|
* When a reset is required due to an internal error, the driver notifies the
|
|
* upper layer software of this need through the error status code or interrupts.
|
|
* The upper layer software is responsible for calling this Reset function and
|
|
* then re-configuring the device.
|
|
*
|
|
* The CAN device will be in Configuration Mode immediately after this function
|
|
* returns.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCanPs_Reset(XCanPs *InstancePtr)
|
|
{
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_SRR_OFFSET, \
|
|
XCANPS_SRR_SRST_MASK);
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine returns the current operation mode of the CAN device.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
*
|
|
* @return
|
|
* - XCANPS_MODE_CONFIG if the device is in Configuration Mode.
|
|
* - XCANPS_MODE_SLEEP if the device is in Sleep Mode.
|
|
* - XCANPS_MODE_NORMAL if the device is in Normal Mode.
|
|
* - XCANPS_MODE_LOOPBACK if the device is in Loop Back Mode.
|
|
* - XCANPS_MODE_SNOOP if the device is in Snoop Mode.
|
|
*
|
|
* @note None.
|
|
*
|
|
*****************************************************************************/
|
|
u8 XCanPs_GetMode(XCanPs *InstancePtr)
|
|
{
|
|
u32 StatusReg;
|
|
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
StatusReg = XCanPs_GetStatus(InstancePtr);
|
|
|
|
if ((StatusReg & XCANPS_SR_CONFIG_MASK) != (u32)0) {
|
|
return (u8)XCANPS_MODE_CONFIG;
|
|
|
|
}
|
|
else if ((StatusReg & XCANPS_SR_SLEEP_MASK) != (u32)0) {
|
|
return (u8)XCANPS_MODE_SLEEP;
|
|
|
|
}
|
|
else if ((StatusReg & XCANPS_SR_NORMAL_MASK) != (u32)0) {
|
|
if ((StatusReg & XCANPS_SR_SNOOP_MASK) != (u32)0) {
|
|
return (u8)XCANPS_MODE_SNOOP;
|
|
} else {
|
|
return (u8)XCANPS_MODE_NORMAL;
|
|
}
|
|
}
|
|
else {
|
|
/*
|
|
* If this line is reached, the device is in Loop Back Mode.
|
|
*/
|
|
return (u8)XCANPS_MODE_LOOPBACK;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function allows the CAN device to enter one of the following operation
|
|
* modes:
|
|
* - Configuration Mode: Pass in parameter XCANPS_MODE_CONFIG
|
|
* - Sleep Mode: Pass in parameter XCANPS_MODE_SLEEP
|
|
* - Normal Mode: Pass in parameter XCANPS_MODE_NORMAL
|
|
* - Loop Back Mode: Pass in parameter XCANPS_MODE_LOOPBACK.
|
|
* - Snoop Mode: Pass in parameter XCANPS_MODE_SNOOP.
|
|
*
|
|
* Read the xcanps.h file and device specification for detailed description of
|
|
* each operation mode.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param OperationMode specify which operation mode to enter. Valid value
|
|
* is any of XCANPS_MODE_* defined in xcanps.h. Multiple modes
|
|
* can not be entered at the same time.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note
|
|
*
|
|
* This function does NOT ensure CAN device enters the specified operation mode
|
|
* before it returns the control to the caller. The caller is responsible for
|
|
* checking current operation mode using XCanPs_GetMode().
|
|
*
|
|
******************************************************************************/
|
|
void XCanPs_EnterMode(XCanPs *InstancePtr, u8 OperationMode)
|
|
{
|
|
u8 CurrentMode;
|
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
Xil_AssertVoid((OperationMode == (u8)XCANPS_MODE_CONFIG) ||
|
|
(OperationMode == (u8)XCANPS_MODE_SLEEP) ||
|
|
(OperationMode == (u8)XCANPS_MODE_NORMAL) ||
|
|
(OperationMode == (u8)XCANPS_MODE_LOOPBACK) ||
|
|
(OperationMode == (u8)XCANPS_MODE_SNOOP));
|
|
|
|
CurrentMode = XCanPs_GetMode(InstancePtr);
|
|
|
|
/*
|
|
* If current mode is Normal Mode and the mode to enter is Sleep Mode,
|
|
* or if current mode is Sleep Mode and the mode to enter is Normal
|
|
* Mode, no transition through Configuration Mode is needed.
|
|
*/
|
|
if ((CurrentMode == (u8)XCANPS_MODE_NORMAL) &&
|
|
(OperationMode == (u8)XCANPS_MODE_SLEEP)) {
|
|
/*
|
|
* Normal Mode ---> Sleep Mode
|
|
*/
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_MSR_OFFSET, XCANPS_MSR_SLEEP_MASK);
|
|
return;
|
|
|
|
} else if ((CurrentMode == (u8)XCANPS_MODE_SLEEP) &&
|
|
(OperationMode == (u8)XCANPS_MODE_NORMAL)) {
|
|
/*
|
|
* Sleep Mode ---> Normal Mode
|
|
*/
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_MSR_OFFSET, 0U);
|
|
return;
|
|
}
|
|
else {
|
|
/*This else was made for misra-c compliance*/
|
|
;
|
|
}
|
|
|
|
/*
|
|
* If the mode transition is not any of the two cases above, CAN must
|
|
* enter Configuration Mode before switching into the target operation
|
|
* mode.
|
|
*/
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_SRR_OFFSET, 0U);
|
|
|
|
/*
|
|
* Check if the device has entered Configuration Mode, if not, return to
|
|
* the caller.
|
|
*/
|
|
if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) {
|
|
return;
|
|
}
|
|
|
|
switch (OperationMode) {
|
|
case XCANPS_MODE_CONFIG:
|
|
/*
|
|
* As CAN is in Configuration Mode already.
|
|
* Nothing is needed to be done here.
|
|
*/
|
|
break;
|
|
|
|
case XCANPS_MODE_SLEEP:
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_MSR_OFFSET, XCANPS_MSR_SLEEP_MASK);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_SRR_OFFSET, XCANPS_SRR_CEN_MASK);
|
|
break;
|
|
|
|
case XCANPS_MODE_NORMAL:
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_MSR_OFFSET, 0U);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_SRR_OFFSET, XCANPS_SRR_CEN_MASK);
|
|
break;
|
|
|
|
case XCANPS_MODE_LOOPBACK:
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_MSR_OFFSET, XCANPS_MSR_LBACK_MASK);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_SRR_OFFSET, XCANPS_SRR_CEN_MASK);
|
|
break;
|
|
|
|
case XCANPS_MODE_SNOOP:
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_MSR_OFFSET, XCANPS_MSR_SNOOP_MASK);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_SRR_OFFSET, XCANPS_SRR_CEN_MASK);
|
|
break;
|
|
|
|
default:
|
|
/*This default was made for misra-c compliance*/
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function returns Status value from Status Register (SR). Use the
|
|
* XCANPS_SR_* constants defined in xcanps_hw.h to interpret the returned
|
|
* value.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
*
|
|
* @return The 32-bit value read from Status Register.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
u32 XCanPs_GetStatus(XCanPs *InstancePtr)
|
|
{
|
|
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
return XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_SR_OFFSET);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function reads Receive and Transmit error counters.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param RxErrorCount is a pointer to data in which the Receive Error
|
|
* counter value is returned.
|
|
* @param TxErrorCount is a pointer to data in which the Transmit Error
|
|
* counter value is returned.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCanPs_GetBusErrorCounter(XCanPs *InstancePtr, u8 *RxErrorCount,
|
|
u8 *TxErrorCount)
|
|
{
|
|
u32 ErrorCount;
|
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
Xil_AssertVoid(RxErrorCount != NULL);
|
|
Xil_AssertVoid(TxErrorCount != NULL);
|
|
/*
|
|
* Read Error Counter Register and parse it.
|
|
*/
|
|
ErrorCount = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_ECR_OFFSET);
|
|
*RxErrorCount = (u8)((ErrorCount & XCANPS_ECR_REC_MASK) >>
|
|
XCANPS_ECR_REC_SHIFT);
|
|
*TxErrorCount = (u8)(ErrorCount & XCANPS_ECR_TEC_MASK);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function reads Error Status value from Error Status Register (ESR). Use
|
|
* the XCANPS_ESR_* constants defined in xcanps_hw.h to interpret the
|
|
* returned value.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
*
|
|
* @return The 32-bit value read from Error Status Register.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
u32 XCanPs_GetBusErrorStatus(XCanPs *InstancePtr)
|
|
{
|
|
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
return XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_ESR_OFFSET);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function clears Error Status bit(s) previously set in Error
|
|
* Status Register (ESR). Use the XCANPS_ESR_* constants defined in xcanps_hw.h
|
|
* to create the value to pass in. If a bit was cleared in Error Status Register
|
|
* before this function is called, it will not be modified.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
*
|
|
* @param Mask is he 32-bit mask used to clear bits in Error Status
|
|
* Register. Multiple XCANPS_ESR_* values can be 'OR'ed to clear
|
|
* multiple bits.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCanPs_ClearBusErrorStatus(XCanPs *InstancePtr, u32 Mask)
|
|
{
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_ESR_OFFSET, Mask);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function sends a CAN Frame. If the TX FIFO is not full then the given
|
|
* frame is written into the the TX FIFO otherwise, it returns an error code
|
|
* immediately.
|
|
* This function does not wait for the given frame being sent to CAN bus.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param FramePtr is a pointer to a 32-bit aligned buffer containing the
|
|
* CAN frame to be sent.
|
|
*
|
|
* @return
|
|
* - XST_SUCCESS if TX FIFO was not full and the given frame was
|
|
* written into the FIFO.
|
|
* - XST_FIFO_NO_ROOM if there is no room in the TX FIFO for the
|
|
* given frame.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
s32 XCanPs_Send(XCanPs *InstancePtr, u32 *FramePtr)
|
|
{
|
|
s32 Status;
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(FramePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
if (XCanPs_IsTxFifoFull(InstancePtr) == TRUE) {
|
|
Status = XST_FIFO_NO_ROOM;
|
|
} else {
|
|
|
|
/*
|
|
* Write IDR, DLC, Data Word 1 and Data Word 2 to the CAN device.
|
|
*/
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_TXFIFO_ID_OFFSET, FramePtr[0]);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_TXFIFO_DLC_OFFSET, FramePtr[1]);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_TXFIFO_DW1_OFFSET, FramePtr[2]);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_TXFIFO_DW2_OFFSET, FramePtr[3]);
|
|
|
|
Status = XST_SUCCESS;
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function receives a CAN Frame. This function first checks if RX FIFO is
|
|
* empty, if not, it then reads a frame from the RX FIFO into the given buffer.
|
|
* This function returns error code immediately if there is no frame in the RX
|
|
* FIFO.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param FramePtr is a pointer to a 32-bit aligned buffer where the CAN
|
|
* frame to be written.
|
|
*
|
|
* @return
|
|
* - XST_SUCCESS if RX FIFO was not empty and a frame was read from
|
|
* RX FIFO successfully and written into the given buffer.
|
|
* - XST_NO_DATA if there is no frame to be received from the FIFO.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
s32 XCanPs_Recv(XCanPs *InstancePtr, u32 *FramePtr)
|
|
{
|
|
s32 Status;
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(FramePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
if (XCanPs_IsRxEmpty(InstancePtr) == TRUE) {
|
|
Status = XST_NO_DATA;
|
|
} else {
|
|
|
|
/*
|
|
* Read IDR, DLC, Data Word 1 and Data Word 2 from the CAN device.
|
|
*/
|
|
FramePtr[0] = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_RXFIFO_ID_OFFSET);
|
|
FramePtr[1] = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_RXFIFO_DLC_OFFSET);
|
|
FramePtr[2] = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_RXFIFO_DW1_OFFSET);
|
|
FramePtr[3] = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_RXFIFO_DW2_OFFSET);
|
|
|
|
/*
|
|
* Clear RXNEMP bit in ISR. This allows future XCanPs_IsRxEmpty() call
|
|
* returns correct RX FIFO occupancy/empty condition.
|
|
*/
|
|
XCanPs_IntrClear(InstancePtr, XCANPS_IXR_RXNEMP_MASK);
|
|
|
|
Status = XST_SUCCESS;
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine sends a CAN High Priority frame. This function first checks if
|
|
* TX High Priority Buffer is empty. If yes, it then writes the given frame into
|
|
* the Buffer. If not, this function returns immediately. This function does not
|
|
* wait for the given frame being sent to CAN bus.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param FramePtr is a pointer to a 32-bit aligned buffer containing the
|
|
* CAN High Priority frame to be sent.
|
|
*
|
|
* @return
|
|
* - XST_SUCCESS if TX High Priority Buffer was not full and the
|
|
* given frame was written into the buffer.
|
|
* - XST_FIFO_NO_ROOM if there is no room in the TX High Priority
|
|
* Buffer for this frame.
|
|
*
|
|
* @note
|
|
*
|
|
* If the frame needs to be sent immediately and not delayed by processor's
|
|
* interrupt handling, the caller should disable interrupt at processor
|
|
* level before invoking this function.
|
|
*
|
|
******************************************************************************/
|
|
s32 XCanPs_SendHighPriority(XCanPs *InstancePtr, u32 *FramePtr)
|
|
{
|
|
s32 Status;
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(FramePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
if (XCanPs_IsHighPriorityBufFull(InstancePtr) == TRUE) {
|
|
Status = XST_FIFO_NO_ROOM;
|
|
} else {
|
|
|
|
/*
|
|
* Write IDR, DLC, Data Word 1 and Data Word 2 to the CAN device.
|
|
*/
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_TXHPB_ID_OFFSET, FramePtr[0]);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_TXHPB_DLC_OFFSET, FramePtr[1]);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_TXHPB_DW1_OFFSET, FramePtr[2]);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_TXHPB_DW2_OFFSET, FramePtr[3]);
|
|
|
|
Status = XST_SUCCESS;
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine enables individual acceptance filters. Up to 4 filters could
|
|
* be enabled.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param FilterIndexes specifies which filter(s) to enable. Use
|
|
* any XCANPS_AFR_UAF*_MASK to enable one filter, and "Or"
|
|
* multiple XCANPS_AFR_UAF*_MASK values if multiple filters need
|
|
* to be enabled. Any filter not specified in this parameter will
|
|
* keep its previous enable/disable setting.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
*
|
|
******************************************************************************/
|
|
void XCanPs_AcceptFilterEnable(XCanPs *InstancePtr, u32 FilterIndexes)
|
|
{
|
|
u32 EnabledFilters;
|
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
/*
|
|
* Calculate the new value and write to AFR.
|
|
*/
|
|
EnabledFilters = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFR_OFFSET);
|
|
EnabledFilters |= FilterIndexes;
|
|
EnabledFilters &= (u32)XCANPS_AFR_UAF_ALL_MASK;
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_AFR_OFFSET,
|
|
EnabledFilters);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine disables individual acceptance filters. Up to 4 filters could
|
|
* be disabled. If all acceptance filters are disabled then all the received
|
|
* frames are stored in the RX FIFO.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param FilterIndexes specifies which filter(s) to disable. Use
|
|
* any XCANPS_AFR_UAF*_MASK to disable one filter, and "Or"
|
|
* multiple XCANPS_AFR_UAF*_MASK values if multiple filters need
|
|
* to be disabled. Any filter not specified in this parameter will
|
|
* keep its previous enable/disable setting. If all acceptance
|
|
* filters are disabled then all received frames are stored in the
|
|
* RX FIFO.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCanPs_AcceptFilterDisable(XCanPs *InstancePtr, u32 FilterIndexes)
|
|
{
|
|
u32 EnabledFilters;
|
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
/*
|
|
* Calculate the new value and write to AFR.
|
|
*/
|
|
EnabledFilters = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFR_OFFSET);
|
|
EnabledFilters &= (u32)XCANPS_AFR_UAF_ALL_MASK & (~FilterIndexes);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_AFR_OFFSET,
|
|
EnabledFilters);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function returns enabled acceptance filters. Use XCANPS_AFR_UAF*_MASK
|
|
* defined in xcanps_hw.h to interpret the returned value. If no acceptance
|
|
* filters are enabled then all received frames are stored in the RX FIFO.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
*
|
|
* @return The value stored in Acceptance Filter Register.
|
|
*
|
|
* @note None.
|
|
*
|
|
*
|
|
******************************************************************************/
|
|
u32 XCanPs_AcceptFilterGetEnabled(XCanPs *InstancePtr)
|
|
{
|
|
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
return XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFR_OFFSET);
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function sets values to the Acceptance Filter Mask Register (AFMR) and
|
|
* Acceptance Filter ID Register (AFIR) for the specified Acceptance Filter.
|
|
* Use XCANPS_IDR_* defined in xcanps_hw.h to create the values to set the
|
|
* filter. Read the xcanps.h file and device specification for details.
|
|
*
|
|
* This function should be called only after:
|
|
* - The given filter is disabled by calling XCanPs_AcceptFilterDisable()
|
|
* - And the CAN device is ready to accept writes to AFMR and AFIR, i.e.,
|
|
* XCanPs_IsAcceptFilterBusy() returns FALSE.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param FilterIndex defines which Acceptance Filter Mask and ID Register
|
|
* to set. Use any single XCANPS_AFR_UAF*_MASK value.
|
|
* @param MaskValue is the value to write to the chosen Acceptance Filter
|
|
* Mask Register.
|
|
* @param IdValue is the value to write to the chosen Acceptance Filter
|
|
* ID Register.
|
|
*
|
|
* @return
|
|
* - XST_SUCCESS if the values were set successfully.
|
|
* - XST_FAILURE if the given filter was not disabled, or the CAN
|
|
* device was not ready to accept writes to AFMR and AFIR.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
s32 XCanPs_AcceptFilterSet(XCanPs *InstancePtr, u32 FilterIndex,
|
|
u32 MaskValue, u32 IdValue)
|
|
{
|
|
u32 EnabledFilters;
|
|
s32 Status;
|
|
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
Xil_AssertNonvoid((FilterIndex == XCANPS_AFR_UAF4_MASK) ||
|
|
(FilterIndex == XCANPS_AFR_UAF3_MASK) ||
|
|
(FilterIndex == XCANPS_AFR_UAF2_MASK) ||
|
|
(FilterIndex == XCANPS_AFR_UAF1_MASK));
|
|
|
|
/*
|
|
* Return an error if the given filter is currently enabled.
|
|
*/
|
|
EnabledFilters = XCanPs_AcceptFilterGetEnabled(InstancePtr);
|
|
if ((EnabledFilters & FilterIndex) == FilterIndex) {
|
|
Status = XST_FAILURE;
|
|
} else {
|
|
|
|
/*
|
|
* If the CAN device is not ready to accept writes to AFMR and AFIR,
|
|
* return error code.
|
|
*/
|
|
if (XCanPs_IsAcceptFilterBusy(InstancePtr) == TRUE) {
|
|
Status = XST_FAILURE;
|
|
} else {
|
|
|
|
/*
|
|
* Write to the AFMR and AFIR of the specified filter.
|
|
*/
|
|
switch (FilterIndex) {
|
|
case XCANPS_AFR_UAF1_MASK: /* Acceptance Filter No. 1 */
|
|
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFMR1_OFFSET, MaskValue);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFIR1_OFFSET, IdValue);
|
|
break;
|
|
|
|
case XCANPS_AFR_UAF2_MASK: /* Acceptance Filter No. 2 */
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFMR2_OFFSET, MaskValue);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFIR2_OFFSET, IdValue);
|
|
break;
|
|
|
|
case XCANPS_AFR_UAF3_MASK: /* Acceptance Filter No. 3 */
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFMR3_OFFSET, MaskValue);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFIR3_OFFSET, IdValue);
|
|
break;
|
|
|
|
case XCANPS_AFR_UAF4_MASK: /* Acceptance Filter No. 4 */
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFMR4_OFFSET, MaskValue);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFIR4_OFFSET, IdValue);
|
|
break;
|
|
|
|
default:
|
|
/*This default was made for misra-c compliance*/
|
|
break;
|
|
}
|
|
|
|
Status = XST_SUCCESS;
|
|
}
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function reads the values of the Acceptance Filter Mask and ID Register
|
|
* for the specified Acceptance Filter. Use XCANPS_IDR_* defined in xcanps_hw.h
|
|
* to interpret the values. Read the xcanps.h file and device specification for
|
|
* details.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param FilterIndex defines which Acceptance Filter Mask Register to get
|
|
* Mask and ID from. Use any single XCANPS_FILTER_* value.
|
|
* @param MaskValue is a pointer to the data in which the Mask value read
|
|
* from the chosen Acceptance Filter Mask Register is returned.
|
|
* @param IdValue is a pointer to the data in which the ID value read
|
|
* from the chosen Acceptance Filter ID Register is returned.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCanPs_AcceptFilterGet(XCanPs *InstancePtr, u32 FilterIndex,
|
|
u32 *MaskValue, u32 *IdValue)
|
|
{
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
Xil_AssertVoid((FilterIndex == XCANPS_AFR_UAF4_MASK) ||
|
|
(FilterIndex == XCANPS_AFR_UAF3_MASK) ||
|
|
(FilterIndex == XCANPS_AFR_UAF2_MASK) ||
|
|
(FilterIndex == XCANPS_AFR_UAF1_MASK));
|
|
Xil_AssertVoid(MaskValue != NULL);
|
|
Xil_AssertVoid(IdValue != NULL);
|
|
|
|
/*
|
|
* Read from the AFMR and AFIR of the specified filter.
|
|
*/
|
|
switch (FilterIndex) {
|
|
case XCANPS_AFR_UAF1_MASK: /* Acceptance Filter No. 1 */
|
|
*MaskValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFMR1_OFFSET);
|
|
*IdValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFIR1_OFFSET);
|
|
break;
|
|
|
|
case XCANPS_AFR_UAF2_MASK: /* Acceptance Filter No. 2 */
|
|
*MaskValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFMR2_OFFSET);
|
|
*IdValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFIR2_OFFSET);
|
|
break;
|
|
|
|
case XCANPS_AFR_UAF3_MASK: /* Acceptance Filter No. 3 */
|
|
*MaskValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFMR3_OFFSET);
|
|
*IdValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFIR3_OFFSET);
|
|
break;
|
|
|
|
case XCANPS_AFR_UAF4_MASK: /* Acceptance Filter No. 4 */
|
|
*MaskValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFMR4_OFFSET);
|
|
*IdValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_AFIR4_OFFSET);
|
|
break;
|
|
|
|
default:
|
|
/*This default was made for misra-c compliance*/
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine sets Baud Rate Prescaler value. The system clock for the CAN
|
|
* controller is divided by (Prescaler + 1) to generate the quantum clock
|
|
* needed for sampling and synchronization. Read the device specification
|
|
* for details.
|
|
*
|
|
* Baud Rate Prescaler can be set only if the CAN device is in Configuration
|
|
* Mode. Call XCanPs_EnterMode() to enter Configuration Mode before using this
|
|
* function.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param Prescaler is the value to set. Valid values are from 0 to 255.
|
|
*
|
|
* @return
|
|
* - XST_SUCCESS if the Baud Rate Prescaler value is set
|
|
* successfully.
|
|
* - XST_FAILURE if CAN device is not in Configuration Mode.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
s32 XCanPs_SetBaudRatePrescaler(XCanPs *InstancePtr, u8 Prescaler)
|
|
{
|
|
s32 Status;
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) {
|
|
Status = XST_FAILURE;
|
|
} else {
|
|
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_BRPR_OFFSET,
|
|
(u32)Prescaler);
|
|
|
|
Status = XST_SUCCESS;
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine gets Baud Rate Prescaler value. The system clock for the CAN
|
|
* controller is divided by (Prescaler + 1) to generate the quantum clock
|
|
* needed for sampling and synchronization. Read the device specification for
|
|
* details.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
*
|
|
* @return Current used Baud Rate Prescaler value. The value's range is
|
|
* from 0 to 255.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
u8 XCanPs_GetBaudRatePrescaler(XCanPs *InstancePtr)
|
|
{
|
|
u32 ReadValue;
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
ReadValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_BRPR_OFFSET);
|
|
return ((u8)ReadValue);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine sets Bit time. Time segment 1, Time segment 2 and
|
|
* Synchronization Jump Width are set in this function. Device specification
|
|
* requires the values passed into this function be one less than the actual
|
|
* values of these fields. Read the device specification for details.
|
|
*
|
|
* Bit time can be set only if the CAN device is in Configuration Mode.
|
|
* Call XCanPs_EnterMode() to enter Configuration Mode before using this
|
|
* function.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param SyncJumpWidth is the Synchronization Jump Width value to set.
|
|
* Valid values are from 0 to 3.
|
|
* @param TimeSegment2 is the Time Segment 2 value to set. Valid values
|
|
* are from 0 to 7.
|
|
* @param TimeSegment1 is the Time Segment 1 value to set. Valid values
|
|
* are from 0 to 15.
|
|
*
|
|
* @return
|
|
* - XST_SUCCESS if the Bit time is set successfully.
|
|
* - XST_FAILURE if CAN device is not in Configuration Mode.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
s32 XCanPs_SetBitTiming(XCanPs *InstancePtr, u8 SyncJumpWidth,
|
|
u8 TimeSegment2, u8 TimeSegment1)
|
|
{
|
|
u32 Value;
|
|
s32 Status;
|
|
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
Xil_AssertNonvoid(SyncJumpWidth <= (u8)3U);
|
|
Xil_AssertNonvoid(TimeSegment2 <= (u8)7U);
|
|
Xil_AssertNonvoid(TimeSegment1 <= (u8)15U );
|
|
|
|
if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) {
|
|
Status = XST_FAILURE;
|
|
} else {
|
|
|
|
Value = ((u32) TimeSegment1) & XCANPS_BTR_TS1_MASK;
|
|
Value |= (((u32) TimeSegment2) << XCANPS_BTR_TS2_SHIFT) &
|
|
XCANPS_BTR_TS2_MASK;
|
|
Value |= (((u32) SyncJumpWidth) << XCANPS_BTR_SJW_SHIFT) &
|
|
XCANPS_BTR_SJW_MASK;
|
|
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_BTR_OFFSET, Value);
|
|
|
|
Status = XST_SUCCESS;
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine gets Bit time. Time segment 1, Time segment 2 and
|
|
* Synchronization Jump Width values are read in this function. According to
|
|
* device specification, the actual value of each of these fields is one
|
|
* more than the value read. Read the device specification for details.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param SyncJumpWidth will store the Synchronization Jump Width value
|
|
* after this function returns. Its value ranges from 0 to 3.
|
|
* @param TimeSegment2 will store the Time Segment 2 value after this
|
|
* function returns. Its value ranges from 0 to 7.
|
|
* @param TimeSegment1 will store the Time Segment 1 value after this
|
|
* function returns. Its value ranges from 0 to 15.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCanPs_GetBitTiming(XCanPs *InstancePtr, u8 *SyncJumpWidth,
|
|
u8 *TimeSegment2, u8 *TimeSegment1)
|
|
{
|
|
u32 Value;
|
|
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
Xil_AssertVoid(SyncJumpWidth != NULL);
|
|
Xil_AssertVoid(TimeSegment2 != NULL);
|
|
Xil_AssertVoid(TimeSegment1 != NULL);
|
|
|
|
Value = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_BTR_OFFSET);
|
|
|
|
*TimeSegment1 = (u8) (Value & XCANPS_BTR_TS1_MASK);
|
|
*TimeSegment2 =
|
|
(u8) ((Value & XCANPS_BTR_TS2_MASK) >> XCANPS_BTR_TS2_SHIFT);
|
|
*SyncJumpWidth =
|
|
(u8) ((Value & XCANPS_BTR_SJW_MASK) >> XCANPS_BTR_SJW_SHIFT);
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine sets the Rx Full threshold in the Watermark Interrupt Register.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param Threshold is the threshold to be set. The valid values are
|
|
* from 1 to 63.
|
|
*
|
|
* @return
|
|
* - XST_FAILURE - If the CAN device is not in Configuration Mode.
|
|
* - XST_SUCCESS - If the Rx Full threshold is set in Watermark
|
|
* Interrupt Register.
|
|
*
|
|
* @note The threshold can only be set when the CAN device is in the
|
|
* configuration mode.
|
|
*
|
|
*****************************************************************************/
|
|
s32 XCanPs_SetRxIntrWatermark(XCanPs *InstancePtr, u8 Threshold)
|
|
{
|
|
|
|
u32 ThrReg;
|
|
s32 Status;
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
Xil_AssertNonvoid(Threshold <= (u8)63);
|
|
|
|
if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) {
|
|
Status = XST_FAILURE;
|
|
} else {
|
|
|
|
ThrReg = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_WIR_OFFSET);
|
|
|
|
ThrReg &= XCANPS_WIR_EW_MASK;
|
|
ThrReg |= ((u32)Threshold & XCANPS_WIR_FW_MASK);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_WIR_OFFSET, ThrReg);
|
|
|
|
Status = XST_SUCCESS;
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine gets the Rx Full threshold from the Watermark Interrupt Register.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
*
|
|
* @return The Rx FIFO full watermark threshold value. The valid values
|
|
* are 1 to 63.
|
|
*
|
|
* @note None.
|
|
*
|
|
*****************************************************************************/
|
|
u8 XCanPs_GetRxIntrWatermark(XCanPs *InstancePtr)
|
|
{
|
|
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
|
|
return (u8) (XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_WIR_OFFSET) &
|
|
XCANPS_WIR_FW_MASK);
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine sets the Tx Empty Threshold in the Watermark Interrupt Register.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
* @param Threshold is the threshold to be set. The valid values are
|
|
* from 1 to 63.
|
|
*
|
|
* @return
|
|
* - XST_FAILURE - If the CAN device is not in Configuration Mode.
|
|
* - XST_SUCCESS - If the threshold is set in Watermark
|
|
* Interrupt Register.
|
|
*
|
|
* @note The threshold can only be set when the CAN device is in the
|
|
* configuration mode.
|
|
*
|
|
*****************************************************************************/
|
|
s32 XCanPs_SetTxIntrWatermark(XCanPs *InstancePtr, u8 Threshold)
|
|
{
|
|
u32 ThrReg;
|
|
s32 Status;
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
Xil_AssertNonvoid(Threshold <= (u8)63);
|
|
|
|
if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) {
|
|
Status = XST_FAILURE;
|
|
} else {
|
|
|
|
ThrReg = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_WIR_OFFSET);
|
|
|
|
ThrReg &= XCANPS_WIR_FW_MASK;
|
|
ThrReg |= (((u32)Threshold << XCANPS_WIR_EW_SHIFT)
|
|
& XCANPS_WIR_EW_MASK);
|
|
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_WIR_OFFSET, ThrReg);
|
|
|
|
Status = XST_SUCCESS;
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine gets the Tx Empty threshold from Watermark Interrupt Register.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCanPs instance.
|
|
*
|
|
* @return The Tx Empty FIFO threshold value. The valid values are 1 to 63.
|
|
*
|
|
* @note None.
|
|
*
|
|
*****************************************************************************/
|
|
u8 XCanPs_GetTxIntrWatermark(XCanPs *InstancePtr)
|
|
{
|
|
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
|
|
|
|
|
return (u8) ((XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
|
|
XCANPS_WIR_OFFSET) & XCANPS_WIR_EW_MASK) >>
|
|
XCANPS_WIR_EW_SHIFT);
|
|
}
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
/*
|
|
* This routine is a stub for the asynchronous callbacks. The stub is here in
|
|
* case the upper layer forgot to set the handler(s). On initialization, all
|
|
* handlers are set to this callback. It is considered an error for this handler
|
|
* to be invoked.
|
|
*
|
|
******************************************************************************/
|
|
static void StubHandler(void)
|
|
{
|
|
Xil_AssertVoidAlways();
|
|
}
|