From b24866225a6301d3a663f874725e83c012dc25d3 Mon Sep 17 00:00:00 2001 From: Florent Duchon Date: Wed, 26 Dec 2012 17:36:00 +0100 Subject: digital/beacon: add bitcloud stack into common directory digital/zigbit --- .../stack/Components/HAL/avr/common/src/irq.c | 143 +++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/irq.c (limited to 'digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/irq.c') diff --git a/digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/irq.c b/digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/irq.c new file mode 100644 index 00000000..c681ba74 --- /dev/null +++ b/digital/zigbit/bitcloud/stack/Components/HAL/avr/common/src/irq.c @@ -0,0 +1,143 @@ +/**************************************************************************//** + \file irq.c + + \brief Implementation of IRQ interface. + + \author + Atmel Corporation: http://www.atmel.com \n + Support email: avr@atmel.com + + Copyright (c) 2008-2011, Atmel Corporation. All rights reserved. + Licensed under Atmel's Limited License Agreement (BitCloudTM). + + \internal + History: + 5/12/07 A. Khromykh - Created + ******************************************************************************/ +/****************************************************************************** + * WARNING: CHANGING THIS FILE MAY AFFECT CORE FUNCTIONALITY OF THE STACK. * + * EXPERT USERS SHOULD PROCEED WITH CAUTION. * + ******************************************************************************/ + +/****************************************************************************** + Includes section +******************************************************************************/ +#include + +/****************************************************************************** + External global variables section +******************************************************************************/ +extern IrqCallback_t IrqCallbackList[HAL_NUM_IRQ_LINES]; + +/****************************************************************************** + Implementations section +******************************************************************************/ +/****************************************************************************** + Registers user's irqNumber interrupt + Parameters: + irqNumber - IRQ number + irqMode - Interrupt sence control + f - user's interrupt handler. Handler must be executed less than 100 us. + Returns: + -1 - if irqNumber is out of range, not valid irq mode, invalid interrupt handler + or such interrupt has been already registered. + 0 - otherwise. +******************************************************************************/ +int HAL_RegisterIrq(HAL_IrqNumber_t irqNumber, HAL_IrqMode_t irqMode, void (*f)(void)) +{ + uint8_t irqOffsetNumber = irqNumber - HAL_FIRST_VALID_IRQ; + + // irqNumber is out of range + if (irqOffsetNumber >= HAL_NUM_IRQ_LINES) + return -1; + // Such interrupt has been already register + if (NULL != IrqCallbackList[irqOffsetNumber]) + return -1; + // not valid irq mode + if (IRQ_HIGH_LEVEL == irqMode) + return -1; + // invalid interrupt handler + if (NULL == f) + return -1; + + /* type HAL_IrqMode_t has not valid IRQ_HIGH_LEVEL state, + * because for saving to register all states need decrement after IRQ_LOW_LEVEL state. */ + if (IRQ_LOW_LEVEL == irqMode) + halSetIrqConfig(irqNumber, irqMode); + else + halSetIrqConfig(irqNumber, irqMode - 1); + + IrqCallbackList[irqOffsetNumber] = f; + return 0; +} + +/****************************************************************************** + Enables irqNumber interrupt + Parameters: + irqNumber - IRQ number + Returns: + -1 - if irqNumber is out of range or has not been + registered yet. + 0 - otherwise. +******************************************************************************/ +int HAL_EnableIrq(HAL_IrqNumber_t irqNumber) +{ + uint8_t irqOffsetNumber = irqNumber - HAL_FIRST_VALID_IRQ; + // irqNumber is out of range + if (irqOffsetNumber >= HAL_NUM_IRQ_LINES) + return -1; + // Interrupt has not been opened yet + if (NULL == IrqCallbackList[irqOffsetNumber]) + return -1; + halEnableIrqInterrupt(irqNumber); + return 0; +} + +/****************************************************************************** + Disables irqNumber interrupt + Parameters: + irqNumber - IRQ number + Returns: + -1 - if irqNumber is out of range or has not been + registered yet. + 0 - otherwise. +******************************************************************************/ +int HAL_DisableIrq(HAL_IrqNumber_t irqNumber) +{ + uint8_t irqOffsetNumber = irqNumber - HAL_FIRST_VALID_IRQ; + // irqNumber is out of range + if (irqOffsetNumber >= HAL_NUM_IRQ_LINES) + return -1; + // Interrupt has not been opened yet + if (NULL == IrqCallbackList[irqOffsetNumber]) + return -1; + halDisableIrqInterrupt(irqNumber); + return 0; +} + +/****************************************************************************** + Unregisters user's irqNumber interrupt + Parameters: + irqNumber - IRQ number + Returns: + -1 - if irqNumber is out of range or has not been + registered yet. + 0 - otherwise. +******************************************************************************/ +int HAL_UnregisterIrq(HAL_IrqNumber_t irqNumber) +{ + uint8_t irqOffsetNumber = irqNumber - HAL_FIRST_VALID_IRQ; + // irqNumber is out of range + if (irqOffsetNumber >= HAL_NUM_IRQ_LINES) + return -1; + // Interrupt has not been opened yet + if (NULL == IrqCallbackList[irqOffsetNumber]) + return -1; + // Disable external interrupt request + halDisableIrqInterrupt(irqNumber); + halClrIrqConfig(irqNumber); + IrqCallbackList[irqOffsetNumber] = NULL; + return 0; +} + +// eof irq.c -- cgit v1.2.3