mcu_hi3321_watch/kernel/osal/include/interrupt/osal_interrupt.h
2025-05-26 20:15:20 +08:00

277 lines
6.9 KiB
C

/*
* Copyright (c) CompanyNameMagicTag 2021-2022. All rights reserved.
* Description: OS Abstract Layer.
*/
/**
* @defgroup osal_interrupt osal_interrupt
*/
#ifndef __OSAL_INTERRUPT_H__
#define __OSAL_INTERRUPT_H__
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
#define OSAL_CPU_ALL 0
#define OSAL_CPU_0 (1 << 1)
#define OSAL_CPU_1 (1 << 2)
#define OSAL_CPU_2 (1 << 3)
#define OSAL_CPU_3 (1 << 4)
typedef struct {
void *tasklet;
void (*handler)(unsigned long data);
unsigned long data;
} osal_tasklet;
enum osal_irqreturn {
OSAL_IRQ_NONE = (0 << 0),
OSAL_IRQ_HANDLED = (1 << 0),
OSAL_IRQ_WAKE_THREAD = (1 << 1),
};
typedef int (*osal_irq_handler)(int, void *);
/**
* @ingroup osal_interrupt
* @brief get irq_handler dev.
*
* @param param_dev [in] Parameters passed to the callback function.
*
* @return Returns the parameters that can be used directly.
*
* @par Support System:
* linux liteos freertos seliteos.
*/
void *osal_irq_get_private_dev(void *param_dev);
/**
* @ingroup osal_interrupt
* @brief alloc an interrupt line.
*
* @param irq [in] Interrupt line to alloc.
* @param handler [in] Function to be called when the IRQ occurs. Primary handler for threaded interrupts.
* If NULL and thread_fn != NULL the default primary handler is installed.
* @param thread_fn [in] Function called from the irq handler thread. If NULL, no irq thread is created.
* @param name [in] An ascii name for the claiming device.
* @param dev [in] A cookie passed back to the handler function.
*
* @attention In linux userspace, the type of the dev parameter must be (drval_irq_arg *).
*
* @return OSAL_SUCCESS/OSAL_FAILURE
*
* @par Support System:
* linux liteos seliteos freertos.
*/
int osal_irq_request(unsigned int irq, osal_irq_handler handler, osal_irq_handler thread_fn, const char *name,
void *dev);
/**
* @ingroup osal_interrupt
* @brief free an interrupt allocd with request_irq.
*
* @param irq [in] Interrupt line to free.
* @param dev [in] Device identity to free.
*
* @attention This function must not be called from interrupt context. In linux userspace,
* the parameter dev must be the same as the dev parameter of the osal_irq_request function.
*
* @par Support System:
* linux liteos seliteos freertos.
*/
void osal_irq_free(unsigned int irq, void *dev);
/**
* @ingroup osal_interrupt
* @brief Set interrupts priority.
*
* @par Description:
* Set interrupts priority.
*
* @attention
* This function depends on the hardware implementation of the interrupt controller and CPU architecture.
*
* @return OSAL_SUCCESS/OSAL_FAILURE
*
* @par Support System:
* liteos freertos.
*/
int osal_irq_set_priority(unsigned int irq, unsigned short priority);
/**
* @ingroup osal_interrupt
* @brief Setting the CPU Affinity of Interrupts.
*
* @par Description:
* Setting the CPU Affinity of Interrupts.
*
* @param irq [in] irq number.
* @param name [in] irq name.
* @param cpu_mask [in] cpu_musk. one of the following: OSAL_CPU_ALL, OSAL_CPU_0, OSAL_CPU_1, OSAL_CPU_2, OSAL_CPU_3
*
* @par Support System:
* linux liteos seliteos.
*/
int osal_irq_set_affinity(unsigned int irq, const char *name, int cpu_mask);
/**
* @ingroup osal_interrupt
* @brief enable handling of an irq.
*
* @par Description:
* Undoes the effect of one call to disable_irq().
* If this matches the last disable, processing of interrupts on this IRQ line is re-enabled.
*
* @param irq [in] Interrupt to enable.
*
* @par Support System:
* linux liteos seliteos freertos.
*/
void osal_irq_enable(unsigned int irq);
/**
* @ingroup osal_interrupt
* @brief disable an irq and wait for completion.
*
* @par Description:
* Disable the selected interrupt line.
*
* @param irq [in] Interrupt to disable.
*
* @par Support System:
* linux liteos seliteos freertos.
*/
void osal_irq_disable(unsigned int irq);
/**
* @ingroup osal_interrupt
* @brief Disable all interrupts.
*
* @par Description:
* This API is used to disable all IRQ and FIQ interrupts in the CPSR.
*
* @return CPSR value before all interrupts are disabled.
*
* @par Support System:
* liteos seliteos nonos freertos.
*/
unsigned int osal_irq_lock(void);
/**
* @ingroup osal_interrupt
* @brief Enable all interrupts.
*
* @par Description:
* This API is used to enable all IRQ and FIQ interrupts in the CPSR.
*
* @return CPSR value after all interrupts are enabled.
*
* @par Support System:
* liteos seliteos nonos freertos.
*/
unsigned int osal_irq_unlock(void);
/**
* @ingroup osal_interrupt
* @brief Restore interrupts.
*
* @par Description:
* This API is used to restore the CPSR value obtained before all interrupts are disabled by #osal_irq_lock.
*
* @attention
* This API can be called only after all interrupts are disabled, and the input parameter value should be
* the value returned by osal_irq_lock.
*
* @par Support System:
* liteos seliteos nonos freertos.
*/
void osal_irq_restore(unsigned int irq_status);
/**
* @ingroup osal_interrupt
* @brief Clear the pending status of other interrupts.
*
* @par Description:
* This API is used to clear the pending status of other interrupts.
*
* @param vector [in] interrupt vector.
*
* @par Support System:
* liteos freertos.
*/
unsigned int osal_irq_clear(unsigned int vector);
/**
* @ingroup osal_interrupt
* @brief Check whether the current interrupt is in interrupt.
*
* @par Description:
* Check whether the current interrupt is in the context of hard interrupts, soft interrupts, and unmaskable interrupts.
*
* @return false/true
*
* @par Support System:
* linux liteos nonos freertos.
*/
int osal_in_interrupt(void);
/**
* @ingroup osal_interrupt
* @brief initialize tasklet.
*
* @par Description:
* initialize tasklet.
*
* @attention
* Before invoking this interface,
* assign values to the handler and data members of osal_tasklet and leave the tasklet member tasklet empty.
*
* @param tasklet [in/out] The tasklet to be initialized.
*
* @par Support System:
* linux liteos seliteos.
*/
int osal_tasklet_init(osal_tasklet *tasklet);
/**
* @ingroup osal_interrupt
* @brief schedule tasklet.
*
* @par Support System:
* linux liteos seliteos.
*/
int osal_tasklet_schedule(osal_tasklet *tasklet);
/**
* @ingroup osal_interrupt
* @brief Close tasklet.
*
* @par Description:
* Close tasklet.
*
* @par Support System:
* linux liteos seliteos.
*/
int osal_tasklet_kill(osal_tasklet *tasklet);
/**
* @ingroup osal_interrupt
* @brief Update tasklet.
*
* @par Description:
* Update tasklet.
*
* @par Support System:
* linux liteos seliteos.
*/
int osal_tasklet_update(osal_tasklet *tasklet);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif /* __OSAL_INTERRUPT_H__ */