Forked repo of Platform Drivers- Analog Devices
Diff: irq.cpp
- Revision:
- 20:26b1a4570f4b
- Parent:
- 17:af1f2416dd26
diff -r 3c61197500c4 -r 26b1a4570f4b irq.cpp --- a/irq.cpp Wed Sep 29 12:32:10 2021 +0100 +++ b/irq.cpp Mon Nov 22 22:26:51 2021 +0530 @@ -164,6 +164,7 @@ const struct irq_init_param *param) { mbed::Ticker *ticker; + InterruptIn *ext_interrupt; mbed_irq_desc *new_mbed_desc; if (!desc || !param) { @@ -181,28 +182,49 @@ } 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_mbed_desc->ext_int_pin = ((mbed_irq_init_param *) param->extra)->ext_int_pin; - /* Ticker is a special mbed class used for generating recurring interrupt. - * The object of this class is created during interrupt initialization as: - * 1) To avoid having seperate module for it. - * 2) To avoid having multiple instances of Ticker class - * */ - if (param->irq_ctrl_id == TICKER_INT_ID) { - /* Create new instance of Ticker class */ + switch (param->irq_ctrl_id) { + case EXTERNAL_INT_ID1: + case EXTERNAL_INT_ID2: + case EXTERNAL_INT_ID3: + case EXTERNAL_INT_ID4: + case EXTERNAL_INT_ID5: + /* Create a new external interrupt object */ + ext_interrupt = new InterruptIn((PinName)(new_mbed_desc->ext_int_pin)); + if (!ext_interrupt) { + goto err_interrupt; + } + + new_mbed_desc->int_obj = (mbed::InterruptIn *)ext_interrupt; + break; + + case TICKER_INT_ID: + /* Ticker is a special mbed class used for generating recurring interrupt. + * The object of this class is created during interrupt initialization as: + * 1) To avoid having seperate module for it. + * 2) To avoid having multiple instances of Ticker class + * */ ticker = new Ticker(); if (!ticker) { - goto err_ticker; + goto err_interrupt; } - new_mbed_desc->int_obj_type = (mbed::Ticker *)ticker; + new_mbed_desc->int_obj = (mbed::Ticker *)ticker; new_mbed_desc->ticker_period_usec = ((mbed_irq_init_param *) param->extra)->ticker_period_usec; + break; + + case UART_RX_INT_ID1: + /* UART object must be created from uart.cpp module by an application */ + new_mbed_desc->int_obj = ((mbed_irq_init_param *) + param->extra)->int_obj_type; + break; + + default: + goto err_interrupt; } new_desc->extra = (irq_ctrl_desc *)new_mbed_desc; @@ -211,7 +233,7 @@ return SUCCESS; -err_ticker: +err_interrupt: free(new_mbed_desc); err_new_mbed_desc: free(new_desc); @@ -268,9 +290,6 @@ struct callback_desc *callback_desc) { InterruptIn *ext_interrupt; - mbed::UnbufferedSerial *uart_rx_port; - mbed::Ticker *ticker; - PinName ext_int_pin; mbed_callback_func mbed_callback; if (!desc || !callback_desc) { @@ -283,17 +302,6 @@ case EXTERNAL_INT_ID3: case EXTERNAL_INT_ID4: case EXTERNAL_INT_ID5: - /* Attach external interrupt to input pin */ - ext_int_pin = (PinName)((mbed_irq_desc *)(desc->extra))->ext_int_pin; - if (!ext_int_pin) { - return FAILURE; - } - - ext_interrupt = new InterruptIn(ext_int_pin); - if (!ext_interrupt) { - return FAILURE; - } - switch (irq_id) { case EXTERNAL_INT_ID1: mbed_irq_callbacks.callback_ext_int_id1.callback = callback_desc->callback; @@ -329,7 +337,9 @@ return FAILURE; } - /* Register a callback function to external interrupt event */ + ext_interrupt = (InterruptIn *)(((mbed_irq_desc *)(desc->extra))->int_obj); + + /* Select interrupt mode */ if (((mbed_irq_desc *)(desc->extra))->int_mode == EXT_IRQ_FALL) { ext_interrupt->fall(mbed_callback); } else if (((mbed_irq_desc *)(desc->extra))->int_mode == EXT_IRQ_RISE) { @@ -338,41 +348,16 @@ 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_ID1: - uart_rx_port = (mbed::UnbufferedSerial *)(((mbed_irq_desc *)( - desc->extra))->int_obj_type); - if (!uart_rx_port) { - return FAILURE; - } - mbed_irq_callbacks.callback_uart_rx_id1.callback = callback_desc->callback; mbed_irq_callbacks.callback_uart_rx_id1.ctx = callback_desc->ctx; - - /* Register a callback function to receive UnbufferedSerial port event */ - uart_rx_port->attach(mbed_uart_rx_id1_callback, UnbufferedSerial::RxIrq); - break; case TICKER_INT_ID: - /* Create the new ticker instance */ - ticker = (mbed::Ticker *)(((mbed_irq_desc *)( - desc->extra))->int_obj_type); - if (!ticker) { - return FAILURE; - } - mbed_irq_callbacks.callback_ticker_id.callback = callback_desc->callback; mbed_irq_callbacks.callback_ticker_id.ctx = callback_desc->ctx; - - ticker->attach(mbed_ticker_id_callback, - microseconds(((mbed_irq_desc *)(desc->extra))->ticker_period_usec)); break; default: @@ -431,6 +416,95 @@ return SUCCESS; } +/** + * @brief Enable specific interrupt + * @param desc[in] - The IRQ controller descriptor. + * @param irq_id[in] - Interrupt identifier. + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t irq_enable(struct irq_ctrl_desc *desc, uint32_t irq_id) +{ + InterruptIn *ext_interrupt; + mbed::UnbufferedSerial *uart_rx_port; + mbed::Ticker *ticker; + + if (!desc || !desc->extra) { + return FAILURE; + } + + switch (irq_id) { + case EXTERNAL_INT_ID1: + case EXTERNAL_INT_ID2: + case EXTERNAL_INT_ID3: + case EXTERNAL_INT_ID4: + case EXTERNAL_INT_ID5: + ext_interrupt = (InterruptIn *)(((mbed_irq_desc *)(desc->extra))->int_obj); + ext_interrupt->enable_irq(); + break; + + case UART_RX_INT_ID1: + uart_rx_port = (mbed::UnbufferedSerial *)(((mbed_irq_desc *)( + desc->extra))->int_obj); + uart_rx_port->attach(mbed_uart_rx_id1_callback, UnbufferedSerial::RxIrq); + break; + + case TICKER_INT_ID: + ticker = (mbed::Ticker *)(((mbed_irq_desc *)(desc->extra))->int_obj); + ticker->attach(mbed_ticker_id_callback, + microseconds(((mbed_irq_desc *)(desc->extra))->ticker_period_usec)); + break; + + default: + return FAILURE; + } + + return SUCCESS; +} + +/** + * @brief Disable specific interrupt + * @param desc[in] - The IRQ controller descriptor. + * @param irq_id[in] - Interrupt identifier. + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t irq_disable(struct irq_ctrl_desc *desc, uint32_t irq_id) +{ + InterruptIn *ext_interrupt; + mbed::UnbufferedSerial *uart_rx_port; + mbed::Ticker *ticker; + + if (!desc || !desc->extra) { + return FAILURE; + } + + switch (irq_id) { + case EXTERNAL_INT_ID1: + case EXTERNAL_INT_ID2: + case EXTERNAL_INT_ID3: + case EXTERNAL_INT_ID4: + case EXTERNAL_INT_ID5: + ext_interrupt = (InterruptIn *)(((mbed_irq_desc *)(desc->extra))->int_obj); + ext_interrupt->disable_irq(); + break; + + case UART_RX_INT_ID1: + uart_rx_port = (mbed::UnbufferedSerial *)(((mbed_irq_desc *)( + desc->extra))->int_obj); + uart_rx_port->attach(NULL, UnbufferedSerial::RxIrq); + break; + + case TICKER_INT_ID: + ticker = (mbed::Ticker *)(((mbed_irq_desc *)(desc->extra))->int_obj); + ticker->detach(); + break; + + default: + return FAILURE; + } + + return SUCCESS; +} + #ifdef __cplusplus // Closing extern c } #endif