Platform drivers for Mbed.

Dependents:   EVAL-CN0535-FMCZ EVAL-CN0535-FMCZ EVAL-AD568x-AD569x EVAL-AD7606 ... more

Committer:
mahphalke
Date:
Fri Mar 19 12:10:16 2021 +0530
Revision:
16:61ad39564f45
Parent:
11:a2dcf0ebb5b5
Added uart changes

Who changed what in which revision?

UserRevisionLine numberNew 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 }