Platform drivers for Mbed.
Dependents: EVAL-CN0535-FMCZ EVAL-CN0535-FMCZ EVAL-AD568x-AD569x EVAL-AD7606 ... more
Diff: src/irq.cpp
- Revision:
- 11:a2dcf0ebb5b5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/irq.cpp Mon Aug 03 17:21:20 2020 +0530 @@ -0,0 +1,166 @@ +/***************************************************************************//** + * @file irq.cpp + * @brief Implementation of Interrupt No-OS platform driver interfaces +******************************************************************************** + * Copyright (c) 2020 Analog Devices, Inc. + * + * All rights reserved. + * + * This software is proprietary to Analog Devices, Inc. and its licensors. + * By using this software you agree to the terms of the associated + * Analog Devices Software License Agreement. +*******************************************************************************/ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ + +#include <stdio.h> +#include <mbed.h> + +#include "platform_drivers.h" +#include "irq_extra.h" +#include "uart_extra.h" + +/******************************************************************************/ +/*************************** Types Declarations *******************************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Definitions *******************************/ +/******************************************************************************/ + +/** + * @brief Initialized the controller for the peripheral interrupts + * @param desc[in, out] - Pointer where the configured instance is stored + * @param param[in] - Configuration information for the instance + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t irq_ctrl_init(struct irq_ctrl_desc **desc, + const struct irq_init_param *param) +{ + if (!desc || !param) { + return FAILURE; + } + + irq_ctrl_desc *new_desc = (irq_ctrl_desc *)malloc(sizeof(irq_ctrl_desc)); + if (!new_desc) { + return FAILURE; + } + + mbed_irq_desc *new_mbed_desc = (mbed_irq_desc *)malloc(sizeof(mbed_irq_desc)); + if (!new_mbed_desc) { + free(new_desc); + return FAILURE; + } + + new_desc->irq_ctrl_id = param->irq_ctrl_id; + + new_mbed_desc->int_mode = ((mbed_irq_init_param *)param->extra)->int_mode; + new_mbed_desc->int_obj_type = ((mbed_irq_init_param *) + param->extra)->int_obj_type; + + new_desc->extra = (irq_ctrl_desc *)new_mbed_desc; + + *desc = new_desc; + + return SUCCESS; +} + + +/** + * @brief Free the resources allocated by irq_ctrl_init() + * @param desc[in, out] - Interrupt controller descriptor. + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t irq_ctrl_remove(struct irq_ctrl_desc *desc) +{ + if (!desc) { + return FAILURE; + } + + if (((mbed_irq_desc *)desc->extra)->int_obj) { + free(((mbed_irq_desc *)desc->extra)->int_obj); + } + + if ((irq_ctrl_desc *)desc->extra) { + free((irq_ctrl_desc *)desc->extra); + } + + free(desc); + + return SUCCESS; +} + + +/** + * @brief Registers a IRQ callback function to irq controller. + * @param desc[in] - The IRQ controller descriptor. + * @param irq_id[in] - Interrupt identifier. + * @param callback_desc - Descriptor of the callback. If it is NULL, the + * callback will be unregistered + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t irq_register_callback(struct irq_ctrl_desc *desc, + uint32_t irq_id, + struct callback_desc *callback_desc) +{ + InterruptIn *ext_interrupt; + mbed::UnbufferedSerial *uart_rx_port; + PinName *ext_int_pin; + + if (!desc || !callback_desc) { + return FAILURE; + } + + switch (irq_id) { + case EXTERNAL_INT_ID: + /* Attach external interrupt to input pin */ + ext_int_pin = (PinName *)((mbed_irq_desc *)(desc->extra))->int_obj_type; + if (!ext_int_pin) { + return FAILURE; + } + + ext_interrupt = new InterruptIn(*ext_int_pin); + if (!ext_interrupt) { + return FAILURE; + } + + /* Register a callback function to get external interrupt input */ + if (((mbed_irq_desc *)(desc->extra))->int_mode == EXT_IRQ_FALL) { + ext_interrupt->fall(callback_desc->callback); + } else if (((mbed_irq_desc *)(desc->extra))->int_mode == EXT_IRQ_RISE) { + ext_interrupt->rise(callback_desc->callback); + } else { + return FAILURE; + } + + /* Store the external interrupt object to be freed from irq_ctrl_remove() */ + ((mbed_irq_desc *)(desc->extra))->int_obj = ext_interrupt; + + ext_interrupt->enable_irq(); + + break; + + case UART_RX_INT_ID: + uart_rx_port = (mbed::UnbufferedSerial *)(((mbed_irq_desc *)( + desc->extra))->int_obj_type); + if (!uart_rx_port) { + return FAILURE; + } + + /* Register a callback function to receive UnbufferedSerial port event */ + uart_rx_port->attach(callback_desc->callback, UnbufferedSerial::RxIrq); + + break; + + default: + return FAILURE; + } + + return SUCCESS; +}