canps: Add support for Zynq Ultrascale Mp

This patch adds the support for Zynq Ultrascale Mp.
Modified driver code for MISRA-C:2012 and cleaned up.

Signed-off-by: Venkata Naga Sai Krishna Kolapalli <venkatan@xilinx.com>
Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
This commit is contained in:
Kedareswara rao Appana 2014-12-09 17:47:45 +05:30 committed by Suneel Garapati
parent 7db965cedc
commit 7d708a0c6b
9 changed files with 576 additions and 487 deletions

View file

@ -33,7 +33,7 @@ OPTION psf_version = 2.1;
BEGIN driver canps
OPTION supported_peripherals = (ps7_can);
OPTION supported_peripherals = (ps7_can ps8_can pss_can);
OPTION driver_state = ACTIVE;
OPTION copyfiles = all;
OPTION VERSION = 3.0;

View file

@ -91,10 +91,10 @@ static void StubHandler(void);
* @note None.
*
******************************************************************************/
int XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr,
s32 XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr,
u32 EffectiveAddr)
{
s32 Status;
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(ConfigPtr != NULL);
@ -102,7 +102,7 @@ int XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr,
* Set some default values for instance data, don't indicate the device
* is ready to use until everything has been initialized successfully.
*/
InstancePtr->IsReady = 0;
InstancePtr->IsReady = 0U;
InstancePtr->CanConfig.BaseAddr = EffectiveAddr;
InstancePtr->CanConfig.DeviceId = ConfigPtr->DeviceId;
@ -124,7 +124,8 @@ int XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr,
*/
XCanPs_Reset(InstancePtr);
return XST_SUCCESS;
Status = XST_SUCCESS;
return Status;
}
/*****************************************************************************/
@ -187,23 +188,26 @@ u8 XCanPs_GetMode(XCanPs *InstancePtr)
StatusReg = XCanPs_GetStatus(InstancePtr);
if (StatusReg & XCANPS_SR_CONFIG_MASK) {
return XCANPS_MODE_CONFIG;
if ((StatusReg & XCANPS_SR_CONFIG_MASK) != (u32)0) {
return (u8)XCANPS_MODE_CONFIG;
} else if (StatusReg & XCANPS_SR_SLEEP_MASK) {
return XCANPS_MODE_SLEEP;
}
else if ((StatusReg & XCANPS_SR_SLEEP_MASK) != (u32)0) {
return (u8)XCANPS_MODE_SLEEP;
} else if (StatusReg & XCANPS_SR_NORMAL_MASK) {
if (StatusReg & XCANPS_SR_SNOOP_MASK) {
return XCANPS_MODE_SNOOP;
}
else if ((StatusReg & XCANPS_SR_NORMAL_MASK) != (u32)0) {
if ((StatusReg & XCANPS_SR_SNOOP_MASK) != (u32)0) {
return (u8)XCANPS_MODE_SNOOP;
} else {
return XCANPS_MODE_NORMAL;
return (u8)XCANPS_MODE_NORMAL;
}
} else {
}
else {
/*
* If this line is reached, the device is in Loop Back Mode.
*/
return XCANPS_MODE_LOOPBACK;
return (u8)XCANPS_MODE_LOOPBACK;
}
}
@ -241,11 +245,11 @@ void XCanPs_EnterMode(XCanPs *InstancePtr, u8 OperationMode)
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertVoid((OperationMode == XCANPS_MODE_CONFIG) ||
(OperationMode == XCANPS_MODE_SLEEP) ||
(OperationMode == XCANPS_MODE_NORMAL) ||
(OperationMode == XCANPS_MODE_LOOPBACK) ||
(OperationMode == XCANPS_MODE_SNOOP));
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);
@ -254,8 +258,8 @@ void XCanPs_EnterMode(XCanPs *InstancePtr, u8 OperationMode)
* or if current mode is Sleep Mode and the mode to enter is Normal
* Mode, no transition through Configuration Mode is needed.
*/
if ((CurrentMode == XCANPS_MODE_NORMAL) &&
(OperationMode == XCANPS_MODE_SLEEP)) {
if ((CurrentMode == (u8)XCANPS_MODE_NORMAL) &&
(OperationMode == (u8)XCANPS_MODE_SLEEP)) {
/*
* Normal Mode ---> Sleep Mode
*/
@ -263,16 +267,19 @@ void XCanPs_EnterMode(XCanPs *InstancePtr, u8 OperationMode)
XCANPS_MSR_OFFSET, XCANPS_MSR_SLEEP_MASK);
return;
} else if ((CurrentMode == XCANPS_MODE_SLEEP) &&
(OperationMode == XCANPS_MODE_NORMAL)) {
} else if ((CurrentMode == (u8)XCANPS_MODE_SLEEP) &&
(OperationMode == (u8)XCANPS_MODE_NORMAL)) {
/*
* Sleep Mode ---> Normal Mode
*/
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
XCANPS_MSR_OFFSET, 0);
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
@ -280,51 +287,55 @@ void XCanPs_EnterMode(XCanPs *InstancePtr, u8 OperationMode)
* mode.
*/
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
XCANPS_SRR_OFFSET, 0);
XCANPS_SRR_OFFSET, 0U);
/*
* Check if the device has entered Configuration Mode, if not, return to
* the caller.
*/
if (XCanPs_GetMode(InstancePtr) != XCANPS_MODE_CONFIG) {
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_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_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, 0);
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_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;
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;
}
}
@ -383,9 +394,9 @@ void XCanPs_GetBusErrorCounter(XCanPs *InstancePtr, u8 *RxErrorCount,
*/
ErrorCount = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
XCANPS_ECR_OFFSET);
*RxErrorCount = (ErrorCount & XCANPS_ECR_REC_MASK) >>
XCANPS_ECR_REC_SHIFT;
*TxErrorCount = ErrorCount & XCANPS_ECR_TEC_MASK;
*RxErrorCount = (u8)((ErrorCount & XCANPS_ECR_REC_MASK) >>
XCANPS_ECR_REC_SHIFT);
*TxErrorCount = (u8)(ErrorCount & XCANPS_ECR_TEC_MASK);
}
/*****************************************************************************/
@ -459,29 +470,32 @@ void XCanPs_ClearBusErrorStatus(XCanPs *InstancePtr, u32 Mask)
* @note None.
*
******************************************************************************/
int XCanPs_Send(XCanPs *InstancePtr, u32 *FramePtr)
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) {
return XST_FIFO_NO_ROOM;
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;
}
/*
* 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]);
return XST_SUCCESS;
return Status;
}
/*****************************************************************************/
@ -504,35 +518,38 @@ int XCanPs_Send(XCanPs *InstancePtr, u32 *FramePtr)
* @note None.
*
******************************************************************************/
int XCanPs_Recv(XCanPs *InstancePtr, u32 *FramePtr)
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) {
return XST_NO_DATA;
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;
}
/*
* 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);
return XST_SUCCESS;
return Status;
}
/*****************************************************************************/
@ -549,7 +566,7 @@ int XCanPs_Recv(XCanPs *InstancePtr, u32 *FramePtr)
*
* @return
* - XST_SUCCESS if TX High Priority Buffer was not full and the
* given frame was written into the buffer;
* 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.
*
@ -560,29 +577,32 @@ int XCanPs_Recv(XCanPs *InstancePtr, u32 *FramePtr)
* level before invoking this function.
*
******************************************************************************/
int XCanPs_SendHighPriority(XCanPs *InstancePtr, u32 *FramePtr)
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) {
return XST_FIFO_NO_ROOM;
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;
}
/*
* 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]);
return XST_SUCCESS;
return Status;
}
/*****************************************************************************/
@ -617,7 +637,7 @@ void XCanPs_AcceptFilterEnable(XCanPs *InstancePtr, u32 FilterIndexes)
EnabledFilters = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
XCANPS_AFR_OFFSET);
EnabledFilters |= FilterIndexes;
EnabledFilters &= XCANPS_AFR_UAF_ALL_MASK;
EnabledFilters &= (u32)XCANPS_AFR_UAF_ALL_MASK;
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_AFR_OFFSET,
EnabledFilters);
}
@ -655,7 +675,7 @@ void XCanPs_AcceptFilterDisable(XCanPs *InstancePtr, u32 FilterIndexes)
*/
EnabledFilters = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
XCANPS_AFR_OFFSET);
EnabledFilters &= XCANPS_AFR_UAF_ALL_MASK & (~FilterIndexes);
EnabledFilters &= (u32)XCANPS_AFR_UAF_ALL_MASK & (~FilterIndexes);
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_AFR_OFFSET,
EnabledFilters);
}
@ -695,7 +715,7 @@ u32 XCanPs_AcceptFilterGetEnabled(XCanPs *InstancePtr)
* 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();
* - 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.
*
@ -715,10 +735,11 @@ u32 XCanPs_AcceptFilterGetEnabled(XCanPs *InstancePtr)
* @note None.
*
******************************************************************************/
int XCanPs_AcceptFilterSet(XCanPs *InstancePtr, u32 FilterIndex,
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);
@ -732,52 +753,59 @@ int XCanPs_AcceptFilterSet(XCanPs *InstancePtr, u32 FilterIndex,
*/
EnabledFilters = XCanPs_AcceptFilterGetEnabled(InstancePtr);
if ((EnabledFilters & FilterIndex) == FilterIndex) {
return XST_FAILURE;
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;
}
}
/*
* If the CAN device is not ready to accept writes to AFMR and AFIR,
* return error code.
*/
if (XCanPs_IsAcceptFilterBusy(InstancePtr) == TRUE) {
return XST_FAILURE;
}
/*
* 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;
}
return XST_SUCCESS;
return Status;
}
/*****************************************************************************/
@ -817,33 +845,37 @@ void XCanPs_AcceptFilterGet(XCanPs *InstancePtr, u32 FilterIndex,
* 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_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_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_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;
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;
}
}
@ -870,19 +902,22 @@ void XCanPs_AcceptFilterGet(XCanPs *InstancePtr, u32 FilterIndex,
* @note None.
*
******************************************************************************/
int XCanPs_SetBaudRatePrescaler(XCanPs *InstancePtr, u8 Prescaler)
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) != XCANPS_MODE_CONFIG) {
return XST_FAILURE;
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;
}
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_BRPR_OFFSET,
(u32)Prescaler);
return XST_SUCCESS;
return Status;
}
/*****************************************************************************/
@ -903,12 +938,13 @@ int XCanPs_SetBaudRatePrescaler(XCanPs *InstancePtr, u8 Prescaler)
******************************************************************************/
u8 XCanPs_GetBaudRatePrescaler(XCanPs *InstancePtr)
{
u32 ReadValue;
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
return (u8) XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
ReadValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
XCANPS_BRPR_OFFSET);
return ((u8)ReadValue);
}
/*****************************************************************************/
@ -938,31 +974,34 @@ u8 XCanPs_GetBaudRatePrescaler(XCanPs *InstancePtr)
* @note None.
*
******************************************************************************/
int XCanPs_SetBitTiming(XCanPs *InstancePtr, u8 SyncJumpWidth,
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 <= 3);
Xil_AssertNonvoid(TimeSegment2 <= 7);
Xil_AssertNonvoid(TimeSegment1 <= 15 );
Xil_AssertNonvoid(SyncJumpWidth <= (u8)3U);
Xil_AssertNonvoid(TimeSegment2 <= (u8)7U);
Xil_AssertNonvoid(TimeSegment1 <= (u8)15U );
if (XCanPs_GetMode(InstancePtr) != XCANPS_MODE_CONFIG) {
return XST_FAILURE;
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;
}
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);
return XST_SUCCESS;
return Status;
}
/*****************************************************************************/
@ -1026,26 +1065,30 @@ void XCanPs_GetBitTiming(XCanPs *InstancePtr, u8 *SyncJumpWidth,
* configuration mode.
*
*****************************************************************************/
int XCanPs_SetRxIntrWatermark(XCanPs *InstancePtr, u8 Threshold)
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 <= 63);
Xil_AssertNonvoid(Threshold <= (u8)63);
if (XCanPs_GetMode(InstancePtr) != XCANPS_MODE_CONFIG)
return XST_FAILURE;
if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) {
Status = XST_FAILURE;
} else {
ThrReg = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
XCANPS_WIR_OFFSET);
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);
ThrReg &= XCANPS_WIR_EW_MASK;
ThrReg |= ((u32)Threshold & XCANPS_WIR_FW_MASK);
XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr,
XCANPS_WIR_OFFSET, ThrReg);
return XST_SUCCESS;
Status = XST_SUCCESS;
}
return Status;
}
/****************************************************************************/
@ -1092,26 +1135,30 @@ u8 XCanPs_GetRxIntrWatermark(XCanPs *InstancePtr)
* configuration mode.
*
*****************************************************************************/
int XCanPs_SetTxIntrWatermark(XCanPs *InstancePtr, u8 Threshold)
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 <= 63);
Xil_AssertNonvoid(Threshold <= (u8)63);
if (XCanPs_GetMode(InstancePtr) != XCANPS_MODE_CONFIG)
return XST_FAILURE;
if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) {
Status = XST_FAILURE;
} else {
ThrReg = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr,
XCANPS_WIR_OFFSET);
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);
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);
return XST_SUCCESS;
Status = XST_SUCCESS;
}
return Status;
}
/****************************************************************************/

View file

@ -194,7 +194,8 @@
* XCANPS_TXBUF_DW1_OFFSET to XCANPS_TXHPB_DW1_OFFSET
* XCANPS_TXBUF_DW2_OFFSET to XCANPS_TXHPB_DW2_OFFSET
* 2.1 adk 23/08/14 Fixed CR:798792 Peripheral test for CANPS IP in
* SDK claims a 40kbps baud rate but it's not.
* SDK claims a 40kbps baud rate but it's not.
* 3.0 adk 09/12/14 Added support for Zynq Ultrascale Mp.
* </pre>
*
******************************************************************************/
@ -209,26 +210,27 @@ extern "C" {
#include "xstatus.h"
#include "xcanps_hw.h"
#include "xil_types.h"
/************************** Constant Definitions *****************************/
/** @name CAN operation modes
* @{
*/
#define XCANPS_MODE_CONFIG 0x00000001 /**< Configuration mode */
#define XCANPS_MODE_NORMAL 0x00000002 /**< Normal mode */
#define XCANPS_MODE_LOOPBACK 0x00000004 /**< Loop Back mode */
#define XCANPS_MODE_SLEEP 0x00000008 /**< Sleep mode */
#define XCANPS_MODE_SNOOP 0x00000010 /**< Snoop mode */
#define XCANPS_MODE_CONFIG 0x00000001U /**< Configuration mode */
#define XCANPS_MODE_NORMAL 0x00000002U /**< Normal mode */
#define XCANPS_MODE_LOOPBACK 0x00000004U /**< Loop Back mode */
#define XCANPS_MODE_SLEEP 0x00000008U /**< Sleep mode */
#define XCANPS_MODE_SNOOP 0x00000010U /**< Snoop mode */
/* @} */
/** @name Callback identifiers used as parameters to XCanPs_SetHandler()
* @{
*/
#define XCANPS_HANDLER_SEND 1 /**< Handler type for frame sending interrupt */
#define XCANPS_HANDLER_RECV 2 /**< Handler type for frame reception interrupt*/
#define XCANPS_HANDLER_ERROR 3 /**< Handler type for error interrupt */
#define XCANPS_HANDLER_EVENT 4 /**< Handler type for all other interrupts */
#define XCANPS_HANDLER_SEND 1U /**< Handler type for frame sending interrupt */
#define XCANPS_HANDLER_RECV 2U /**< Handler type for frame reception interrupt*/
#define XCANPS_HANDLER_ERROR 3U /**< Handler type for error interrupt */
#define XCANPS_HANDLER_EVENT 4U /**< Handler type for all other interrupts */
/* @} */
/**************************** Type Definitions *******************************/
@ -328,12 +330,12 @@ typedef struct {
* - FALSE if the transmission is not done.
*
* @note C-Style signature:
* int XCanPs_IsTxDone(XCanPs *InstancePtr);
* int XCanPs_IsTxDone(XCanPs *InstancePtr)
*
*******************************************************************************/
#define XCanPs_IsTxDone(InstancePtr) \
((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \
XCANPS_ISR_OFFSET) & XCANPS_IXR_TXOK_MASK) ? TRUE : FALSE)
(((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \
XCANPS_ISR_OFFSET) & XCANPS_IXR_TXOK_MASK) != (u32)0) ? TRUE : FALSE)
/****************************************************************************/
@ -348,12 +350,12 @@ typedef struct {
* - FALSE if the TX FIFO is NOT full.
*
* @note C-Style signature:
* int XCanPs_IsTxFifoFull(XCanPs *InstancePtr);
* int XCanPs_IsTxFifoFull(XCanPs *InstancePtr)
*
*****************************************************************************/
#define XCanPs_IsTxFifoFull(InstancePtr) \
((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \
XCANPS_SR_OFFSET) & XCANPS_SR_TXFLL_MASK) ? TRUE : FALSE)
(((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \
XCANPS_SR_OFFSET) & XCANPS_SR_TXFLL_MASK) != (u32)0) ? TRUE : FALSE)
/****************************************************************************/
@ -368,12 +370,12 @@ typedef struct {
* - FALSE if the TX High Priority Buffer is NOT full.
*
* @note C-Style signature:
* int XCanPs_IsHighPriorityBufFull(XCanPs *InstancePtr);
* int XCanPs_IsHighPriorityBufFull(XCanPs *InstancePtr)
*
*****************************************************************************/
#define XCanPs_IsHighPriorityBufFull(InstancePtr) \
((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \
XCANPS_SR_OFFSET) & XCANPS_SR_TXBFLL_MASK) ? TRUE : FALSE)
(((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \
XCANPS_SR_OFFSET) & XCANPS_SR_TXBFLL_MASK) != (u32)0) ? TRUE : FALSE)
/****************************************************************************/
@ -388,12 +390,12 @@ typedef struct {
* - FALSE if the RX FIFO is NOT empty.
*
* @note C-Style signature:
* int XCanPs_IsRxEmpty(XCanPs *InstancePtr);
* int XCanPs_IsRxEmpty(XCanPs *InstancePtr)
*
*****************************************************************************/
#define XCanPs_IsRxEmpty(InstancePtr) \
((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \
XCANPS_ISR_OFFSET) & XCANPS_IXR_RXNEMP_MASK) ? FALSE : TRUE)
(((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \
XCANPS_ISR_OFFSET) & XCANPS_IXR_RXNEMP_MASK) != (u32)0) ? FALSE : TRUE)
/****************************************************************************/
@ -418,12 +420,12 @@ typedef struct {
* AFMR.
*
* @note C-Style signature:
* int XCanPs_IsAcceptFilterBusy(XCanPs *InstancePtr);
* int XCanPs_IsAcceptFilterBusy(XCanPs *InstancePtr)
*
*****************************************************************************/
#define XCanPs_IsAcceptFilterBusy(InstancePtr) \
((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \
XCANPS_SR_OFFSET) & XCANPS_SR_ACFBSY_MASK) ? TRUE : FALSE)
(((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \
XCANPS_SR_OFFSET) & XCANPS_SR_ACFBSY_MASK) != (u32)0) ? TRUE : FALSE)
/****************************************************************************/
@ -445,7 +447,7 @@ typedef struct {
* u32 XCanPs_CreateIdValue(u32 StandardId,
* u32 SubRemoteTransReq,
* u32 IdExtension, u32 ExtendedId,
* u32 RemoteTransReq);
* u32 RemoteTransReq)
*
* Read the CAN specification for meaning of each parameter.
*
@ -470,7 +472,7 @@ typedef struct {
* @return Value that can be assigned to Data Length Code register.
*
* @note C-Style signature:
* u32 XCanPs_CreateDlcValue(u32 DataLengCode);
* u32 XCanPs_CreateDlcValue(u32 DataLengCode)
*
* Read the CAN specification for meaning of Data Length Code.
*
@ -489,7 +491,7 @@ typedef struct {
* @return None.
*
* @note C-Style signature:
* void XCanPs_ClearTimestamp(XCanPs *InstancePtr);
* void XCanPs_ClearTimestamp(XCanPs *InstancePtr)
*
*****************************************************************************/
#define XCanPs_ClearTimestamp(InstancePtr) \
@ -501,7 +503,7 @@ typedef struct {
/*
* Functions in xcanps.c
*/
int XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr,
s32 XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr,
u32 EffectiveAddr);
void XCanPs_Reset(XCanPs *InstancePtr);
@ -512,31 +514,33 @@ void XCanPs_GetBusErrorCounter(XCanPs *InstancePtr, u8 *RxErrorCount,
u8 *TxErrorCount);
u32 XCanPs_GetBusErrorStatus(XCanPs *InstancePtr);
void XCanPs_ClearBusErrorStatus(XCanPs *InstancePtr, u32 Mask);
int XCanPs_Send(XCanPs *InstancePtr, u32 *FramePtr);
int XCanPs_Recv(XCanPs *InstancePtr, u32 *FramePtr);
int XCanPs_SendHighPriority(XCanPs *InstancePtr, u32 *FramePtr);
s32 XCanPs_Send(XCanPs *InstancePtr, u32 *FramePtr);
s32 XCanPs_Recv(XCanPs *InstancePtr, u32 *FramePtr);
s32 XCanPs_SendHighPriority(XCanPs *InstancePtr, u32 *FramePtr);
void XCanPs_AcceptFilterEnable(XCanPs *InstancePtr, u32 FilterIndexes);
void XCanPs_AcceptFilterDisable(XCanPs *InstancePtr, u32 FilterIndexes);
u32 XCanPs_AcceptFilterGetEnabled(XCanPs *InstancePtr);
int XCanPs_AcceptFilterSet(XCanPs *InstancePtr, u32 FilterIndex,
s32 XCanPs_AcceptFilterSet(XCanPs *InstancePtr, u32 FilterIndex,
u32 MaskValue, u32 IdValue);
void XCanPs_AcceptFilterGet(XCanPs *InstancePtr, u32 FilterIndex,
u32 *MaskValue, u32 *IdValue);
int XCanPs_SetBaudRatePrescaler(XCanPs *InstancePtr, u8 Prescaler);
s32 XCanPs_SetBaudRatePrescaler(XCanPs *InstancePtr, u8 Prescaler);
u8 XCanPs_GetBaudRatePrescaler(XCanPs *InstancePtr);
int XCanPs_SetBitTiming(XCanPs *InstancePtr, u8 SyncJumpWidth,
s32 XCanPs_SetBitTiming(XCanPs *InstancePtr, u8 SyncJumpWidth,
u8 TimeSegment2, u8 TimeSegment1);
void XCanPs_GetBitTiming(XCanPs *InstancePtr, u8 *SyncJumpWidth,
u8 *TimeSegment2, u8 *TimeSegment1);
int XCanPs_SetRxIntrWatermark(XCanPs *InstancePtr, u8 Threshold);
s32 XCanPs_SetRxIntrWatermark(XCanPs *InstancePtr, u8 Threshold);
u8 XCanPs_GetRxIntrWatermark(XCanPs *InstancePtr);
s32 XCanPs_SetTxIntrWatermark(XCanPs *InstancePtr, u8 Threshold);
u8 XCanPs_GetTxIntrWatermark(XCanPs *InstancePtr);
/*
* Diagnostic functions in xcanps_selftest.c
*/
int XCanPs_SelfTest(XCanPs *InstancePtr);
s32 XCanPs_SelfTest(XCanPs *InstancePtr);
/*
* Functions in xcanps_intr.c
@ -547,7 +551,7 @@ u32 XCanPs_IntrGetEnabled(XCanPs *InstancePtr);
u32 XCanPs_IntrGetStatus(XCanPs *InstancePtr);
void XCanPs_IntrClear(XCanPs *InstancePtr, u32 Mask);
void XCanPs_IntrHandler(void *InstancePtr);
int XCanPs_SetHandler(XCanPs *InstancePtr, u32 HandlerType,
s32 XCanPs_SetHandler(XCanPs *InstancePtr, u32 HandlerType,
void *CallBackFunc, void *CallBackRef);
/*

View file

@ -73,13 +73,13 @@
*/
XCanPs_Config XCanPs_ConfigTable[XPAR_XCANPS_NUM_INSTANCES] = {
{
XPAR_XCANPS_0_DEVICE_ID, /* Unique ID of device */
XPAR_XCANPS_0_BASEADDR /* Base address of device */
(u16)XPAR_XCANPS_0_DEVICE_ID, /* Unique ID of device */
(u32)XPAR_XCANPS_0_BASEADDR /* Base address of device */
},
#ifdef XPAR_XCANPS_1_DEVICE_ID
{
XPAR_XCANPS_1_DEVICE_ID, /* Unique ID of device */
XPAR_XCANPS_1_BASEADDR /* Base address of device */
(u16)XPAR_XCANPS_1_DEVICE_ID, /* Unique ID of device */
(u32)XPAR_XCANPS_1_BASEADDR /* Base address of device */
}
#endif
};

View file

@ -48,8 +48,8 @@
/***************************** Include Files *********************************/
#include "xparameters.h"
#include "xcanps_hw.h"
#include "xparameters.h"
/************************** Constant Definitions *****************************/
@ -86,4 +86,4 @@ void XCanPs_ResetHw(u32 BaseAddr)
{
XCanPs_WriteReg(BaseAddr, XCANPS_SRR_OFFSET, \
XCANPS_SRR_SRST_MASK);
}
}

View file

@ -79,158 +79,158 @@ extern "C" {
/** @name Register offsets for the CAN. Each register is 32 bits.
* @{
*/
#define XCANPS_SRR_OFFSET 0x00 /**< Software Reset Register */
#define XCANPS_MSR_OFFSET 0x04 /**< Mode Select Register */
#define XCANPS_BRPR_OFFSET 0x08 /**< Baud Rate Prescaler */
#define XCANPS_BTR_OFFSET 0x0C /**< Bit Timing Register */
#define XCANPS_ECR_OFFSET 0x10 /**< Error Counter Register */
#define XCANPS_ESR_OFFSET 0x14 /**< Error Status Register */
#define XCANPS_SR_OFFSET 0x18 /**< Status Register */
#define XCANPS_SRR_OFFSET 0x00000000U /**< Software Reset Register */
#define XCANPS_MSR_OFFSET 0x00000004U /**< Mode Select Register */
#define XCANPS_BRPR_OFFSET 0x00000008U /**< Baud Rate Prescaler */
#define XCANPS_BTR_OFFSET 0x0000000CU /**< Bit Timing Register */
#define XCANPS_ECR_OFFSET 0x00000010U /**< Error Counter Register */
#define XCANPS_ESR_OFFSET 0x00000014U /**< Error Status Register */
#define XCANPS_SR_OFFSET 0x00000018U /**< Status Register */
#define XCANPS_ISR_OFFSET 0x1C /**< Interrupt Status Register */
#define XCANPS_IER_OFFSET 0x20 /**< Interrupt Enable Register */
#define XCANPS_ICR_OFFSET 0x24 /**< Interrupt Clear Register */
#define XCANPS_TCR_OFFSET 0x28 /**< Timestamp Control Register */
#define XCANPS_WIR_OFFSET 0x2C /**< Watermark Interrupt Reg */
#define XCANPS_ISR_OFFSET 0x0000001CU /**< Interrupt Status Register */
#define XCANPS_IER_OFFSET 0x00000020U /**< Interrupt Enable Register */
#define XCANPS_ICR_OFFSET 0x00000024U /**< Interrupt Clear Register */
#define XCANPS_TCR_OFFSET 0x00000028U /**< Timestamp Control Register */
#define XCANPS_WIR_OFFSET 0x0000002CU /**< Watermark Interrupt Reg */
#define XCANPS_TXFIFO_ID_OFFSET 0x30 /**< TX FIFO ID */
#define XCANPS_TXFIFO_DLC_OFFSET 0x34 /**< TX FIFO DLC */
#define XCANPS_TXFIFO_DW1_OFFSET 0x38 /**< TX FIFO Data Word 1 */
#define XCANPS_TXFIFO_DW2_OFFSET 0x3C /**< TX FIFO Data Word 2 */
#define XCANPS_TXFIFO_ID_OFFSET 0x00000030U /**< TX FIFO ID */
#define XCANPS_TXFIFO_DLC_OFFSET 0x00000034U /**< TX FIFO DLC */
#define XCANPS_TXFIFO_DW1_OFFSET 0x00000038U /**< TX FIFO Data Word 1 */
#define XCANPS_TXFIFO_DW2_OFFSET 0x0000003CU /**< TX FIFO Data Word 2 */
#define XCANPS_TXHPB_ID_OFFSET 0x40 /**< TX High Priority Buffer ID */
#define XCANPS_TXHPB_DLC_OFFSET 0x44 /**< TX High Priority Buffer DLC */
#define XCANPS_TXHPB_DW1_OFFSET 0x48 /**< TX High Priority Buf Data 1 */
#define XCANPS_TXHPB_DW2_OFFSET 0x4C /**< TX High Priority Buf Data Word 2 */
#define XCANPS_TXHPB_ID_OFFSET 0x00000040U /**< TX High Priority Buffer ID */
#define XCANPS_TXHPB_DLC_OFFSET 0x00000044U /**< TX High Priority Buffer DLC */
#define XCANPS_TXHPB_DW1_OFFSET 0x00000048U /**< TX High Priority Buf Data 1 */
#define XCANPS_TXHPB_DW2_OFFSET 0x0000004CU /**< TX High Priority Buf Data Word 2 */
#define XCANPS_RXFIFO_ID_OFFSET 0x50 /**< RX FIFO ID */
#define XCANPS_RXFIFO_DLC_OFFSET 0x54 /**< RX FIFO DLC */
#define XCANPS_RXFIFO_DW1_OFFSET 0x58 /**< RX FIFO Data Word 1 */
#define XCANPS_RXFIFO_DW2_OFFSET 0x5C /**< RX FIFO Data Word 2 */
#define XCANPS_RXFIFO_ID_OFFSET 0x00000050U /**< RX FIFO ID */
#define XCANPS_RXFIFO_DLC_OFFSET 0x00000054U /**< RX FIFO DLC */
#define XCANPS_RXFIFO_DW1_OFFSET 0x00000058U /**< RX FIFO Data Word 1 */
#define XCANPS_RXFIFO_DW2_OFFSET 0x0000005CU /**< RX FIFO Data Word 2 */
#define XCANPS_AFR_OFFSET 0x60 /**< Acceptance Filter Register */
#define XCANPS_AFMR1_OFFSET 0x64 /**< Acceptance Filter Mask 1 */
#define XCANPS_AFIR1_OFFSET 0x68 /**< Acceptance Filter ID 1 */
#define XCANPS_AFMR2_OFFSET 0x6C /**< Acceptance Filter Mask 2 */
#define XCANPS_AFIR2_OFFSET 0x70 /**< Acceptance Filter ID 2 */
#define XCANPS_AFMR3_OFFSET 0x74 /**< Acceptance Filter Mask 3 */
#define XCANPS_AFIR3_OFFSET 0x78 /**< Acceptance Filter ID 3 */
#define XCANPS_AFMR4_OFFSET 0x7C /**< Acceptance Filter Mask 4 */
#define XCANPS_AFIR4_OFFSET 0x80 /**< Acceptance Filter ID 4 */
#define XCANPS_AFR_OFFSET 0x00000060U /**< Acceptance Filter Register */
#define XCANPS_AFMR1_OFFSET 0x00000064U /**< Acceptance Filter Mask 1 */
#define XCANPS_AFIR1_OFFSET 0x00000068U /**< Acceptance Filter ID 1 */
#define XCANPS_AFMR2_OFFSET 0x0000006CU /**< Acceptance Filter Mask 2 */
#define XCANPS_AFIR2_OFFSET 0x00000070U /**< Acceptance Filter ID 2 */
#define XCANPS_AFMR3_OFFSET 0x00000074U /**< Acceptance Filter Mask 3 */
#define XCANPS_AFIR3_OFFSET 0x00000078U /**< Acceptance Filter ID 3 */
#define XCANPS_AFMR4_OFFSET 0x0000007CU /**< Acceptance Filter Mask 4 */
#define XCANPS_AFIR4_OFFSET 0x00000080U /**< Acceptance Filter ID 4 */
/* @} */
/** @name Software Reset Register (SRR) Bit Definitions and Masks
* @{
*/
#define XCANPS_SRR_CEN_MASK 0x00000002 /**< Can Enable */
#define XCANPS_SRR_SRST_MASK 0x00000001 /**< Reset */
#define XCANPS_SRR_CEN_MASK 0x00000002U /**< Can Enable */
#define XCANPS_SRR_SRST_MASK 0x00000001U /**< Reset */
/* @} */
/** @name Mode Select Register (MSR) Bit Definitions and Masks
* @{
*/
#define XCANPS_MSR_SNOOP_MASK 0x00000004 /**< Snoop Mode Select */
#define XCANPS_MSR_LBACK_MASK 0x00000002 /**< Loop Back Mode Select */
#define XCANPS_MSR_SLEEP_MASK 0x00000001 /**< Sleep Mode Select */
#define XCANPS_MSR_SNOOP_MASK 0x00000004U /**< Snoop Mode Select */
#define XCANPS_MSR_LBACK_MASK 0x00000002U /**< Loop Back Mode Select */
#define XCANPS_MSR_SLEEP_MASK 0x00000001U /**< Sleep Mode Select */
/* @} */
/** @name Baud Rate Prescaler register (BRPR) Bit Definitions and Masks
* @{
*/
#define XCANPS_BRPR_BRP_MASK 0x000000FF /**< Baud Rate Prescaler */
#define XCANPS_BRPR_BRP_MASK 0x000000FFU /**< Baud Rate Prescaler */
/* @} */
/** @name Bit Timing Register (BTR) Bit Definitions and Masks
* @{
*/
#define XCANPS_BTR_SJW_MASK 0x00000180 /**< Synchronization Jump Width */
#define XCANPS_BTR_SJW_SHIFT 7
#define XCANPS_BTR_TS2_MASK 0x00000070 /**< Time Segment 2 */
#define XCANPS_BTR_TS2_SHIFT 4
#define XCANPS_BTR_TS1_MASK 0x0000000F /**< Time Segment 1 */
#define XCANPS_BTR_SJW_MASK 0x00000180U /**< Synchronization Jump Width */
#define XCANPS_BTR_SJW_SHIFT 7U
#define XCANPS_BTR_TS2_MASK 0x00000070U /**< Time Segment 2 */
#define XCANPS_BTR_TS2_SHIFT 4U
#define XCANPS_BTR_TS1_MASK 0x0000000FU /**< Time Segment 1 */
/* @} */
/** @name Error Counter Register (ECR) Bit Definitions and Masks
* @{
*/
#define XCANPS_ECR_REC_MASK 0x0000FF00 /**< Receive Error Counter */
#define XCANPS_ECR_REC_SHIFT 8
#define XCANPS_ECR_TEC_MASK 0x000000FF /**< Transmit Error Counter */
#define XCANPS_ECR_REC_MASK 0x0000FF00U /**< Receive Error Counter */
#define XCANPS_ECR_REC_SHIFT 8U
#define XCANPS_ECR_TEC_MASK 0x000000FFU /**< Transmit Error Counter */
/* @} */
/** @name Error Status Register (ESR) Bit Definitions and Masks
* @{
*/
#define XCANPS_ESR_ACKER_MASK 0x00000010 /**< ACK Error */
#define XCANPS_ESR_BERR_MASK 0x00000008 /**< Bit Error */
#define XCANPS_ESR_STER_MASK 0x00000004 /**< Stuff Error */
#define XCANPS_ESR_FMER_MASK 0x00000002 /**< Form Error */
#define XCANPS_ESR_CRCER_MASK 0x00000001 /**< CRC Error */
#define XCANPS_ESR_ACKER_MASK 0x00000010U /**< ACK Error */
#define XCANPS_ESR_BERR_MASK 0x00000008U /**< Bit Error */
#define XCANPS_ESR_STER_MASK 0x00000004U /**< Stuff Error */
#define XCANPS_ESR_FMER_MASK 0x00000002U /**< Form Error */
#define XCANPS_ESR_CRCER_MASK 0x00000001U /**< CRC Error */
/* @} */
/** @name Status Register (SR) Bit Definitions and Masks
* @{
*/
#define XCANPS_SR_SNOOP_MASK 0x00001000 /**< Snoop Mask */
#define XCANPS_SR_ACFBSY_MASK 0x00000800 /**< Acceptance Filter busy */
#define XCANPS_SR_TXFLL_MASK 0x00000400 /**< TX FIFO is full */
#define XCANPS_SR_TXBFLL_MASK 0x00000200 /**< TX High Priority Buffer full */
#define XCANPS_SR_ESTAT_MASK 0x00000180 /**< Error Status */
#define XCANPS_SR_ESTAT_SHIFT 7
#define XCANPS_SR_ERRWRN_MASK 0x00000040 /**< Error Warning */
#define XCANPS_SR_BBSY_MASK 0x00000020 /**< Bus Busy */
#define XCANPS_SR_BIDLE_MASK 0x00000010 /**< Bus Idle */
#define XCANPS_SR_NORMAL_MASK 0x00000008 /**< Normal Mode */
#define XCANPS_SR_SLEEP_MASK 0x00000004 /**< Sleep Mode */
#define XCANPS_SR_LBACK_MASK 0x00000002 /**< Loop Back Mode */
#define XCANPS_SR_CONFIG_MASK 0x00000001 /**< Configuration Mode */
#define XCANPS_SR_SNOOP_MASK 0x00001000U /**< Snoop Mask */
#define XCANPS_SR_ACFBSY_MASK 0x00000800U /**< Acceptance Filter busy */
#define XCANPS_SR_TXFLL_MASK 0x00000400U /**< TX FIFO is full */
#define XCANPS_SR_TXBFLL_MASK 0x00000200U /**< TX High Priority Buffer full */
#define XCANPS_SR_ESTAT_MASK 0x00000180U /**< Error Status */
#define XCANPS_SR_ESTAT_SHIFT 7U
#define XCANPS_SR_ERRWRN_MASK 0x00000040U /**< Error Warning */
#define XCANPS_SR_BBSY_MASK 0x00000020U /**< Bus Busy */
#define XCANPS_SR_BIDLE_MASK 0x00000010U /**< Bus Idle */
#define XCANPS_SR_NORMAL_MASK 0x00000008U /**< Normal Mode */
#define XCANPS_SR_SLEEP_MASK 0x00000004U /**< Sleep Mode */
#define XCANPS_SR_LBACK_MASK 0x00000002U /**< Loop Back Mode */
#define XCANPS_SR_CONFIG_MASK 0x00000001U /**< Configuration Mode */
/* @} */
/** @name Interrupt Status/Enable/Clear Register Bit Definitions and Masks
* @{
*/
#define XCANPS_IXR_TXFEMP_MASK 0x00004000 /**< Tx Fifo Empty Interrupt */
#define XCANPS_IXR_TXFWMEMP_MASK 0x00002000 /**< Tx Fifo Watermark Empty */
#define XCANPS_IXR_RXFWMFLL_MASK 0x00001000 /**< Rx FIFO Watermark Full */
#define XCANPS_IXR_WKUP_MASK 0x00000800 /**< Wake up Interrupt */
#define XCANPS_IXR_SLP_MASK 0x00000400 /**< Sleep Interrupt */
#define XCANPS_IXR_BSOFF_MASK 0x00000200 /**< Bus Off Interrupt */
#define XCANPS_IXR_ERROR_MASK 0x00000100 /**< Error Interrupt */
#define XCANPS_IXR_RXNEMP_MASK 0x00000080 /**< RX FIFO Not Empty Interrupt */
#define XCANPS_IXR_RXOFLW_MASK 0x00000040 /**< RX FIFO Overflow Interrupt */
#define XCANPS_IXR_RXUFLW_MASK 0x00000020 /**< RX FIFO Underflow Interrupt */
#define XCANPS_IXR_RXOK_MASK 0x00000010 /**< New Message Received Intr */
#define XCANPS_IXR_TXBFLL_MASK 0x00000008 /**< TX High Priority Buf Full */
#define XCANPS_IXR_TXFLL_MASK 0x00000004 /**< TX FIFO Full Interrupt */
#define XCANPS_IXR_TXOK_MASK 0x00000002 /**< TX Successful Interrupt */
#define XCANPS_IXR_ARBLST_MASK 0x00000001 /**< Arbitration Lost Interrupt */
#define XCANPS_IXR_ALL (XCANPS_IXR_RXFWMFLL_MASK | \
XCANPS_IXR_WKUP_MASK | \
XCANPS_IXR_SLP_MASK | \
XCANPS_IXR_BSOFF_MASK | \
XCANPS_IXR_ERROR_MASK | \
XCANPS_IXR_RXNEMP_MASK | \
XCANPS_IXR_RXOFLW_MASK | \
XCANPS_IXR_RXUFLW_MASK | \
XCANPS_IXR_RXOK_MASK | \
XCANPS_IXR_TXBFLL_MASK | \
XCANPS_IXR_TXFLL_MASK | \
XCANPS_IXR_TXOK_MASK | \
XCANPS_IXR_ARBLST_MASK)
#define XCANPS_IXR_TXFEMP_MASK 0x00004000U /**< Tx Fifo Empty Interrupt */
#define XCANPS_IXR_TXFWMEMP_MASK 0x00002000U /**< Tx Fifo Watermark Empty */
#define XCANPS_IXR_RXFWMFLL_MASK 0x00001000U /**< Rx FIFO Watermark Full */
#define XCANPS_IXR_WKUP_MASK 0x00000800U /**< Wake up Interrupt */
#define XCANPS_IXR_SLP_MASK 0x00000400U /**< Sleep Interrupt */
#define XCANPS_IXR_BSOFF_MASK 0x00000200U /**< Bus Off Interrupt */
#define XCANPS_IXR_ERROR_MASK 0x00000100U /**< Error Interrupt */
#define XCANPS_IXR_RXNEMP_MASK 0x00000080U /**< RX FIFO Not Empty Interrupt */
#define XCANPS_IXR_RXOFLW_MASK 0x00000040U /**< RX FIFO Overflow Interrupt */
#define XCANPS_IXR_RXUFLW_MASK 0x00000020U /**< RX FIFO Underflow Interrupt */
#define XCANPS_IXR_RXOK_MASK 0x00000010U /**< New Message Received Intr */
#define XCANPS_IXR_TXBFLL_MASK 0x00000008U /**< TX High Priority Buf Full */
#define XCANPS_IXR_TXFLL_MASK 0x00000004U /**< TX FIFO Full Interrupt */
#define XCANPS_IXR_TXOK_MASK 0x00000002U /**< TX Successful Interrupt */
#define XCANPS_IXR_ARBLST_MASK 0x00000001U /**< Arbitration Lost Interrupt */
#define XCANPS_IXR_ALL ((u32)XCANPS_IXR_RXFWMFLL_MASK | \
(u32)XCANPS_IXR_WKUP_MASK | \
(u32)XCANPS_IXR_SLP_MASK | \
(u32)XCANPS_IXR_BSOFF_MASK | \
(u32)XCANPS_IXR_ERROR_MASK | \
(u32)XCANPS_IXR_RXNEMP_MASK | \
(u32)XCANPS_IXR_RXOFLW_MASK | \
(u32)XCANPS_IXR_RXUFLW_MASK | \
(u32)XCANPS_IXR_RXOK_MASK | \
(u32)XCANPS_IXR_TXBFLL_MASK | \
(u32)XCANPS_IXR_TXFLL_MASK | \
(u32)XCANPS_IXR_TXOK_MASK | \
(u32)XCANPS_IXR_ARBLST_MASK)
/* @} */
/** @name CAN Timestamp Control Register (TCR) Bit Definitions and Masks
* @{
*/
#define XCANPS_TCR_CTS_MASK 0x00000001 /**< Clear Timestamp counter mask */
#define XCANPS_TCR_CTS_MASK 0x00000001U /**< Clear Timestamp counter mask */
/* @} */
/** @name CAN Watermark Register (WIR) Bit Definitions and Masks
* @{
*/
#define XCANPS_WIR_FW_MASK 0x0000003F /**< Rx Full Threshold mask */
#define XCANPS_WIR_EW_MASK 0x00003F00 /**< Tx Empty Threshold mask */
#define XCANPS_WIR_EW_SHIFT 0x00000008 /**< Tx Empty Threshold shift */
#define XCANPS_WIR_FW_MASK 0x0000003FU /**< Rx Full Threshold mask */
#define XCANPS_WIR_EW_MASK 0x00003F00U /**< Tx Empty Threshold mask */
#define XCANPS_WIR_EW_SHIFT 0x00000008U /**< Tx Empty Threshold shift */
/* @} */
@ -238,67 +238,67 @@ extern "C" {
Mask/Acceptance Filter ID)
* @{
*/
#define XCANPS_IDR_ID1_MASK 0xFFE00000 /**< Standard Messg Identifier */
#define XCANPS_IDR_ID1_SHIFT 21
#define XCANPS_IDR_SRR_MASK 0x00100000 /**< Substitute Remote TX Req */
#define XCANPS_IDR_SRR_SHIFT 20
#define XCANPS_IDR_IDE_MASK 0x00080000 /**< Identifier Extension */
#define XCANPS_IDR_IDE_SHIFT 19
#define XCANPS_IDR_ID2_MASK 0x0007FFFE /**< Extended Message Ident */
#define XCANPS_IDR_ID2_SHIFT 1
#define XCANPS_IDR_RTR_MASK 0x00000001 /**< Remote TX Request */
#define XCANPS_IDR_ID1_MASK 0xFFE00000U /**< Standard Messg Identifier */
#define XCANPS_IDR_ID1_SHIFT 21U
#define XCANPS_IDR_SRR_MASK 0x00100000U /**< Substitute Remote TX Req */
#define XCANPS_IDR_SRR_SHIFT 20U
#define XCANPS_IDR_IDE_MASK 0x00080000U /**< Identifier Extension */
#define XCANPS_IDR_IDE_SHIFT 19U
#define XCANPS_IDR_ID2_MASK 0x0007FFFEU /**< Extended Message Ident */
#define XCANPS_IDR_ID2_SHIFT 1U
#define XCANPS_IDR_RTR_MASK 0x00000001U /**< Remote TX Request */
/* @} */
/** @name CAN Frame Data Length Code (TX High Priority Buffer/TX/RX)
* @{
*/
#define XCANPS_DLCR_DLC_MASK 0xF0000000 /**< Data Length Code */
#define XCANPS_DLCR_DLC_SHIFT 28
#define XCANPS_DLCR_TIMESTAMP_MASK 0x0000FFFF /**< Timestamp Mask (Rx only) */
#define XCANPS_DLCR_DLC_MASK 0xF0000000U /**< Data Length Code */
#define XCANPS_DLCR_DLC_SHIFT 28U
#define XCANPS_DLCR_TIMESTAMP_MASK 0x0000FFFFU /**< Timestamp Mask (Rx only) */
/* @} */
/** @name CAN Frame Data Word 1 (TX High Priority Buffer/TX/RX)
* @{
*/
#define XCANPS_DW1R_DB0_MASK 0xFF000000 /**< Data Byte 0 */
#define XCANPS_DW1R_DB0_SHIFT 24
#define XCANPS_DW1R_DB1_MASK 0x00FF0000 /**< Data Byte 1 */
#define XCANPS_DW1R_DB1_SHIFT 16
#define XCANPS_DW1R_DB2_MASK 0x0000FF00 /**< Data Byte 2 */
#define XCANPS_DW1R_DB2_SHIFT 8
#define XCANPS_DW1R_DB3_MASK 0x000000FF /**< Data Byte 3 */
#define XCANPS_DW1R_DB0_MASK 0xFF000000U /**< Data Byte 0 */
#define XCANPS_DW1R_DB0_SHIFT 24U
#define XCANPS_DW1R_DB1_MASK 0x00FF0000U /**< Data Byte 1 */
#define XCANPS_DW1R_DB1_SHIFT 16U
#define XCANPS_DW1R_DB2_MASK 0x0000FF00U /**< Data Byte 2 */
#define XCANPS_DW1R_DB2_SHIFT 8U
#define XCANPS_DW1R_DB3_MASK 0x000000FFU /**< Data Byte 3 */
/* @} */
/** @name CAN Frame Data Word 2 (TX High Priority Buffer/TX/RX)
* @{
*/
#define XCANPS_DW2R_DB4_MASK 0xFF000000 /**< Data Byte 4 */
#define XCANPS_DW2R_DB4_SHIFT 24
#define XCANPS_DW2R_DB5_MASK 0x00FF0000 /**< Data Byte 5 */
#define XCANPS_DW2R_DB5_SHIFT 16
#define XCANPS_DW2R_DB6_MASK 0x0000FF00 /**< Data Byte 6 */
#define XCANPS_DW2R_DB6_SHIFT 8
#define XCANPS_DW2R_DB7_MASK 0x000000FF /**< Data Byte 7 */
#define XCANPS_DW2R_DB4_MASK 0xFF000000U /**< Data Byte 4 */
#define XCANPS_DW2R_DB4_SHIFT 24U
#define XCANPS_DW2R_DB5_MASK 0x00FF0000U /**< Data Byte 5 */
#define XCANPS_DW2R_DB5_SHIFT 16U
#define XCANPS_DW2R_DB6_MASK 0x0000FF00U /**< Data Byte 6 */
#define XCANPS_DW2R_DB6_SHIFT 8U
#define XCANPS_DW2R_DB7_MASK 0x000000FFU /**< Data Byte 7 */
/* @} */
/** @name Acceptance Filter Register (AFR) Bit Definitions and Masks
* @{
*/
#define XCANPS_AFR_UAF4_MASK 0x00000008 /**< Use Acceptance Filter No.4 */
#define XCANPS_AFR_UAF3_MASK 0x00000004 /**< Use Acceptance Filter No.3 */
#define XCANPS_AFR_UAF2_MASK 0x00000002 /**< Use Acceptance Filter No.2 */
#define XCANPS_AFR_UAF1_MASK 0x00000001 /**< Use Acceptance Filter No.1 */
#define XCANPS_AFR_UAF_ALL_MASK (XCANPS_AFR_UAF4_MASK | \
XCANPS_AFR_UAF3_MASK | \
XCANPS_AFR_UAF2_MASK | \
XCANPS_AFR_UAF1_MASK)
#define XCANPS_AFR_UAF4_MASK 0x00000008U /**< Use Acceptance Filter No.4 */
#define XCANPS_AFR_UAF3_MASK 0x00000004U /**< Use Acceptance Filter No.3 */
#define XCANPS_AFR_UAF2_MASK 0x00000002U /**< Use Acceptance Filter No.2 */
#define XCANPS_AFR_UAF1_MASK 0x00000001U /**< Use Acceptance Filter No.1 */
#define XCANPS_AFR_UAF_ALL_MASK ((u32)XCANPS_AFR_UAF4_MASK | \
(u32)XCANPS_AFR_UAF3_MASK | \
(u32)XCANPS_AFR_UAF2_MASK | \
(u32)XCANPS_AFR_UAF1_MASK)
/* @} */
/** @name CAN frame length constants
* @{
*/
#define XCANPS_MAX_FRAME_SIZE 16 /**< Maximum CAN frame length in bytes */
#define XCANPS_MAX_FRAME_SIZE sizeof(u32)*16U /**< Maximum CAN frame length in bytes */
/* @} */
/* For backwards compatibilty */
@ -332,7 +332,7 @@ extern "C" {
*
*****************************************************************************/
#define XCanPs_ReadReg(BaseAddr, RegOffset) \
Xil_In32((BaseAddr) + (RegOffset))
Xil_In32((BaseAddr) + (u32)(RegOffset))
/****************************************************************************/
@ -350,7 +350,7 @@ extern "C" {
*
*****************************************************************************/
#define XCanPs_WriteReg(BaseAddr, RegOffset, Data) \
Xil_Out32((BaseAddr) + (RegOffset), (Data))
Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data))
/************************** Function Prototypes ******************************/
/*

View file

@ -231,7 +231,7 @@ void XCanPs_IntrHandler(void *InstancePtr)
u32 PendingIntr;
u32 EventIntr;
u32 ErrorStatus;
XCanPs *CanPtr = (XCanPs *) InstancePtr;
XCanPs *CanPtr = (XCanPs *) ((void *)InstancePtr);
Xil_AssertVoid(CanPtr != NULL);
Xil_AssertVoid(CanPtr->IsReady == XIL_COMPONENT_IS_READY);
@ -248,14 +248,15 @@ void XCanPs_IntrHandler(void *InstancePtr)
/*
* An error interrupt is occurring.
*/
if ((PendingIntr & XCANPS_IXR_ERROR_MASK)) {
ErrorStatus = XCanPs_GetBusErrorStatus(CanPtr);
CanPtr->ErrorHandler(CanPtr->ErrorRef, ErrorStatus);
if (((PendingIntr & XCANPS_IXR_ERROR_MASK) != (u32)0) &&
(CanPtr->ErrorHandler != NULL)) {
CanPtr->ErrorHandler(CanPtr->ErrorRef,
XCanPs_GetBusErrorStatus(CanPtr));
/*
* Clear Error Status Register.
*/
XCanPs_ClearBusErrorStatus(CanPtr, ErrorStatus);
XCanPs_ClearBusErrorStatus(CanPtr,
XCanPs_GetBusErrorStatus(CanPtr));
}
/*
@ -271,18 +272,18 @@ void XCanPs_IntrHandler(void *InstancePtr)
*
* If so, call event callback provided by upper level.
*/
EventIntr = PendingIntr & (XCANPS_IXR_RXOFLW_MASK |
XCANPS_IXR_RXUFLW_MASK |
XCANPS_IXR_TXBFLL_MASK |
XCANPS_IXR_TXFLL_MASK |
XCANPS_IXR_WKUP_MASK |
XCANPS_IXR_SLP_MASK |
XCANPS_IXR_BSOFF_MASK |
XCANPS_IXR_ARBLST_MASK);
if (EventIntr) {
EventIntr = PendingIntr & ((u32)XCANPS_IXR_RXOFLW_MASK |
(u32)XCANPS_IXR_RXUFLW_MASK |
(u32)XCANPS_IXR_TXBFLL_MASK |
(u32)XCANPS_IXR_TXFLL_MASK |
(u32)XCANPS_IXR_WKUP_MASK |
(u32)XCANPS_IXR_SLP_MASK |
(u32)XCANPS_IXR_BSOFF_MASK |
(u32)XCANPS_IXR_ARBLST_MASK);
if ((EventIntr != (u32)0) && (CanPtr->EventHandler != NULL)) {
CanPtr->EventHandler(CanPtr->EventRef, EventIntr);
if ((EventIntr & XCANPS_IXR_BSOFF_MASK)) {
if ((EventIntr & XCANPS_IXR_BSOFF_MASK) != (u32)0) {
/*
* Event callback should reset whole device if "Enter
* Bus Off Status" interrupt occurred. All pending
@ -290,12 +291,16 @@ void XCanPs_IntrHandler(void *InstancePtr)
* handling of other interrupts is needed any more.
*/
return;
} else {
/*This else was made for misra-c compliance*/
;
}
}
if ((PendingIntr & (XCANPS_IXR_RXFWMFLL_MASK |
XCANPS_IXR_RXNEMP_MASK))) {
if (((PendingIntr & (XCANPS_IXR_RXFWMFLL_MASK |
XCANPS_IXR_RXNEMP_MASK)) != (u32)0) &&
(CanPtr->RecvHandler != NULL)) {
/*
* This case happens when
@ -317,7 +322,8 @@ void XCanPs_IntrHandler(void *InstancePtr)
/*
* A frame was transmitted successfully.
*/
if ((PendingIntr & XCANPS_IXR_TXOK_MASK)) {
if (((PendingIntr & XCANPS_IXR_TXOK_MASK) != (u32)0) &&
(CanPtr->SendHandler != NULL)) {
CanPtr->SendHandler(CanPtr->SendRef);
}
}
@ -365,38 +371,46 @@ void XCanPs_IntrHandler(void *InstancePtr)
* it with the new handler.
*
******************************************************************************/
int XCanPs_SetHandler(XCanPs *InstancePtr, u32 HandlerType,
s32 XCanPs_SetHandler(XCanPs *InstancePtr, u32 HandlerType,
void *CallBackFunc, void *CallBackRef)
{
s32 Status;
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
switch (HandlerType) {
case XCANPS_HANDLER_SEND:
InstancePtr->SendHandler =
(XCanPs_SendRecvHandler) CallBackFunc;
InstancePtr->SendRef = CallBackRef;
break;
case XCANPS_HANDLER_SEND:
InstancePtr->SendHandler =
(XCanPs_SendRecvHandler) CallBackFunc;
InstancePtr->SendRef = CallBackRef;
Status = XST_SUCCESS;
break;
case XCANPS_HANDLER_RECV:
InstancePtr->RecvHandler =
(XCanPs_SendRecvHandler) CallBackFunc;
InstancePtr->RecvRef = CallBackRef;
break;
case XCANPS_HANDLER_RECV:
InstancePtr->RecvHandler =
(XCanPs_SendRecvHandler) CallBackFunc;
InstancePtr->RecvRef = CallBackRef;
Status = XST_SUCCESS;
break;
case XCANPS_HANDLER_ERROR:
InstancePtr->ErrorHandler = (XCanPs_ErrorHandler) CallBackFunc;
InstancePtr->ErrorRef = CallBackRef;
break;
case XCANPS_HANDLER_ERROR:
InstancePtr->ErrorHandler =
(XCanPs_ErrorHandler) CallBackFunc;
InstancePtr->ErrorRef = CallBackRef;
Status = XST_SUCCESS;
break;
case XCANPS_HANDLER_EVENT:
InstancePtr->EventHandler = (XCanPs_EventHandler) CallBackFunc;
InstancePtr->EventRef = CallBackRef;
break;
default:
return (XST_INVALID_PARAM);
case XCANPS_HANDLER_EVENT:
InstancePtr->EventHandler =
(XCanPs_EventHandler) CallBackFunc;
InstancePtr->EventRef = CallBackRef;
Status = XST_SUCCESS;
break;
default:
Status = XST_INVALID_PARAM;
break;
}
return (XST_SUCCESS);
return Status;
}

View file

@ -63,9 +63,9 @@
/************************** Constant Definitions ****************************/
#define XCANPS_MAX_FRAME_SIZE_IN_WORDS (XCANPS_MAX_FRAME_SIZE / sizeof(u32))
#define XCANPS_MAX_FRAME_SIZE_IN_WORDS ((XCANPS_MAX_FRAME_SIZE) / (sizeof(u32)))
#define FRAME_DATA_LENGTH 8 /* Frame Data field length */
#define FRAME_DATA_LENGTH 8U /* Frame Data field length */
/**************************** Type Definitions ******************************/
@ -111,11 +111,13 @@ static u32 RxFrame[XCANPS_MAX_FRAME_SIZE_IN_WORDS];
* have a chance to check reason(s) causing the failure.
*
******************************************************************************/
int XCanPs_SelfTest(XCanPs *InstancePtr)
s32 XCanPs_SelfTest(XCanPs *InstancePtr)
{
u8 *FramePtr;
u32 Status;
s32 Status;
u32 Index;
u8 GetModeResult;
u32 RxEmptyResult;
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
@ -128,7 +130,8 @@ int XCanPs_SelfTest(XCanPs *InstancePtr)
* it is not Configuration Mode.
*/
if (XCanPs_GetMode(InstancePtr) != XCANPS_MODE_CONFIG) {
return XST_FAILURE;
Status = XST_FAILURE;
return Status;
}
/*
@ -137,64 +140,81 @@ int XCanPs_SelfTest(XCanPs *InstancePtr)
* equal to 24MHz. For more information see the CAN 2.0A, CAN 2.0B,
* ISO 11898-1 specifications.
*/
XCanPs_SetBaudRatePrescaler(InstancePtr, 29);
XCanPs_SetBitTiming(InstancePtr, 3, 2, 15);
(void)XCanPs_SetBaudRatePrescaler(InstancePtr, (u8)29U);
(void)XCanPs_SetBitTiming(InstancePtr, (u8)3U, (u8)2U, (u8)15U);
/*
* Enter the loop back mode.
*/
XCanPs_EnterMode(InstancePtr, XCANPS_MODE_LOOPBACK);
while (XCanPs_GetMode(InstancePtr) != XCANPS_MODE_LOOPBACK);
GetModeResult = XCanPs_GetMode(InstancePtr);
while (GetModeResult != ((u8)XCANPS_MODE_LOOPBACK)) {
GetModeResult = XCanPs_GetMode(InstancePtr);
}
/*
* Create a frame to send with known values so we can verify them
* on receive.
*/
TxFrame[0] = (u32)XCanPs_CreateIdValue((u32)2000, 0, 0, 0, 0);
TxFrame[1] = (u32)XCanPs_CreateDlcValue((u32)8);
TxFrame[0] = (u32)XCanPs_CreateIdValue((u32)2000U, (u32)0U, (u32)0U, (u32)0U, (u32)0U);
TxFrame[1] = (u32)XCanPs_CreateDlcValue((u32)8U);
FramePtr = (u8 *) (&TxFrame[2]);
for (Index = 0; Index < 8; Index++) {
*FramePtr++ = (u8) Index;
FramePtr = (u8 *)((void *)(&TxFrame[2]));
for (Index = 0U; Index < 8U; Index++) {
if(*FramePtr != 0U) {
*FramePtr = (u8)Index;
*FramePtr++;
}
}
/*
* Send the frame.
*/
Status = XCanPs_Send(InstancePtr, TxFrame);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
if (Status != (s32)XST_SUCCESS) {
Status = XST_FAILURE;
return Status;
}
/*
* Wait until the frame arrives RX FIFO via internal loop back.
*/
while (XCanPs_IsRxEmpty(InstancePtr) == TRUE);
RxEmptyResult = XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr),
XCANPS_ISR_OFFSET) & XCANPS_IXR_RXNEMP_MASK;
while (RxEmptyResult == (u32)0U) {
RxEmptyResult = XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr),
XCANPS_ISR_OFFSET) & XCANPS_IXR_RXNEMP_MASK;
}
/*
* Receive the frame.
*/
Status = XCanPs_Recv(InstancePtr, RxFrame);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
if (Status != (s32)XST_SUCCESS) {
Status = XST_FAILURE;
return Status;
}
/*
* Verify Identifier and Data Length Code.
*/
if (RxFrame[0] !=
(u32)XCanPs_CreateIdValue((u32)2000, 0, 0, 0, 0)) {
return XST_FAILURE;
(u32)XCanPs_CreateIdValue((u32)2000U, (u32)0U, (u32)0U, (u32)0U, (u32)0U)) {
Status = XST_FAILURE;
return Status;
}
if ((RxFrame[1] & ~XCANPS_DLCR_TIMESTAMP_MASK) != TxFrame[1]) {
return XST_FAILURE;
Status = XST_FAILURE;
return Status;
}
for (Index = 2; Index < XCANPS_MAX_FRAME_SIZE_IN_WORDS; Index++) {
for (Index = 2U; Index < (XCANPS_MAX_FRAME_SIZE_IN_WORDS); Index++) {
if (RxFrame[Index] != TxFrame[Index]) {
return XST_FAILURE;
Status = XST_FAILURE;
return Status;
}
}
@ -203,5 +223,8 @@ int XCanPs_SelfTest(XCanPs *InstancePtr)
*/
XCanPs_Reset(InstancePtr);
return XST_SUCCESS;
Status = XST_SUCCESS;
return Status;
}

View file

@ -54,8 +54,8 @@
/***************************** Include Files *********************************/
#include "xparameters.h"
#include "xcanps.h"
#include "xparameters.h"
/************************** Constant Definitions *****************************/
@ -66,7 +66,8 @@
/************************** Function Prototypes ******************************/
/************************** Variable Definitions *****************************/
extern XCanPs_Config XCanPs_ConfigTable[];
extern XCanPs_Config XCanPs_ConfigTable[XPAR_XCANPS_NUM_INSTANCES];
/*****************************************************************************/
/**
@ -88,12 +89,12 @@ XCanPs_Config *XCanPs_LookupConfig(u16 DeviceId)
XCanPs_Config *CfgPtr = NULL;
u32 Index;
for (Index = 0; Index < XPAR_XCANPS_NUM_INSTANCES; Index++) {
for (Index = 0U; Index < (u32)XPAR_XCANPS_NUM_INSTANCES; Index++) {
if (XCanPs_ConfigTable[Index].DeviceId == DeviceId) {
CfgPtr = &XCanPs_ConfigTable[Index];
break;
}
}
return CfgPtr;
return (XCanPs_Config *)CfgPtr;
}