blob: 780b0a72b49856576549521383fe3280e8252f84 [file] [log] [blame]
/*
* Copyright (c) 2015-2016, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * 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.
*
* * Neither the name of Texas Instruments Incorporated 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 OWNER 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.
*/
/** ============================================================================
* @file HwiP.h
*
* @brief Hardware Interrupt module for the RTOS Porting Interface
*
* The ::HwiP_disable/::HwiP_restore APIs can be called recursively. The order
* of the HwiP_restore calls, must be in reversed order. For example:
* @code
* uintptr_t key1, key2;
* key1 = HwiP_disable();
* key2 = HwiP_disable();
* HwiP_restore(key2);
* HwiP_restore(key1);
* @endcode
*
* ============================================================================
*/
#ifndef ti_dpl_HwiP__include
#define ti_dpl_HwiP__include
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
/*!
* @brief Opaque client reference to an instance of a HwiP
*
* A HwiP_Handle returned from the ::HwiP_create represents that instance.
*/
typedef void *HwiP_Handle;
/*!
* @brief Status codes for HwiP APIs
*/
typedef enum HwiP_Status {
HwiP_OK = 0,
HwiP_FAILURE = -1
} HwiP_Status;
/*!
* @brief Prototype for the entry function for a hardware interrupt
*/
typedef void (*HwiP_Fxn)(uintptr_t arg);
/*!
* @brief Basic HwiP Parameters
*
* Structure that contains the parameters passed into ::HwiP_create
* when creating a HwiP instance. The ::HwiP_Params_init function should
* be used to initialize the fields to default values before the application sets
* the fields manually. The HwiP default parameters are noted in
* HwiP_Params_init.
*/
typedef struct HwiP_Params {
char *name; /*!< Name of the clock instance. Memory must
persist for the life of the clock instance.
This can be used for debugging purposes, or
set to NULL if not needed. */
uintptr_t arg; /*!< Argument passed into the Hwi function. */
uint32_t priority; /*!< Device specific priority. */
} HwiP_Params;
/*!
* @brief Function to clear a single interrupt
*
* @param interruptNum interrupt number to clear
*/
extern void HwiP_clearInterrupt(int interruptNum);
/*!
* @brief Function to create an interrupt on CortexM devices
*
* @param interruptNum Interrupt Vector Id
*
* @param hwiFxn entry function of the hardware interrupt
*
* @param params Pointer to the instance configuration parameters. NULL
* denotes to use the default parameters. The HwiP default
* parameters are noted in ::HwiP_Params_init.
*
* @return A HwiP_Handle on success or a NULL on an error
*/
extern HwiP_Handle HwiP_create(int interruptNum, HwiP_Fxn hwiFxn,
HwiP_Params *params);
/*!
* @brief Function to delete an interrupt on CortexM devices
*
* @param handle returned from the HwiP_create call
*
* @return
*/
extern HwiP_Status HwiP_delete(HwiP_Handle handle);
/*!
* @brief Function to disable interrupts to enter a critical region
*
* This function can be called multiple times, but must unwound in the reverse
* order. For example
* @code
* uintptr_t key1, key2;
* key1 = HwiP_disable();
* key2 = HwiP_disable();
* HwiP_restore(key2);
* HwiP_restore(key1);
* @endcode
*
* @return A key that must be passed to HwiP_restore to re-enable interrupts.
*/
extern uintptr_t HwiP_disable(void);
/*!
* @brief Function to disable a single interrupt
*
* @param interruptNum interrupt number to disable
*/
extern void HwiP_disableInterrupt(int interruptNum);
/*!
* @brief Function to enable a single interrupt
*
* @param interruptNum interrupt number to enable
*/
extern void HwiP_enableInterrupt(int interruptNum);
/*!
* @brief Function to return a status based on whether it is in an interrupt
* context.
*
* @return A status: indicating whether the function was called in an
* ISR (true) or at thread level (false).
*/
extern bool HwiP_inISR(void);
/*!
* @brief Initialize params structure to default values.
*
* The default parameters are:
* - name: NULL
* - arg: 0
* - priority: ~0
*
* @param params Pointer to the instance configuration parameters.
*/
extern void HwiP_Params_init(HwiP_Params *params);
/*!
* @brief Function to restore interrupts to exit a critical region
*
* @param key return from HwiP_disable
*/
extern void HwiP_restore(uintptr_t key);
#ifdef __cplusplus
}
#endif
#endif /* ti_dpl_HwiP__include */