chen
2024-11-08 cc432b761c884a0bd8e9d83db0a4e26109fc08b1
keil/include/drivers/mk_common.h
对比新文件
@@ -0,0 +1,208 @@
/*
 * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and
 * its subsidiaries and affiliates (collectly called MKSEMI).
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form, except as embedded into an MKSEMI
 *    integrated circuit in a product or a software update for such product,
 *    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.
 *
 * 3. Neither the name of MKSEMI nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * 4. This software, with or without modification, must only be used with a
 *    MKSEMI integrated circuit.
 *
 * 5. Any software provided in binary form under this license must not be
 *    reverse engineered, decompiled, modified and/or disassembled.
 *
 * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL MKSEMI 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.
 */
#ifndef MK_COMMON_H_
#define MK_COMMON_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "MK800X.h"
#include "user_config.h"
/**
 * @addtogroup MK8000_Common
 * @{
 */
/* Development board type - EVK */
#define MK8000_EVK 0
/* Development board type - DK */
#define MK8000_DK 1
/* Macro for ram function */
#if defined(XIP_EN)
#define RAM_FUNC __attribute__((section(".RAMCODE")))
#else
#define RAM_FUNC
#endif
/** Determine whether the bit of the register is set */
#define REG_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT))
/** Determine whether the bit of the register is clear */
#define REG_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U)
/** set bit field of a data */
#define SET_BIT_FIELD(data, mask, pos, value) (((data) & ~mask) | ((uint32_t)((value) << pos) & mask))
/** get bit field of a data */
#define GET_BIT_FIELD(data, mask, pos) (((data)&mask) >> pos)
/** read byte from register */
#define REG_READ_BYTE(addr) (*(const volatile uint8_t *)(addr))
/** write byte to register */
#define REG_WRITE_BYTE(addr, value) (*(volatile uint8_t *)(addr) = (value))
/** read word from register */
#define REG_READ(addr) (*(const volatile uint32_t *)(addr))
/** write word to register */
#define REG_WRITE(addr, value) (*(volatile uint32_t *)(addr) = (value))
/** modify bit field of register */
#define REG_MODIFY(addr, mask, value) REG_WRITE(addr, (REG_READ(addr) & (uint32_t)~mask) | value)
/** read bit field from register */
#define REG_READ_BIT_FIELD(addr, width, pos) ((REG_READ(addr) >> pos) & ((1 << (width)) - 1))
/** read word from an unaligned address */
#define READ_WORD(x) ((uint32_t)(REG_READ_BYTE(x) | (REG_READ_BYTE(x + 1) << 8) | (REG_READ_BYTE(x + 2) << 16) | (REG_READ_BYTE(x + 3) << 24)))
/** read half word from an unaligned address */
#define READ_SHORT(x) ((uint16_t)(REG_READ_BYTE(x) | (REG_READ_BYTE(x + 1) << 8)))
/** write word to an unaligned address */
#define WRITE_WORD(data, addr)                             \
    ((uint8_t *)addr)[0] = (uint8_t)(data & 0xFF);         \
    ((uint8_t *)addr)[1] = (uint8_t)((data >> 8) & 0xFF);  \
    ((uint8_t *)addr)[2] = (uint8_t)((data >> 16) & 0xFF); \
    ((uint8_t *)addr)[3] = (uint8_t)((data >> 24) & 0xFF)
/** write half word to an unaligned address */
#define WRITE_SHORT(data, addr)                    \
    ((uint8_t *)addr)[0] = (uint8_t)(data & 0xFF); \
    ((uint8_t *)addr)[1] = (uint8_t)((data >> 8) & 0xFF)
/** get array size  */
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#ifndef MAX
/** maximum  */
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef MIN
/** minimum */
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef ABS
/** absolute  */
#define ABS(x) (((x) < 0) ? (-(x)) : (x))
#endif
/** [x bits for choice] [8 bits mux ID] */
#define MUX(m, choice) ((m) | ((choice) << 8))
#define UNUSED(X) (void)(X)
#define CHECK_BITS_VALID(x, bits) (((x) & (bits)) == (bits))
// driver return code
#define DRV_OK 0x00U
#define DRV_ERROR 0x01U
#define DRV_BUSY 0x02U
#define DRV_TIMEOUT 0x03U
#define DRV_DEV_UNAVAILABLE 0x04U
// check RAM address and Word alignment
#define CHK_RAM_WORD_ADDR(x) (((uint32_t)(x)&0xFFFC0003) == SRAM_BASE)
/// interrupt priority
enum IRQ_PRIORITY_LEVEL_T
{
    IRQ_PRIORITY_REALTIME = 0,
    IRQ_PRIORITY_HIGH = 1,
    IRQ_PRIORITY_NORMAL = 2,
    IRQ_PRIORITY_LOW = 3,
};
/**
 * @brief Disable global interrupt.
 *
 * @return primask
 *
 */
static inline uint32_t int_lock(void)
{
    uint32_t pri = __get_PRIMASK();
    if ((pri & 0x1) == 0)
    {
        __disable_irq();
    }
    return pri;
}
/**
 * @brief Enable global interrupt.
 *
 * @param[in]  pri          Primask
 *
 */
static inline void int_unlock(uint32_t pri)
{
    if ((pri & 0x1) == 0)
    {
        __enable_irq();
    }
}
/**
 * This is a generic data type used for handling callback functions
 * with each driver.
 *
 * @param[in] dev           Device handle
 * @param[in] err_code      Event error code
 * @note
 * The usage of the eCode argument is typically negative for an error
 * code and positive for an event code.
 *
 */
typedef void (*drv_callback_t)(void *dev, uint32_t err_code);
#ifdef __cplusplus
}
#endif
/**
 * @}
 */
#endif /* MK_COMMON_H_ */