/* * Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved. * Copyright (c) 2020, Huawei Device Co., Ltd. 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 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 the copyright holder nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. */ /** * @defgroup los_hwi Hardware interrupt * @ingroup kernel */ #ifndef _LOS_HWI_H #define _LOS_HWI_H #include "los_base.h" #include "los_hw_cpu.h" #include "hal_hwi.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ /** * @ingroup los_hwi * Count of interrupts. */ extern size_t g_intCount[]; /** * @ingroup los_hwi * An interrupt is active. */ #define OS_INT_ACTIVE ({ \ size_t intCount; \ UINT32 intSave_ = LOS_IntLock(); \ intCount = g_intCount[ArchCurrCpuid()]; \ LOS_IntRestore(intSave_); \ intCount; \ }) /** * @ingroup los_hwi * An interrupt is inactive. */ #define OS_INT_INACTIVE (!(OS_INT_ACTIVE)) /** * @ingroup los_hwi * Highest priority of a hardware interrupt. */ #define OS_HWI_PRIO_HIGHEST 0 /** * @ingroup los_hwi * Lowest priority of a hardware interrupt. */ #define OS_HWI_PRIO_LOWEST 31 /** * @ingroup los_hwi * Max name length of a hardware interrupt. */ #define OS_HWI_MAX_NAMELEN 10 /** * @ingroup los_hwi * Hardware interrupt error code: Invalid interrupt number. * * Value: 0x02000900 * * Solution: Ensure that the interrupt number is valid. */ #define OS_ERRNO_HWI_NUM_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x00) /** * @ingroup los_hwi * Hardware interrupt error code: Null hardware interrupt handling function. * * Value: 0x02000901 * * Solution: Pass in a valid non-null hardware interrupt handling function. */ #define OS_ERRNO_HWI_PROC_FUNC_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x01) /** * @ingroup los_hwi * Hardware interrupt error code: Insufficient interrupt resources for hardware interrupt creation. * * Value: 0x02000902 * * Solution: Increase the configured maximum number of supported hardware interrupts. */ #define OS_ERRNO_HWI_CB_UNAVAILABLE LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x02) /** * @ingroup los_hwi * Hardware interrupt error code: Insufficient memory for hardware interrupt initialization. * * Value: 0x02000903 * * Solution: Expand the configured memory. */ #define OS_ERRNO_HWI_NO_MEMORY LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x03) /** * @ingroup los_hwi * Hardware interrupt error code: The interrupt has already been created. * * Value: 0x02000904 * * Solution: Check whether the interrupt specified by the passed-in interrupt number has already been created. */ #define OS_ERRNO_HWI_ALREADY_CREATED LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x04) /** * @ingroup los_hwi * Hardware interrupt error code: Invalid interrupt priority. * * Value: 0x02000905 * * Solution: Ensure that the interrupt priority is valid. */ #define OS_ERRNO_HWI_PRIO_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x05) /** * @ingroup los_hwi * Hardware interrupt error code: Incorrect interrupt creation mode. * * Value: 0x02000906 * * Solution: The interrupt creation mode can be only set to OS_HWI_MODE_COMM or OS_HWI_MODE_FAST of * which the value can be 0 or 1. */ #define OS_ERRNO_HWI_MODE_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x06) /** * @ingroup los_hwi * Hardware interrupt error code: The interrupt has already been created as a fast interrupt. * * Value: 0x02000907 * * Solution: Check whether the interrupt specified by the passed-in interrupt number has already been created. */ #define OS_ERRNO_HWI_FASTMODE_ALREADY_CREATED LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x07) /** * @ingroup los_hwi * Hardware interrupt error code: The API is called during an interrupt, which is forbidden. * * Value: 0x02000908 * * * Solution: Do not call the API during an interrupt. */ #define OS_ERRNO_HWI_INTERR LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x08) /** * @ingroup los_hwi * Hardware interrupt error code:the hwi support SHARED error. * * Value: 0x02000909 * * * Solution: Check the input params hwiMode and irqParam of LOS_HwiCreate or * LOS_HwiDelete whether adapt the current hwi. */ #define OS_ERRNO_HWI_SHARED_ERROR LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x09) /** * @ingroup los_hwi * Hardware interrupt error code:Invalid interrupt Arg when interrupt mode is IRQF_SHARED. * * Value: 0x0200090a * * * Solution: Check the interrupt Arg, Arg should not be NULL and pDevId should not be NULL. */ #define OS_ERRNO_HWI_ARG_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x0a) /** * @ingroup los_hwi * Hardware interrupt error code:The interrupt corresponded to the hwi number or devid has not been created. * * Value: 0x0200090b * * * Solution: Check the hwi number or devid, make sure the hwi number or devid need to delete. */ #define OS_ERRNO_HWI_HWINUM_UNCREATE LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x0b) /** * @ingroup los_hwi * Define the type of a hardware interrupt number. */ typedef UINT32 HWI_HANDLE_T; /** * @ingroup los_hwi * Define the type of a hardware interrupt priority. */ typedef UINT16 HWI_PRIOR_T; /** * @ingroup los_hwi * Define the type of hardware interrupt mode configurations. */ typedef UINT16 HWI_MODE_T; /** * @ingroup los_hwi * Define the type of the parameter used for the hardware interrupt creation function. * The function of this parameter varies among platforms. */ typedef UINTPTR HWI_ARG_T; /** * @ingroup los_hwi * Define the type of a hardware interrupt handling function. */ typedef VOID (*HWI_PROC_FUNC)(VOID); /* * These flags used only by the kernel as part of the * irq handling routines. * * IRQF_SHARED - allow sharing the irq among several devices */ #define IRQF_SHARED 0x8000U typedef struct tagHwiHandleForm { HWI_PROC_FUNC pfnHook; HWI_ARG_T uwParam; struct tagHwiHandleForm *pstNext; } HwiHandleForm; typedef struct tagIrqParam { int swIrq; VOID *pDevId; const CHAR *pName; } HwiIrqParam; extern HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM]; /** * @ingroup los_hwi * @brief Disable all interrupts. * * @par Description: *