action
container
contrib
controller
coordinates
datalinklayer
datapool
devicehandlers
events
fdir
globalfunctions
health
internalError
ipc
memory
modes
monitoring
objectmanager
osal
FreeRTOS
linux
rtems
Clock.cpp
CpuUsage.cpp
CpuUsage.h
InitTask.cpp
InitTask.h
InternalErrorCodes.cpp
Interrupt.cpp
Interrupt.h
MessageQueue.cpp
MessageQueue.h
MultiObjectTask.cpp
MultiObjectTask.h
Mutex.cpp
Mutex.h
MutexFactory.cpp
PollingTask.cpp
PollingTask.h
QueueFactory.cpp
RtemsBasic.cpp
RtemsBasic.h
TaskBase.cpp
TaskBase.h
TaskFactory.cpp
Endiness.h
InternalErrorCodes.h
parameters
power
returnvalues
rmap
serialize
serviceinterface
storagemanager
subsystem
tasks
tcdistribution
thermal
timemanager
tmstorage
tmtcpacket
tmtcservices
.gitignore
LICENSE
NOTICE
framework.mk
87 lines
2.7 KiB
C++
87 lines
2.7 KiB
C++
#include "Interrupt.h"
|
|
extern "C" {
|
|
#include <bsp_flp/hw_timer/hw_timer.h>
|
|
#include <bsp_flp/hw_uart/hw_uart.h>
|
|
}
|
|
#include "RtemsBasic.h"
|
|
|
|
|
|
ReturnValue_t Interrupt::enableInterrupt(InterruptNumber_t interruptNumber) {
|
|
volatile uint32_t* irqMask = hw_irq_mask;
|
|
uint32_t expectedValue = *irqMask | (1 << interruptNumber);
|
|
*irqMask = expectedValue;
|
|
uint32_t tempValue = *irqMask;
|
|
if (tempValue == expectedValue) {
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
} else {
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
}
|
|
|
|
ReturnValue_t Interrupt::setInterruptServiceRoutine(IsrHandler_t handler,
|
|
InterruptNumber_t interrupt, IsrHandler_t* oldHandler) {
|
|
IsrHandler_t oldHandler_local;
|
|
if (oldHandler == NULL) {
|
|
oldHandler = &oldHandler_local;
|
|
}
|
|
//+ 0x10 comes because of trap type assignment to IRQs in UT699 processor
|
|
rtems_status_code status = rtems_interrupt_catch(handler, interrupt + 0x10,
|
|
oldHandler);
|
|
switch(status){
|
|
case RTEMS_SUCCESSFUL:
|
|
//ISR established successfully
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
case RTEMS_INVALID_NUMBER:
|
|
//illegal vector number
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
case RTEMS_INVALID_ADDRESS:
|
|
//illegal ISR entry point or invalid old_isr_handler
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
default:
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
|
|
}
|
|
|
|
ReturnValue_t Interrupt::disableInterrupt(InterruptNumber_t interruptNumber) {
|
|
//TODO Not implemented
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
|
|
//SHOULDDO: Make default values (edge, polarity) settable?
|
|
ReturnValue_t Interrupt::enableGpioInterrupt(InterruptNumber_t interrupt) {
|
|
volatile uint32_t* irqMask = hw_irq_mask;
|
|
uint32_t expectedValue = *irqMask | (1 << interrupt);
|
|
*irqMask = expectedValue;
|
|
uint32_t tempValue = *irqMask;
|
|
if (tempValue == expectedValue) {
|
|
volatile hw_gpio_port_t* ioPorts = hw_gpio_port;
|
|
ioPorts->direction &= ~(1 << interrupt); //Direction In
|
|
ioPorts->interrupt_edge |= 1 << interrupt; //Edge triggered
|
|
ioPorts->interrupt_polarity |= 1 << interrupt; //Trigger on rising edge
|
|
ioPorts->interrupt_mask |= 1 << interrupt; //Enable
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
} else {
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
}
|
|
|
|
ReturnValue_t Interrupt::disableGpioInterrupt(InterruptNumber_t interrupt) {
|
|
volatile uint32_t* irqMask = hw_irq_mask;
|
|
uint32_t expectedValue = *irqMask & ~(1 << interrupt);
|
|
*irqMask = expectedValue;
|
|
uint32_t tempValue = *irqMask;
|
|
if (tempValue == expectedValue) {
|
|
//Disable gpio IRQ
|
|
volatile hw_gpio_port_t* ioPorts = hw_gpio_port;
|
|
ioPorts->interrupt_mask &= ~(1 << interrupt);
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
} else {
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
}
|
|
}
|
|
|
|
bool Interrupt::isInterruptInProgress() {
|
|
return rtems_interrupt_is_in_progress();
|
|
}
|