Platform drivers for Mbed.
Dependents: EVAL-CN0535-FMCZ EVAL-CN0535-FMCZ EVAL-AD568x-AD569x EVAL-AD7606 ... more
src/irq.cpp@11:a2dcf0ebb5b5, 2020-08-03 (annotated)
- Committer:
- Mahesh Phalke
- Date:
- Mon Aug 03 17:21:20 2020 +0530
- Revision:
- 11:a2dcf0ebb5b5
Updates to make platform drivers compatible with Mbed-OS 6.0 and onwards
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Mahesh Phalke |
11:a2dcf0ebb5b5 | 1 | /***************************************************************************//** |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 2 | * @file irq.cpp |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 3 | * @brief Implementation of Interrupt No-OS platform driver interfaces |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 4 | ******************************************************************************** |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 5 | * Copyright (c) 2020 Analog Devices, Inc. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 6 | * |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 7 | * All rights reserved. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 8 | * |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 9 | * This software is proprietary to Analog Devices, Inc. and its licensors. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 10 | * By using this software you agree to the terms of the associated |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 11 | * Analog Devices Software License Agreement. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 12 | *******************************************************************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 13 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 14 | /******************************************************************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 15 | /***************************** Include Files **********************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 16 | /******************************************************************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 17 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 18 | #include <stdio.h> |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 19 | #include <mbed.h> |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 20 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 21 | #include "platform_drivers.h" |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 22 | #include "irq_extra.h" |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 23 | #include "uart_extra.h" |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 24 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 25 | /******************************************************************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 26 | /*************************** Types Declarations *******************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 27 | /******************************************************************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 28 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 29 | /******************************************************************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 30 | /************************ Functions Declarations ******************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 31 | /******************************************************************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 32 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 33 | /******************************************************************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 34 | /************************ Functions Definitions *******************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 35 | /******************************************************************************/ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 36 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 37 | /** |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 38 | * @brief Initialized the controller for the peripheral interrupts |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 39 | * @param desc[in, out] - Pointer where the configured instance is stored |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 40 | * @param param[in] - Configuration information for the instance |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 41 | * @return SUCCESS in case of success, FAILURE otherwise. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 42 | */ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 43 | int32_t irq_ctrl_init(struct irq_ctrl_desc **desc, |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 44 | const struct irq_init_param *param) |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 45 | { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 46 | if (!desc || !param) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 47 | return FAILURE; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 48 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 49 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 50 | irq_ctrl_desc *new_desc = (irq_ctrl_desc *)malloc(sizeof(irq_ctrl_desc)); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 51 | if (!new_desc) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 52 | return FAILURE; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 53 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 54 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 55 | mbed_irq_desc *new_mbed_desc = (mbed_irq_desc *)malloc(sizeof(mbed_irq_desc)); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 56 | if (!new_mbed_desc) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 57 | free(new_desc); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 58 | return FAILURE; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 59 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 60 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 61 | new_desc->irq_ctrl_id = param->irq_ctrl_id; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 62 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 63 | new_mbed_desc->int_mode = ((mbed_irq_init_param *)param->extra)->int_mode; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 64 | new_mbed_desc->int_obj_type = ((mbed_irq_init_param *) |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 65 | param->extra)->int_obj_type; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 66 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 67 | new_desc->extra = (irq_ctrl_desc *)new_mbed_desc; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 68 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 69 | *desc = new_desc; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 70 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 71 | return SUCCESS; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 72 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 73 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 74 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 75 | /** |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 76 | * @brief Free the resources allocated by irq_ctrl_init() |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 77 | * @param desc[in, out] - Interrupt controller descriptor. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 78 | * @return SUCCESS in case of success, FAILURE otherwise. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 79 | */ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 80 | int32_t irq_ctrl_remove(struct irq_ctrl_desc *desc) |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 81 | { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 82 | if (!desc) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 83 | return FAILURE; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 84 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 85 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 86 | if (((mbed_irq_desc *)desc->extra)->int_obj) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 87 | free(((mbed_irq_desc *)desc->extra)->int_obj); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 88 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 89 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 90 | if ((irq_ctrl_desc *)desc->extra) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 91 | free((irq_ctrl_desc *)desc->extra); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 92 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 93 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 94 | free(desc); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 95 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 96 | return SUCCESS; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 97 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 98 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 99 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 100 | /** |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 101 | * @brief Registers a IRQ callback function to irq controller. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 102 | * @param desc[in] - The IRQ controller descriptor. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 103 | * @param irq_id[in] - Interrupt identifier. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 104 | * @param callback_desc - Descriptor of the callback. If it is NULL, the |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 105 | * callback will be unregistered |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 106 | * @return SUCCESS in case of success, FAILURE otherwise. |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 107 | */ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 108 | int32_t irq_register_callback(struct irq_ctrl_desc *desc, |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 109 | uint32_t irq_id, |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 110 | struct callback_desc *callback_desc) |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 111 | { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 112 | InterruptIn *ext_interrupt; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 113 | mbed::UnbufferedSerial *uart_rx_port; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 114 | PinName *ext_int_pin; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 115 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 116 | if (!desc || !callback_desc) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 117 | return FAILURE; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 118 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 119 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 120 | switch (irq_id) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 121 | case EXTERNAL_INT_ID: |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 122 | /* Attach external interrupt to input pin */ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 123 | ext_int_pin = (PinName *)((mbed_irq_desc *)(desc->extra))->int_obj_type; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 124 | if (!ext_int_pin) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 125 | return FAILURE; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 126 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 127 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 128 | ext_interrupt = new InterruptIn(*ext_int_pin); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 129 | if (!ext_interrupt) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 130 | return FAILURE; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 131 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 132 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 133 | /* Register a callback function to get external interrupt input */ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 134 | if (((mbed_irq_desc *)(desc->extra))->int_mode == EXT_IRQ_FALL) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 135 | ext_interrupt->fall(callback_desc->callback); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 136 | } else if (((mbed_irq_desc *)(desc->extra))->int_mode == EXT_IRQ_RISE) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 137 | ext_interrupt->rise(callback_desc->callback); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 138 | } else { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 139 | return FAILURE; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 140 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 141 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 142 | /* Store the external interrupt object to be freed from irq_ctrl_remove() */ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 143 | ((mbed_irq_desc *)(desc->extra))->int_obj = ext_interrupt; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 144 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 145 | ext_interrupt->enable_irq(); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 146 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 147 | break; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 148 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 149 | case UART_RX_INT_ID: |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 150 | uart_rx_port = (mbed::UnbufferedSerial *)(((mbed_irq_desc *)( |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 151 | desc->extra))->int_obj_type); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 152 | if (!uart_rx_port) { |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 153 | return FAILURE; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 154 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 155 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 156 | /* Register a callback function to receive UnbufferedSerial port event */ |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 157 | uart_rx_port->attach(callback_desc->callback, UnbufferedSerial::RxIrq); |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 158 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 159 | break; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 160 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 161 | default: |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 162 | return FAILURE; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 163 | } |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 164 | |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 165 | return SUCCESS; |
Mahesh Phalke |
11:a2dcf0ebb5b5 | 166 | } |