blob: 8981fb7456b82ba3f4b955ce289525f04345b86f [file] [log] [blame]
/* ----------------------------------------------------------------------------
* SAM Software Package License
* ----------------------------------------------------------------------------
* Copyright (c) 2011, Atmel Corporation
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
*
* Atmel's name may not be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Interface for configuring and using Timer Counter (TC) peripherals.
*
* \section Usage
* -# Optionally, use TC_FindMckDivisor() to let the program find the best
* TCCLKS field value automatically.
* -# Configure a Timer Counter in the desired mode using TC_Configure().
* -# Start or stop the timer clock using TC_Start() and TC_Stop().
*/
#ifndef _MCAN_
#define _MCAN_
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include "chip.h"
#include <stdint.h>
/*------------------------------------------------------------------------------
* Global functions
*------------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif
typedef enum
{
CAN_STD_ID = 0,
CAN_EXT_ID = 1
} MCan_IdType;
typedef enum
{
CAN_DLC_0 = 0,
CAN_DLC_1 = 1,
CAN_DLC_2 = 2,
CAN_DLC_3 = 3,
CAN_DLC_4 = 4,
CAN_DLC_5 = 5,
CAN_DLC_6 = 6,
CAN_DLC_7 = 7,
CAN_DLC_8 = 8,
CAN_DLC_12 = 9,
CAN_DLC_16 = 10,
CAN_DLC_20 = 11,
CAN_DLC_24 = 12,
CAN_DLC_32 = 13,
CAN_DLC_48 = 14,
CAN_DLC_64 = 15
} MCan_DlcType;
typedef enum
{
CAN_FIFO_0 = 0,
CAN_FIFO_1 = 1
} MCan_FifoType;
typedef enum
{
CAN_INTR_LINE_0 = 0,
CAN_INTR_LINE_1 = 1
} MCan_IntrLineType;
typedef struct MailboxInfoTag
{
uint32_t id;
uint32_t length;
uint32_t timestamp;
} MailboxInfoType;
typedef struct MailBox8Tag
{
MailboxInfoType info;
uint8_t data[8];
} Mailbox8Type;
typedef struct MailBox12Tag
{
MailboxInfoType info;
uint8_t data[12];
} Mailbox12Type;
typedef struct MailBox16Tag
{
MailboxInfoType info;
uint8_t data[16];
} Mailbox16Type;
typedef struct MailBox20Tag
{
MailboxInfoType info;
uint8_t data[20];
} Mailbox20Type;
typedef struct MailBox24Tag
{
MailboxInfoType info;
uint8_t data[24];
} Mailbox24Type;
typedef struct MailBox32Tag
{
MailboxInfoType info;
uint8_t data[32];
} Mailbox32ype;
typedef struct MailBox48Tag
{
MailboxInfoType info;
uint8_t data[48];
} Mailbox48Type;
typedef struct MailBox64Tag
{
MailboxInfoType info;
uint8_t data[64];
} Mailbox64Type;
typedef struct MCan_MsgRamPntrsTag
{
uint32_t * pStdFilts;
uint32_t * pExtFilts;
uint32_t * pRxFifo0;
uint32_t * pRxFifo1;
uint32_t * pRxDedBuf;
uint32_t * pTxEvtFifo;
uint32_t * pTxDedBuf;
uint32_t * pTxFifoQ;
} MCan_MsgRamPntrs;
typedef struct MCan_ConfigTag
{
Mcan * pMCan;
uint32_t bitTiming;
uint32_t fastBitTiming;
uint32_t nmbrStdFilts;
uint32_t nmbrExtFilts;
uint32_t nmbrFifo0Elmts;
uint32_t nmbrFifo1Elmts;
uint32_t nmbrRxDedBufElmts;
uint32_t nmbrTxEvtFifoElmts;
uint32_t nmbrTxDedBufElmts;
uint32_t nmbrTxFifoQElmts;
uint32_t rxFifo0ElmtSize;
uint32_t rxFifo1ElmtSize;
uint32_t rxBufElmtSize;
// Element sizes and data sizes (encoded element size)
uint32_t txBufElmtSize;
// Element size and data size (encoded element size)
MCan_MsgRamPntrs msgRam;
} MCan_ConfigType;
extern const MCan_ConfigType mcan0Config;
extern const MCan_ConfigType mcan1Config;
__STATIC_INLINE uint32_t MCAN_IsTxComplete(
const MCan_ConfigType * mcanConfig )
{
Mcan * mcan = mcanConfig->pMCan;
return ( mcan->MCAN_IR & MCAN_IR_TC );
}
__STATIC_INLINE void MCAN_ClearTxComplete(
const MCan_ConfigType * mcanConfig )
{
Mcan * mcan = mcanConfig->pMCan;
mcan->MCAN_IR = MCAN_IR_TC;
}
__STATIC_INLINE uint32_t MCAN_IsMessageStoredToRxDedBuffer(
const MCan_ConfigType * mcanConfig )
{
Mcan * mcan = mcanConfig->pMCan;
return ( mcan->MCAN_IR & MCAN_IR_DRX );
}
__STATIC_INLINE void MCAN_ClearMessageStoredToRxBuffer(
const MCan_ConfigType * mcanConfig )
{
Mcan * mcan = mcanConfig->pMCan;
mcan->MCAN_IR = MCAN_IR_DRX;
}
__STATIC_INLINE uint32_t MCAN_IsMessageStoredToRxFifo0(
const MCan_ConfigType * mcanConfig )
{
Mcan * mcan = mcanConfig->pMCan;
return ( mcan->MCAN_IR & MCAN_IR_RF0N );
}
__STATIC_INLINE void MCAN_ClearMessageStoredToRxFifo0(
const MCan_ConfigType * mcanConfig )
{
Mcan * mcan = mcanConfig->pMCan;
mcan->MCAN_IR = MCAN_IR_RF0N;
}
__STATIC_INLINE uint32_t MCAN_IsMessageStoredToRxFifo1(
const MCan_ConfigType * mcanConfig )
{
Mcan * mcan = mcanConfig->pMCan;
return ( mcan->MCAN_IR & MCAN_IR_RF1N );
}
__STATIC_INLINE void MCAN_ClearMessageStoredToRxFifo1(
const MCan_ConfigType * mcanConfig )
{
Mcan * mcan = mcanConfig->pMCan;
mcan->MCAN_IR = MCAN_IR_RF1N;
}
void MCAN_Init(
const MCan_ConfigType * mcanConfig );
void MCAN_InitFdEnable(
const MCan_ConfigType * mcanConfig );
void MCAN_InitFdBitRateSwitchEnable(
const MCan_ConfigType * mcanConfig );
void MCAN_InitTxQueue(
const MCan_ConfigType * mcanConfig );
void MCAN_InitLoopback(
const MCan_ConfigType * mcanConfig );
void MCAN_Enable(
const MCan_ConfigType * mcanConfig );
void MCAN_RequestIso11898_1(
const MCan_ConfigType * mcanConfig );
void MCAN_RequestFd(
const MCan_ConfigType * mcanConfig );
void MCAN_RequestFdBitRateSwitch(
const MCan_ConfigType * mcanConfig );
void MCAN_LoopbackOn(
const MCan_ConfigType * mcanConfig );
void MCAN_LoopbackOff(
const MCan_ConfigType * mcanConfig );
void MCAN_IEnableMessageStoredToRxDedBuffer(
const MCan_ConfigType * mcanConfig,
MCan_IntrLineType line );
uint8_t * MCAN_ConfigTxDedBuffer(
const MCan_ConfigType * mcanConfig,
uint8_t buffer,
uint32_t id,
MCan_IdType idType,
MCan_DlcType dlc );
void MCAN_SendTxDedBuffer(
const MCan_ConfigType * mcanConfig,
uint8_t buffer );
uint32_t MCAN_AddToTxFifoQ(
const MCan_ConfigType * mcanConfig,
uint32_t id, MCan_IdType idType,
MCan_DlcType dlc, uint8_t * data );
uint8_t MCAN_IsBufferTxd(
const MCan_ConfigType * mcanConfig,
uint8_t buffer );
void MCAN_ConfigRxBufferFilter(
const MCan_ConfigType * mcanConfig,
uint32_t buffer,
uint32_t filter,
uint32_t id,
MCan_IdType idType);
void MCAN_ConfigRxClassicFilter(
const MCan_ConfigType * mcanConfig,
MCan_FifoType fifo,
uint8_t filter,
uint32_t id,
MCan_IdType idType,
uint32_t mask );
uint8_t MCAN_IsNewDataInRxDedBuffer(
const MCan_ConfigType * mcanConfig,
uint8_t buffer );
void MCAN_GetRxDedBuffer(
const MCan_ConfigType * mcanConfig,
uint8_t buffer,
Mailbox64Type * pRxMailbox );
uint32_t MCAN_GetRxFifoBuffer(
const MCan_ConfigType * mcanConfig,
MCan_FifoType fifo,
Mailbox64Type * pRxMailbox );
#ifdef __cplusplus
}
#endif
#endif /* #ifndef _MCAN_ */