See Common PLATFORM_HEADER Configuration for detailed documentation.

License#

Copyright 2018 Silicon Laboratories Inc. www.silabs.com

The licensor of this software is Silicon Laboratories Inc. Your use of this software is governed by the terms of Silicon Labs Master Software License Agreement (MSLA) available at www.silabs.com/about-us/legal/master-software-license-agreement. This software is distributed to you in Source Code format and is governed by the sections of the MSLA applicable to Source Code.

/***************************************************************************/
#ifndef __PLATFORMCOMMON_H__
#define __PLATFORMCOMMON_H__

#ifndef PLATCOMMONOKTOINCLUDE
//  This header should only be included by a PLATFORM_HEADER
  #error  platform-common.h should not be included directly
#endif

// Many of the common definitions must be explicitly enabled by the
//  particular PLATFORM_HEADER being used

#include <string.h>

#define TRUE  1

#define FALSE 0

#ifndef NULL

#define NULL ((void *)0)
#endif



#define BIT(x) (1U << (x))  // Unsigned avoids compiler warnings re BIT(15)

#define BIT32(x) (((uint32_t) 1) << (x))

#define SETBIT(reg, bit)      (reg) |= BIT(bit)

#define SETBITS(reg, bits)    (reg) |= (bits)

#define CLEARBIT(reg, bit)    (reg) &= ~(BIT(bit))

#define CLEARBITS(reg, bits)  (reg) &= ~(bits)

#define READBIT(reg, bit)     ((reg) & (BIT(bit)))

#define READBITS(reg, bits)   ((reg) & (bits))




#define LOW_BYTE(n)                     ((uint8_t)(n))

#define HIGH_BYTE(n)                    LOW_BYTE((n) >> 8)

#define HIGH_LOW_TO_INT(high, low) (        \
    ((uint16_t) (((uint16_t) (high)) << 8)) \
    + ((uint16_t) ((low) & 0xFFu))          \
    )

#define INT8U_TO_INT32U(byte3, byte2, byte1, byte0) ( \
    (((uint32_t) (byte3)) << 24)                      \
    + (((uint32_t) (byte2)) << 16)                    \
    + (((uint32_t) (byte1)) << 8)                     \
    + ((uint32_t) ((byte0) & 0xFFu))                  \
    )

#define BYTE_0(n)                    ((uint8_t)(n))

#define BYTE_1(n)                    BYTE_0((n) >> 8)

#define BYTE_2(n)                    BYTE_0((n) >> 16)

#define BYTE_3(n)                    BYTE_0((n) >> 24)

#define BYTE_4(n)                    BYTE_0((n) >> 32)

#define BYTE_5(n)                    BYTE_0((n) >> 40)

#define BYTE_6(n)                    BYTE_0((n) >> 48)

#define BYTE_7(n)                    BYTE_0((n) >> 56)

#define COUNTOF(a) (sizeof(a) / sizeof(a[0]))




#define elapsedTimeInt8u(oldTime, newTime) \
  ((uint8_t) ((uint8_t)(newTime) - (uint8_t)(oldTime)))

#define elapsedTimeInt16u(oldTime, newTime) \
  ((uint16_t) ((uint16_t)(newTime) - (uint16_t)(oldTime)))

#define elapsedTimeInt32u(oldTime, newTime) \
  ((uint32_t) ((uint32_t)(newTime) - (uint32_t)(oldTime)))

#define MAX_INT8U_VALUE       (0xFF)
#define HALF_MAX_INT8U_VALUE  (0x80)
#define timeGTorEqualInt8u(t1, t2) \
  (elapsedTimeInt8u(t2, t1) <= (HALF_MAX_INT8U_VALUE))

#define MAX_INT16U_VALUE      (0xFFFF)
#define HALF_MAX_INT16U_VALUE (0x8000)
#define timeGTorEqualInt16u(t1, t2) \
  (elapsedTimeInt16u(t2, t1) <= (HALF_MAX_INT16U_VALUE))

#define MAX_INT32U_VALUE      (0xFFFFFFFFUL)
#define HALF_MAX_INT32U_VALUE (0x80000000UL)
#define timeGTorEqualInt32u(t1, t2) \
  (elapsedTimeInt32u(t2, t1) <= (HALF_MAX_INT32U_VALUE))




#ifndef UNUSED_VAR

#define UNUSED_VAR(x) (void)(x)
#endif

#ifdef DEBUG_OFF
// On March 17, 2014, DEBUG_OFF was deprecated and replaced by DEBUG_STRIPPED.
// Some builds still attempt to use DEBUG_OFF and as a result there are
// failures.  On 2016-10-04 implemented a little bandaid here to define
// DEBUG_STRIPPED when debugging is meant to be "off".
  #define DEBUG_STRIPPED
#endif

#ifndef DEBUG_LEVEL
  #if defined(DEBUG) && defined(DEBUG_STRIPPED)
    #error "DEBUG and DEBUG_OFF cannot be both be defined!"
  #elif defined(DEBUG)
    #define DEBUG_LEVEL FULL_DEBUG
  #elif defined(DEBUG_STRIPPED)
    #define DEBUG_LEVEL NO_DEBUG
  #else
    #define DEBUG_LEVEL BASIC_DEBUG
  #endif
#endif

#ifndef STATIC_ASSERT
  #define STATIC_ASSERT(__condition, __errorstr)
#endif


#endif //__PLATFORMCOMMON_H__

Generic Types#

#define

An alias for one, used for clarity.

#define

An alias for zero, used for clarity.

#define
NULL ((void *)0)

The null pointer.

Bit Manipulation Macros#

#define
BIT (x)

Useful to reference a single bit of a byte.

#define
BIT32 (x)

Useful to reference a single bit of an uint32_t type.

#define
SETBIT (reg, bit)

Sets bit in the reg register or byte.

#define
SETBITS (reg, bits)

Sets the bits in the reg register or the byte as specified in the bitmask bits.

#define
CLEARBIT (reg, bit)

Clears a bit in the reg register or byte.

#define
CLEARBITS (reg, bits)

Clears the bits in the reg register or byte as specified in the bitmask bits.

#define
READBIT (reg, bit)

Returns the value of bit within the register or byte reg.

#define
READBITS (reg, bits)

Returns the value of the bitmask bits within the register or byte reg.

Byte Manipulation Macros#

#define

Returns the low byte of the 16-bit value n as an uint8_t.

#define

Returns the high byte of the 16-bit value n as an uint8_t.

#define
HIGH_LOW_TO_INT (high, low)

Returns the value built from the two uint8_t values high and low.

#define
INT8U_TO_INT32U (byte3, byte2, byte1, byte0)

Returns the value built from the four uint8_t as an uint32_t.

#define
BYTE_0 (n)

Returns the low byte of the 32-bit value n as an uint8_t.

#define
BYTE_1 (n)

Returns the second byte of the 32-bit value n as an uint8_t.

#define
BYTE_2 (n)

Returns the third byte of the 32-bit value n as an uint8_t.

#define
BYTE_3 (n)

Returns the high byte of the 32-bit value n as an uint8_t.

#define
BYTE_4 (n)

Returns the fifth byte of the 64-bit value n as an uint8_t.

#define
BYTE_5 (n)

Returns the sixth byte of the 64-bit value n as an uint8_t.

#define
BYTE_6 (n)

Returns the seventh byte of the 64-bit value n as an uint8_t.

#define
BYTE_7 (n)

Returns the high byte of the 64-bit value n as an uint8_t.

#define

Returns the number of entries in an array.

Time Manipulation Macros#

#define
elapsedTimeInt8u (oldTime, newTime)

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.

#define
elapsedTimeInt16u (oldTime, newTime)

Returns the elapsed time between two 16 bit values. Result may not be valid if the time samples differ by more than 32767.

#define
elapsedTimeInt32u (oldTime, newTime)

Returns the elapsed time between two 32 bit values. Result may not be valid if the time samples differ by more than 2147483647.

#define

Returns true if t1 is greater than t2. Can only account for 1 wrap around of the variable before it is wrong.

#define

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.

#define

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.

#define

Returns true if t1 is greater than t2. Can only account for 1 wrap around of the variable before it is wrong.

#define

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.

#define

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.

#define
MAX_INT32U_VALUE (0xFFFFFFFFUL)

Returns true if t1 is greater than t2. Can only account for 1 wrap around of the variable before it is wrong.

#define
HALF_MAX_INT32U_VALUE (0x80000000UL)

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.

#define

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.

Miscellaneous Macros#

#define
#define
DEBUG_LEVEL BASIC_DEBUG

Set debug level based on whether DEBUG or DEBUG_STRIPPED are defined.

#define
STATIC_ASSERT (__condition, __errorstr)

Disable static assertions on compilers that don't support them.

Generic Types Documentation#

TRUE#

#define TRUE
Value:
1

An alias for one, used for clarity.


Definition at line 52 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

FALSE#

#define FALSE
Value:
0

An alias for zero, used for clarity.


Definition at line 57 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

NULL#

#define NULL
Value:
((void *)0)

The null pointer.


Definition at line 64 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

Bit Manipulation Macros Documentation#

BIT#

#define BIT
Value:
(x)

Useful to reference a single bit of a byte.


Definition at line 77 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

BIT32#

#define BIT32
Value:
(x)

Useful to reference a single bit of an uint32_t type.


Definition at line 82 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

SETBIT#

#define SETBIT
Value:
(reg, bit)

Sets bit in the reg register or byte.

Note

  • Assuming reg is an IO register, some platforms (such as the AVR) can implement this in a single atomic operation.


Definition at line 89 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

SETBITS#

#define SETBITS
Value:
(reg, bits)

Sets the bits in the reg register or the byte as specified in the bitmask bits.

Note

  • This is never a single atomic operation.


Definition at line 96 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

CLEARBIT#

#define CLEARBIT
Value:
(reg, bit)

Clears a bit in the reg register or byte.

Note

  • Assuming reg is an IO register, some platforms (such as the AVR) can implement this in a single atomic operation.


Definition at line 103 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

CLEARBITS#

#define CLEARBITS
Value:
(reg, bits)

Clears the bits in the reg register or byte as specified in the bitmask bits.

Note

  • This is never a single atomic operation.


Definition at line 110 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

READBIT#

#define READBIT
Value:
(reg, bit)

Returns the value of bit within the register or byte reg.


Definition at line 115 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

READBITS#

#define READBITS
Value:
(reg, bits)

Returns the value of the bitmask bits within the register or byte reg.


Definition at line 121 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

Byte Manipulation Macros Documentation#

LOW_BYTE#

#define LOW_BYTE
Value:
(n)

Returns the low byte of the 16-bit value n as an uint8_t.


Definition at line 135 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

HIGH_BYTE#

#define HIGH_BYTE
Value:
(n)

Returns the high byte of the 16-bit value n as an uint8_t.


Definition at line 140 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

HIGH_LOW_TO_INT#

#define HIGH_LOW_TO_INT
Value:
( \
((uint16_t) (((uint16_t) (high)) << 8)) \
+ ((uint16_t) ((low) & 0xFFu)) \
)

Returns the value built from the two uint8_t values high and low.


Definition at line 146 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

INT8U_TO_INT32U#

#define INT8U_TO_INT32U
Value:
( \
(((uint32_t) (byte3)) << 24) \
+ (((uint32_t) (byte2)) << 16) \
+ (((uint32_t) (byte1)) << 8) \
+ ((uint32_t) ((byte0) & 0xFFu)) \
)

Returns the value built from the four uint8_t as an uint32_t.


Definition at line 154 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

BYTE_0#

#define BYTE_0
Value:
(n)

Returns the low byte of the 32-bit value n as an uint8_t.


Definition at line 164 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

BYTE_1#

#define BYTE_1
Value:
(n)

Returns the second byte of the 32-bit value n as an uint8_t.


Definition at line 169 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

BYTE_2#

#define BYTE_2
Value:
(n)

Returns the third byte of the 32-bit value n as an uint8_t.


Definition at line 174 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

BYTE_3#

#define BYTE_3
Value:
(n)

Returns the high byte of the 32-bit value n as an uint8_t.


Definition at line 179 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

BYTE_4#

#define BYTE_4
Value:
(n)

Returns the fifth byte of the 64-bit value n as an uint8_t.


Definition at line 184 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

BYTE_5#

#define BYTE_5
Value:
(n)

Returns the sixth byte of the 64-bit value n as an uint8_t.


Definition at line 189 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

BYTE_6#

#define BYTE_6
Value:
(n)

Returns the seventh byte of the 64-bit value n as an uint8_t.


Definition at line 194 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

BYTE_7#

#define BYTE_7
Value:
(n)

Returns the high byte of the 64-bit value n as an uint8_t.


Definition at line 199 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

COUNTOF#

#define COUNTOF
Value:
(a)

Returns the number of entries in an array.


Definition at line 204 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

Time Manipulation Macros Documentation#

elapsedTimeInt8u#

#define elapsedTimeInt8u
Value:
(oldTime, newTime)

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.


Definition at line 219 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

elapsedTimeInt16u#

#define elapsedTimeInt16u
Value:
(oldTime, newTime)

Returns the elapsed time between two 16 bit values. Result may not be valid if the time samples differ by more than 32767.


Definition at line 226 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

elapsedTimeInt32u#

#define elapsedTimeInt32u
Value:
(oldTime, newTime)

Returns the elapsed time between two 32 bit values. Result may not be valid if the time samples differ by more than 2147483647.


Definition at line 233 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

MAX_INT8U_VALUE#

#define MAX_INT8U_VALUE
Value:
(0xFF)

Returns true if t1 is greater than t2. Can only account for 1 wrap around of the variable before it is wrong.


Definition at line 240 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

HALF_MAX_INT8U_VALUE#

#define HALF_MAX_INT8U_VALUE
Value:
(0x80)

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.


Definition at line 241 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

timeGTorEqualInt8u#

#define timeGTorEqualInt8u
Value:
(t1, t2)

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.


Definition at line 242 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

MAX_INT16U_VALUE#

#define MAX_INT16U_VALUE
Value:
(0xFFFF)

Returns true if t1 is greater than t2. Can only account for 1 wrap around of the variable before it is wrong.


Definition at line 249 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

HALF_MAX_INT16U_VALUE#

#define HALF_MAX_INT16U_VALUE
Value:
(0x8000)

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.


Definition at line 250 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

timeGTorEqualInt16u#

#define timeGTorEqualInt16u
Value:
(t1, t2)

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.


Definition at line 251 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

MAX_INT32U_VALUE#

#define MAX_INT32U_VALUE
Value:
(0xFFFFFFFFUL)

Returns true if t1 is greater than t2. Can only account for 1 wrap around of the variable before it is wrong.


Definition at line 258 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

HALF_MAX_INT32U_VALUE#

#define HALF_MAX_INT32U_VALUE
Value:
(0x80000000UL)

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.


Definition at line 259 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

timeGTorEqualInt32u#

#define timeGTorEqualInt32u
Value:
(t1, t2)

Returns the elapsed time between two 8 bit values. Result may not be valid if the time samples differ by more than 127.


Definition at line 260 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

Miscellaneous Macros Documentation#

UNUSED_VAR#

#define UNUSED_VAR
Value:
(x)
  • Description:\n Useful macro for avoiding compiler warnings related to unused#

    function arguments or unused variables.


Definition at line 278 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

DEBUG_LEVEL#

#define DEBUG_LEVEL
Value:
BASIC_DEBUG

Set debug level based on whether DEBUG or DEBUG_STRIPPED are defined.


Definition at line 300 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h

STATIC_ASSERT#

#define STATIC_ASSERT

Disable static assertions on compilers that don't support them.


Definition at line 308 of file /mnt/raid/workspaces/ws.r4wf6JzLX/overlay/gsdk/platform/base/hal/micro/generic/compiler/platform-common.h