rt-thread/bsp/allwinner/libraries/sunxi-hal/include/hal/sunxi_hal_common.h

170 lines
5.2 KiB
C

/*
* ===========================================================================================
*
* Filename: sunxi_hal_common.h
*
* Description: Add sunxi hal common header file, common defitions used by all hal.
*
* Version: Melis3.0
* Create: 2019-11-14 11:38:34
* Revision: none
* Compiler: GCC:version 7.2.1 20170904 (release),ARM/embedded-7-branch revision 255204
*
* Author: caozilong@allwinnertech.com
* Organization: BU1-PSW
* Last Modified: 2020-10-20 17:48:41
*
* ===========================================================================================
*/
#ifndef SUNXI_HAL_COMMON_H
#define SUNXI_HAL_COMMON_H
#include <barrier.h>
#ifdef __cplusplus
extern "C"
{
#endif
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <kconfig.h>
#undef min
#undef max
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) < (b) ? (b) : (a))
/* return value defines */
#define OK (0)
#define FAIL (-1)
#define CACHELINE_LEN (64)
typedef uint64_t u64;
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
typedef int64_t s64;
typedef int32_t s32;
typedef int16_t s16;
typedef int8_t s8;
#define HAL_ARG_UNUSED(NAME) (void)(NAME)
/* general function pointer defines */
typedef s32(*__pCBK_t) (void *p_arg); /* call-back */
typedef s32(*__pISR_hdle_t) (int dummy, void *p_arg); /* ISR */
typedef s32(*__pNotifier_t) (u32 message, u32 aux); /* notifer call-back */
typedef s32(*__pCPUExceptionHandler) (void); /* cpu exception handler pointer */
typedef s32(*long_jump_fn) (void *arg);
typedef s32(*mem_long_jump_fn) (u32 arg);
// Exception Dealt With.
#define BUG() do { \
printf("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
while(1); \
} while (0)
#ifndef BUG_ON
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
#define WARN_ON(condition) ({ \
int __ret_warn_on = !!(condition); \
unlikely(__ret_warn_on); \
})
#endif
#ifndef WARN
#define WARN(condition, format...) ({ \
int __ret_warn_on = !!(condition); \
if(__ret_warn_on) \
printf(format); \
unlikely(__ret_warn_on); \
})
#endif
#ifdef CONFIG_KERNEL_FREERTOS
#define in_interrupt(...) uGetInterruptNest()
#else
#define in_interrupt(...) rt_interrupt_get_nest()
#endif
#define in_nmi(...) (0)
#define hal_assert(ex) \
if (!(ex)) \
{ \
printf("%s line %d, fatal error.\n", __func__, __LINE__); \
while(1); \
}
// common register access operation.
#define hal_readb(reg) (*(volatile uint8_t *)(long)(reg))
#define hal_readw(reg) (*(volatile uint16_t *)(reg))
#define hal_readl(reg) (*(volatile uint32_t *)(reg))
#define hal_writeb(value,reg) (*(volatile uint8_t *)(long)(reg) = (value))
#define hal_writew(value,reg) (*(volatile uint16_t *)(reg) = (value))
#define hal_writel(value,reg) (*(volatile uint32_t *)(reg) = (value))
// version combine.
#define SUNXI_HAL_VERSION_MAJOR_MINOR(major, minor) (((major) << 8) | (minor))
typedef struct sunxi_hal_version
{
// API version NO.
uint16_t api;
// Driver version NO.
uint16_t drv;
} sunxi_hal_version_t;
// General return code of hal driver.
#define SUNXI_HAL_OK 0UL
// Unspecified error.
#define SUNXI_HAL_ERROR -1UL
// Hal is busy.
#define SUNXI_HAL_ERROR_BUSY -2UL
// Timout occured.
#define SUNXI_HAL_ERROR_TIMEOUT -3UL
// Operaion not supported.
#define SUNXI_HAL_ERROR_UNSUPOT -4UL
// Parameter error.
#define SUNXI_HAL_ERROR_PARAERR -5UL
// Start of driver specific errors.
#define SUNXI_HAL_ERROR_DRVSPECIFIC -6UL
// brief General power states
typedef enum sunxi_hal_power_state
{
///< Power off: no operation possible
SUSNXI_HAL_POWER_OFF,
///< Low Power mode: retain state, detect and signal wake-up events
SUSNXI_HAL_POWER_LOW,
///< Power on: full operation at maximum performance
SUSNXI_HAL_POWER_FULL
} sunxi_hal_power_state_e;
typedef int32_t (*poll_wakeup_func)(int32_t dev_id, short key);
typedef struct _sunxi_hal_poll_ops
{
int32_t (* check_poll_state) (int32_t dev, short key);
int32_t (* hal_poll_wakeup) (int32_t dev, short key);
int32_t (* register_poll_wakeup) (poll_wakeup_func poll_wakeup);
} sunxi_hal_poll_ops;
/* bitops */
extern int fls(int x);
void dma_free_coherent(void *addr);
void *dma_alloc_coherent(size_t size);
#ifdef __cplusplus
}
#endif
#endif /*SUNXI_HAL_COMMON_H*/