pinebuds/platform/hal/plat_types.h

220 lines
7.2 KiB
C

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef __PLAT_TYPES_H__
#define __PLAT_TYPES_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "stddef.h"
#include "stdint.h"
#include "stdbool.h"
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
typedef unsigned long long u64;
typedef char s8;
typedef short s16;
typedef long s32;
typedef long long s64;
typedef char ascii;
typedef unsigned char byte; /* unsigned 8-bit data */
typedef unsigned short word; /* unsigned 16-bit data */
typedef unsigned long dword; /* unsigned 32-bit data */
/* IO definitions (access restrictions to peripheral registers) */
/**
\defgroup CMSIS_glob_defs CMSIS Global Defines
<strong>IO Type Qualifiers</strong> are used
\li to specify the access to peripheral variables.
\li for automatic generation of peripheral register debug information.
*/
#ifndef __I
#ifdef __cplusplus
#define __I volatile /*!< Defines 'read only' permissions */
#else
#define __I volatile const /*!< Defines 'read only' permissions */
#endif
#define __O volatile /*!< Defines 'write only' permissions */
#define __IO volatile /*!< Defines 'read / write' permissions */
#endif
#define BITFIELD_VAL(field, value) (((value) & (field ## _MASK >> field ## _SHIFT)) << field ## _SHIFT)
#define SET_BITFIELD(reg, field, value) (((reg) & ~field ## _MASK) | BITFIELD_VAL(field, value))
#define GET_BITFIELD(reg, field) (((reg) & field ## _MASK) >> field ## _SHIFT)
/* Frequently used macros */
#ifndef ALIGN
#define ALIGN(val,exp) (((val) + ((exp)-1)) & ~((exp)-1))
#endif
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
#define LAST_ELEMENT(x) (&x[ARRAY_SIZE(x)-1])
#define BOUND(x, min, max) ( (x) < (min) ? (min) : ((x) > (max) ? (max):(x)) )
#define ROUND_SIZEOF(t) ((sizeof(t)+sizeof(int)-1)&~(sizeof(int)-1))
#ifndef MAX
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef ABS
#define ABS(x) ((x<0)?(-(x)):(x))
#endif
#define TO_STRING_A(s) # s
#define TO_STRING(s) TO_STRING_A(s)
#ifdef __GNUC__
/* Remove const cast-away warnings from gcc -Wcast-qual */
#define __UNCONST(a) ((void *)(unsigned long)(const void *)(a))
/// From http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/
/// Macro to use in a if statement to tell the compiler this branch
/// is likely taken, and optimize accordingly.
#define LIKELY(x) __builtin_expect(!!(x), 1)
/// Macro to use in a if statement to tell the compiler this branch
/// is unlikely take, and optimize accordingly.
#define UNLIKELY(x) __builtin_expect(!!(x), 0)
/// For packing structure
#define PACKED __attribute__((packed))
/// To describe alignment
#define ALIGNED(a) __attribute__((aligned(a)))
/// For possibly unused functions or variables (e.g., debugging stuff)
#define POSSIBLY_UNUSED __attribute__((unused))
/// For functions or variables must be emitted even if not referenced
#define USED __attribute__((used))
/// For inline functions
#define ALWAYS_INLINE __attribute__((always_inline))
// For functions never inlined
#define NOINLINE __attribute__((noinline))
// For functions not caring performance
#ifdef __ARMCC_VERSION
#define OPT_SIZE
#else
#define OPT_SIZE __attribute__((optimize("Os")))
#endif
// For functions not returning
#define NORETURN __attribute__((noreturn))
// For ASM functions in C
#ifdef __arm__
#define NAKED __attribute__((naked))
#else
#define NAKED __attribute__((error("Unsupport naked functions")))
#endif
// For weak symbols
#define WEAK __attribute__((weak))
// Structure offset
#ifndef OFFSETOF
#define OFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
/**
* CONTAINER_OF - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#ifndef CONTAINER_OF
#define CONTAINER_OF(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - OFFSETOF(type,member) );})
#endif
#else // Not GCC
#define __UNCONST(a)
#define LIKELY(x)
#define UNLIKELY(x)
#define PACKED
#define ALIGNED(a)
#define POSSIBLY_UNUSED
#define USED
#define ALWAYS_INLINE
#define NOINLINE
#define OPT_SIZE
#define NORETURN
#define NAKED
#define WEAK
#define OFFSETOF(TYPE, MEMBER)
#endif // Not GCC
/// C preprocessor conditional check
/// --------------------------------
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#if defined(__GNUC__) && (GCC_VERSION >= 40600) && !defined(__cplusplus)
// GCC 4.6 or later
#define STATIC_ASSERT(e, m) _Static_assert(e, m)
#elif defined(__GNUC__) && (GCC_VERSION >= 40300) && defined(__cplusplus) && (__cplusplus >= 201103L)
#define STATIC_ASSERT(e, m) static_assert(e, m)
#else // No built-in static assert
/// FROM: http://www.pixelbeat.org/programming/gcc/static_assert.html
#define ASSERT_CONCAT_(a, b) a##b
#define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b)
/* These can't be used after statements in c89. */
#ifdef __COUNTER__
#define STATIC_ASSERT(e, m) \
enum { ASSERT_CONCAT(static_assert_, __COUNTER__) = 1/(!!(e)) };
#else
/* This can't be used twice on the same line so ensure if using in headers
* that the headers are not included twice (by wrapping in #ifndef...#endif)
* Note it doesn't cause an issue when used on same line of separate modules
* compiled with gcc -combine -fwhole-program. */
#define STATIC_ASSERT(e, m) \
enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(!!(e)) };
#endif
#endif // No built-in static assert
/// --------------------------------
#ifdef __cplusplus
}
#endif
#endif