对比新文件 |
| | |
| | | /* |
| | | * 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_ */ |