/* * 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 #include #include #include #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_ */