Platform drivers for Mbed.

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

Revision:
20:4951ea6abee5
Parent:
17:af1f2416dd26
--- a/irq.cpp	Wed Sep 29 12:32:10 2021 +0100
+++ b/irq.cpp	Mon Nov 29 12:39:54 2021 +0000
@@ -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