306 lines
8.6 KiB
C
306 lines
8.6 KiB
C
/**
|
|
* @file xmc_common.h
|
|
* @date 2017-08-03
|
|
*
|
|
* @cond
|
|
*********************************************************************************************************************
|
|
* XMClib v2.1.16 - XMC Peripheral Driver Library
|
|
*
|
|
* Copyright (c) 2015-2017, Infineon Technologies AG
|
|
* 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 following
|
|
* disclaimer.
|
|
*
|
|
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
|
|
* disclaimer in the documentation and/or other materials provided with the distribution.
|
|
*
|
|
* Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote
|
|
* products derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
* To improve the quality of the software, users are encouraged to share modifications, enhancements or bug fixes with
|
|
* Infineon Technologies AG dave@infineon.com).
|
|
*********************************************************************************************************************
|
|
*
|
|
* Change History
|
|
* --------------
|
|
*
|
|
* 2015-06-20:
|
|
* - Initial
|
|
* - Brief section updated
|
|
* - Added XMC_LIB_VERSION macro
|
|
*
|
|
* 2016-02-26:
|
|
* - Updated XMC_LIB_VERSION macro to v2.1.6
|
|
*
|
|
* 2016-05-30:
|
|
* - Updated XMC_LIB_VERSION macro to v2.1.8
|
|
*
|
|
* 2016-11-18:
|
|
* - Updated XMC_LIB_VERSION macro to v2.1.10
|
|
* - Changed type of size in XMC_PRIOARRAY_t to fix compilation warnings
|
|
*
|
|
* 2017-04-04:
|
|
* - Updated XMC_LIB_VERSION macro to v2.1.12
|
|
*
|
|
* 2017-06-24:
|
|
* - Updated XMC_LIB_VERSION macro to v2.1.14
|
|
*
|
|
* 2017-08-03:
|
|
* - Updated XMC_LIB_VERSION macro to v2.1.16
|
|
* - Added __RAM_FUNC macro
|
|
*
|
|
* @endcond
|
|
*
|
|
*/
|
|
|
|
#ifndef XMC_COMMON_H
|
|
#define XMC_COMMON_H
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <string.h>
|
|
|
|
#include "xmc_device.h"
|
|
|
|
/**
|
|
* @addtogroup XMClib XMC Peripheral Library
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @addtogroup COMMON
|
|
* @brief Common APIs to all peripherals for XMC microcontroller family
|
|
* @{
|
|
*/
|
|
|
|
/**********************************************************************************************************************
|
|
* MACROS
|
|
*********************************************************************************************************************/
|
|
#define XMC_LIB_MAJOR_VERSION (2U)
|
|
#define XMC_LIB_MINOR_VERSION (1U)
|
|
#define XMC_LIB_PATCH_VERSION (16U)
|
|
|
|
#define XMC_LIB_VERSION ((XMC_LIB_MAJOR_VERSION << 16U) + (XMC_LIB_MINOR_VERSION << 8U) + XMC_LIB_PATCH_VERSION)
|
|
|
|
/* Define WEAK attribute */
|
|
#if !defined(__WEAK)
|
|
#if defined ( __CC_ARM )
|
|
#define __WEAK __attribute__ ((weak))
|
|
#elif defined ( __ICCARM__ )
|
|
#define __WEAK __weak
|
|
#elif defined ( __GNUC__ )
|
|
#define __WEAK __attribute__ ((weak))
|
|
#elif defined ( __TASKING__ )
|
|
#define __WEAK __attribute__ ((weak))
|
|
#endif
|
|
#endif
|
|
|
|
#if !defined(__RAM_FUNC)
|
|
#if defined ( __CC_ARM )
|
|
// http://www.keil.com/support/docs/3723.htm
|
|
#define __RAM_FUNC __attribute__((section("RAMCODESECTION")))
|
|
#elif defined ( __ICCARM__ )
|
|
// https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x/
|
|
#define __RAM_FUNC __ramfunc
|
|
#elif defined ( __GNUC__ )
|
|
#define __RAM_FUNC __attribute__((section(".ram_code"), long_call))
|
|
#elif defined ( __TASKING__ )
|
|
#define __RAM_FUNC __attribute__((section(".ram_code")))
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef XMC_ASSERT_ENABLE
|
|
#define XMC_ASSERT(msg, exp) { if(!(exp)) {XMC_AssertHandler(msg, __FILE__, __LINE__);} }
|
|
#else
|
|
#define XMC_ASSERT(msg, exp) { ; }
|
|
#endif
|
|
|
|
#ifdef XMC_DEBUG_ENABLE
|
|
#include <stdio.h>
|
|
#define XMC_DEBUG(...) { printf(__VA_ARGS__); }
|
|
#else
|
|
#define XMC_DEBUG(...) { ; }
|
|
#endif
|
|
|
|
#define XMC_UNUSED_ARG(x) (void)x
|
|
|
|
#define XMC_STRUCT_INIT(m) memset(&m, 0, sizeof(m))
|
|
|
|
#define XMC_PRIOARRAY_DEF(name, size) \
|
|
XMC_PRIOARRAY_ITEM_t prioarray_m_##name[size + 2]; \
|
|
XMC_PRIOARRAY_t prioarray_def_##name = {(size), (prioarray_m_##name)};
|
|
|
|
#define XMC_PRIOARRAY(name) \
|
|
&prioarray_def_##name
|
|
|
|
/**********************************************************************************************************************
|
|
* DATA STRUCTURES
|
|
*********************************************************************************************************************/
|
|
/*
|
|
*
|
|
*/
|
|
typedef struct XMC_DRIVER_VERSION
|
|
{
|
|
uint8_t major;
|
|
uint8_t minor;
|
|
uint8_t patch;
|
|
} XMC_DRIVER_VERSION_t;
|
|
|
|
/*
|
|
*
|
|
*/
|
|
typedef void *XMC_LIST_t;
|
|
|
|
/*
|
|
*
|
|
*/
|
|
typedef struct XMC_PRIOARRAY_ITEM
|
|
{
|
|
int32_t priority;
|
|
int32_t previous;
|
|
int32_t next;
|
|
} XMC_PRIOARRAY_ITEM_t;
|
|
|
|
/*
|
|
*
|
|
*/
|
|
typedef struct XMC_PRIOARRAY
|
|
{
|
|
int32_t size;
|
|
XMC_PRIOARRAY_ITEM_t *items;
|
|
} XMC_PRIOARRAY_t;
|
|
|
|
/**********************************************************************************************************************
|
|
* API PROTOTYPES
|
|
*********************************************************************************************************************/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void XMC_AssertHandler(const char *const msg, const char *const file, uint32_t line);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void XMC_LIST_Init(XMC_LIST_t *list);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void XMC_LIST_Add(XMC_LIST_t *list, void *const item);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void XMC_LIST_Remove(XMC_LIST_t *list, void *const item);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
uint32_t XMC_LIST_GetLength(XMC_LIST_t *list);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void *XMC_LIST_GetHead(XMC_LIST_t *list);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void *XMC_LIST_GetTail(XMC_LIST_t *list);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void XMC_LIST_Insert(XMC_LIST_t *list, void *prev_item, void *new_item);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void XMC_PRIOARRAY_Init(XMC_PRIOARRAY_t *prioarray);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void XMC_PRIOARRAY_Add(XMC_PRIOARRAY_t *prioarray, int32_t item, int32_t priority);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void XMC_PRIOARRAY_Remove(XMC_PRIOARRAY_t *prioarray, int32_t item);
|
|
|
|
/*
|
|
*
|
|
*/
|
|
__STATIC_INLINE int32_t XMC_PRIOARRAY_GetHead(XMC_PRIOARRAY_t *prioarray)
|
|
{
|
|
XMC_ASSERT("XMC_PRIOARRAY_Init: NULL pointer", prioarray != NULL);
|
|
return prioarray->items[prioarray->size].next;
|
|
}
|
|
|
|
/*
|
|
*
|
|
*/
|
|
__STATIC_INLINE int32_t XMC_PRIOARRAY_GetTail(XMC_PRIOARRAY_t *prioarray)
|
|
{
|
|
XMC_ASSERT("XMC_PRIOARRAY_Init: NULL pointer", prioarray != NULL);
|
|
return prioarray->items[prioarray->size + 1].previous;
|
|
}
|
|
|
|
/*
|
|
*
|
|
*/
|
|
__STATIC_INLINE int32_t XMC_PRIOARRAY_GetItemPriority(XMC_PRIOARRAY_t *prioarray, int32_t item)
|
|
{
|
|
XMC_ASSERT("XMC_PRIOARRAY_GetItemPriority: item out of range", (item >= 0) && (item < prioarray->size));
|
|
return prioarray->items[item].priority;
|
|
}
|
|
|
|
/*
|
|
*
|
|
*/
|
|
__STATIC_INLINE int32_t XMC_PRIOARRAY_GetItemNext(XMC_PRIOARRAY_t *prioarray, int32_t item)
|
|
{
|
|
XMC_ASSERT("XMC_PRIOARRAY_GetItemNext: item out of range", (item >= 0) && (item < prioarray->size));
|
|
return prioarray->items[item].next;
|
|
}
|
|
|
|
/*
|
|
*
|
|
*/
|
|
__STATIC_INLINE int32_t XMC_PRIOARRAY_GetItemPrevious(XMC_PRIOARRAY_t *prioarray, int32_t item)
|
|
{
|
|
XMC_ASSERT("XMC_PRIOARRAY_GetItemPrevious: item out of range", (item >= 0) && (item < prioarray->size));
|
|
return prioarray->items[item].previous;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* XMC_COMMON_H */
|