blob: a54189f42d8eb2b7b0239681e1d3020bde219b7f [file] [log] [blame]
/*****************************************************************************
*
* MODULE: ALL MODULES
*
* DESCRIPTION: The JENNIC standard header file defining extensions to
* ANSI C standard required by the Jennic C coding standard.
*
****************************************************************************
*
* This software is owned by NXP B.V. and/or its supplier and is protected
* under applicable copyright laws. All rights are reserved. We grant You,
* and any third parties, a license to use this software solely and
* exclusively on NXP products [NXP Microcontrollers such as JN5148, JN5142, JN5139].
* You, and any third parties must reproduce the copyright and warranty notice
* and any other legend of ownership on each copy or partial copy of the
* software.
*
* 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.
*
* Copyright NXP B.V. 2012. All rights reserved
*
***************************************************************************/
#ifndef JENDEFS_INCLUDED
#define JENDEFS_INCLUDED
/****************************************************************************/
/*** Include Files ***/
/****************************************************************************/
#include <stdint.h>
#ifndef __KERNEL__
#include <stdarg.h>
#include <stdio.h>
#endif
#ifdef ECOS
#include <cyg/infra/cyg_type.h>
#endif
/****************************************************************************/
/*** Macro Definitions ***/
/****************************************************************************/
/*--------------------------------------------------------------------------*/
/* Compiler Constants for GCC compiler */
/*--------------------------------------------------------------------------*/
#if defined(__GNUC__)
/* The following 5 macros force the compiler to align the specified object */
/* on a given byte boundary. */
/* Example: */
/* int iVar ALIGN_(16); Force iVar to be aligned on the next */
/* 16 byte boundary */
#define PACK __attribute__ ((packed)) /* align to byte boundary */
#define ALIGN_2 __attribute__ ((aligned (2))) /* 16-bit boundary (2 byte)*/
#define ALIGN_4 __attribute__ ((aligned (4))) /* 32-bit boundary (4 byte)*/
#define ALIGN_8 __attribute__ ((aligned (8))) /* 64-bit boundary (8 byte)*/
#define ALIGN_(x) __attribute__ (((aligned (x)))) /* arbitrary alignment */
/* force an unused variable not to be elided */
#define USED __attribute__ ((used))
#if __GNUC__ < 5
#define INLINE extern inline
#else
#if (defined JENNIC_CHIP_FAMILY_JN516x) || (defined JENNIC_CHIP_FAMILY_JN517x)
#pragma message ( "Unsupported version of GCC is being used!!" )
#endif
#define INLINE inline
#endif
#define ALWAYS_INLINE __attribute__((always_inline))
#ifndef WEAK
#define WEAK __attribute__ ((weak))
#endif
#define ALIAS(f) __attribute__ ((weak, alias (#f)))
#elif defined(_MSC_VER)
#define PACK
#define USED
#define __attribute__(x)
#define ALWAYS_INLINE
#define INLINE __inline
#elif defined(__IAR_SYSTEMS_ICC__)
// if compiled for IAR, none of the above defines are required
#else
#error "Unsupported compiler"
#endif
/*--------------------------------------------------------------------------*/
/* Alignment masks */
/*--------------------------------------------------------------------------*/
#define ALIGNMENT_MASK_4_BYTE ((uint32)0x00000003)
#define ALIGNMENT_MASK_16_BYTE ((uint32)0x0000000F)
/* Test for alignment on an arbitrary byte boundary - TRUE if aligned */
#define IS_ALIGNED(addr, mask) (((((uint32)addr) & mask) ? FALSE : TRUE))
/*--------------------------------------------------------------------------*/
/* Boolean Constants */
/*--------------------------------------------------------------------------*/
#if !defined FALSE && !defined TRUE
#define TRUE (1) /* page 207 K+R 2nd Edition */
#define FALSE (0)
#endif /* !defined FALSE && #if !defined TRUE */
/* Note that WINDOWS.H also defines TRUE and FALSE */
/*--------------------------------------------------------------------------*/
/* Null pointers */
/*--------------------------------------------------------------------------*/
/* NULL data pointer */
#if !defined NULL
#define NULL ( (void *) 0 )
#endif
/* NULL routine pointer */
#if !defined RNULL
#define RNULL ((void *) 0 ())
#endif
/*--------------------------------------------------------------------------*/
/* Macros for setting/clearing bits efficiently */
/*--------------------------------------------------------------------------*/
#define U8_CLR_BITS( P, B ) (( *(uint8 *)P ) &= ~( B ))
#define U8_SET_BITS( P, B ) (( *(uint8 *)P ) |= ( B ))
#define U16_CLR_BITS( P, B ) (( *(uint16 *)P ) &= ~( B ))
#define U16_SET_BITS( P, B ) (( *(uint16 *)P ) |= ( B ))
#define U32_CLR_BITS( P, B ) (( *(uint32 *)P ) &= ~( B ))
#define U32_SET_BITS( P, B ) (( *(uint32 *)P ) |= ( B ))
#define U64_CLR_BITS( P, B ) (( *(uint64 *)P ) &= ~( B ))
#define U64_SET_BITS( P, B ) (( *(uint64 *)P ) |= ( B ))
/*--------------------------------------------------------------------------*/
/* Macros for obtaining maximum/minimum values */
/*--------------------------------------------------------------------------*/
#ifndef MAX
#define MAX(A,B) ( ( ( A ) > ( B ) ) ? ( A ) : ( B ) )
#endif
#ifndef MIN
#define MIN(A,B) ( ( ( A ) < ( B ) ) ? ( A ) : ( B ) )
#endif
/*--------------------------------------------------------------------------*/
/* Number of bits in quantities */
/*--------------------------------------------------------------------------*/
#define BITS_PER_U32 (32)
#define BITS_PER_U16 (16)
#define BITS_PER_U8 (8)
#define BITS_PER_NIBBLE (4)
/*--------------------------------------------------------------------------*/
/* Masking macros */
/*--------------------------------------------------------------------------*/
#define U8_LOW_NIBBLE_MASK (0x0F)
#define U8_HIGH_NIBBLE_MASK (0xF0)
#define U16_LOW_U8_MASK (0x00FF)
#define U16_HIGH_U8_MASK (0xFF00)
#define U32_LOWEST_U8_MASK (0x000000FFL)
#define U32_LOW_U8_MASK (0x0000FF00L)
#define U32_HIGH_U8_MASK (0x00FF0000L)
#define U32_HIGHEST_U8_MASK (0xFF000000L)
#define U32_LOWEST_U16_MASK (0x0000FFFFL)
#define U32_HIGHEST_U16_MASK (0xFFFF0000L)
#define U64_LOWEST_U32_MASK (0x00000000FFFFFFFFLL)
#define U64_HIGHEST_U32_MASK (0xFFFFFFFF00000000LL)
/*--------------------------------------------------------------------------*/
/* Macros for extracting uint8s from a uint16 */
/*--------------------------------------------------------------------------*/
/* NOTE: U16_UPPER_U8 is only safe for an unsigned U16 as >> fills with the sign bit for signed variables */
#define U16_UPPER_U8( x ) ((uint8) ((x) >> BITS_PER_U8))
#define U16_LOWER_U8( x ) ((uint8) (((x) & U16_LOW_U8_MASK)))
/*--------------------------------------------------------------------------*/
/* Macros for extracting uint8s from a uint32 */
/*--------------------------------------------------------------------------*/
#define U32_HIGHEST_U8( x ) ((uint8)(((x) & U32_HIGHEST_U8_MASK) >> (BITS_PER_U16 + BITS_PER_U8)))
#define U32_HIGH_U8( x ) ((uint8)( ( ( x ) & U32_HIGH_U8_MASK ) >> BITS_PER_U16 ))
#define U32_LOW_U8( x ) ((uint8)( ( ( x ) & U32_LOW_U8_MASK ) >> BITS_PER_U8 ))
#define U32_LOWEST_U8( x ) ((uint8)( ( ( x ) & U32_LOWEST_U8_MASK ) ))
/*--------------------------------------------------------------------------*/
/* Macros for extracting uint16s from a uint32 */
/*--------------------------------------------------------------------------*/
#define U32_UPPER_U16( x ) ((uint16)( ( ( x ) & U32_HIGHEST_U16_MASK ) >> ( BITS_PER_U16 ) ))
#define U32_LOWER_U16( x ) ((uint16)( ( ( x ) & U32_LOWEST_U16_MASK ) ))
/*--------------------------------------------------------------------------*/
/* Macros for extracting uint32s from a uint64 */
/*--------------------------------------------------------------------------*/
#define U64_UPPER_U32( x ) ((uint32)( ( ( x ) & U64_HIGHEST_U32_MASK ) >> ( BITS_PER_U32 ) ))
#define U64_LOWER_U32( x ) ((uint32)( ( ( x ) & U64_LOWEST_U32_MASK ) ))
/*--------------------------------------------------------------------------*/
/* Macros for assembling byte sequences into various word sizes */
/*--------------------------------------------------------------------------*/
/* B0 - LSB, B3 - MSB */
#ifdef HOST_PROCESSOR_BIG_ENDIAN
/* BIG ENDIAN DEFINITIONS */
#define BYTE_ORDER_32(B3, B2, B1, B0) ((B0) + (B1<<8) + (B2<<16) + (B3<<24))
#define BYTE_ORDER_24(B2, B1, B0) ((B0) + (B1<<8) + (B2<<16))
#define BYTE_ORDER_16(B1, B0) (uint16)(((B0) + (B1<<8)))
#define BYTE_ORDER_8(B0) (B0)
#define BYTE_ORDER_4(B0) (B0)
#else
/* LITTLE ENDIAN DEFINITIONS */
#define BYTE_ORDER_32(B3, B2, B1, B0) ((B3) + (B2<<8) + (B1<<16) + (B0<<24))
#define BYTE_ORDER_24(B2, B1, B0) ((B2) + (B1<<8) + (B0<<16))
#define BYTE_ORDER_16(B1, B0) (uint16)(((B1) + (B0<<8)))
#define BYTE_ORDER_8(B0) (B0)
#define BYTE_ORDER_4(B0) (B0)
#endif
/*--------------------------------------------------------------------------*/
/* Storage classes */
/*--------------------------------------------------------------------------*/
#if !defined PUBLIC
#define PUBLIC
#endif
#if !defined MODULE
#define MODULE
#endif
#if !defined PRIVATE
#define PRIVATE static
#endif
#if !defined BANKED
#define BANKED
#endif
/*--------------------------------------------------------------------------*/
/* Useful macro for variables that are not currently referenced */
/* Prevents compiler warnings and should not produce any code */
/*--------------------------------------------------------------------------*/
#define VARIABLE_INTENTIONALLY_NOT_REFERENCED(x) (x=x);
#define CONST_POINTER_INTENTIONALLY_NOT_REFERENCED(p) (*p);
#define CONST_VARIABLE_INTENTIONALLY_NOT_REFERENCED(x) (x);
/*--------------------------------------------------------------------------*/
/* Offset of field m in a struct s */
/*--------------------------------------------------------------------------*/
#if !defined(__GNUC__) && !defined(ECOS) && !defined(offsetof)
#define offsetof(type, tag) ( (int)&( (type *)0 )->tag )
#endif
/*--------------------------------------------------------------------------*/
/* Diagnostics */
/*--------------------------------------------------------------------------*/
/****************************************************************************/
/*** Type Definitions ***/
/****************************************************************************/
#ifndef __cplusplus /* microsoft specific */
#ifndef bool /* Seems to need this in for certain M$ builds*/
typedef int bool; /* boolean type */
#endif
#endif
typedef uint8_t BOOL_T; /* boolean type nothing to do with C++ */
typedef uint8_t bool_t; /* boolean type nothing to do with C++ */
typedef int8_t int8;
typedef int16_t int16;
typedef int32_t int32;
typedef int64_t int64;
typedef uint8_t uint8;
typedef uint16_t uint16;
typedef uint32_t uint32;
typedef uint64_t uint64;
typedef char * string;
typedef volatile uint8 u8Register;
typedef volatile uint16 u16Register;
typedef volatile uint32 u32Register;
/****************************************************************************/
/*** Exported Functions ***/
/****************************************************************************/
/****************************************************************************/
/*** Exported Variables ***/
/****************************************************************************/
#endif /* JENDEFS_INCLUDED */
/****************************************************************************/
/*** END OF FILE ***/
/****************************************************************************/