rtems_status_code lpc24xx_dma_copy_release(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_status_code rsc = RTEMS_SUCCESSFUL; sc = rtems_interrupt_handler_remove( LPC24XX_IRQ_DMA, lpc24xx_dma_copy_handler, NULL ); if (sc != RTEMS_SUCCESSFUL) { rsc = sc; } sc = rtems_semaphore_delete(lpc24xx_dma_sema_table [0]); if (sc != RTEMS_SUCCESSFUL) { rsc = sc; } sc = rtems_semaphore_delete(lpc24xx_dma_sema_table [1]); if (sc != RTEMS_SUCCESSFUL) { rsc = sc; } return rsc; }
/** * @brief closes sci peripheral of interrupt driven driver * * calls tms570_sci_poll_last_close and disables interrupts * * @param[in] tty Termios control * @param[in] base context of the driver * @param[in] args * @retval false Error occured during initialization * @retval true Driver is open and ready */ static void tms570_sci_interrupt_last_close( rtems_termios_tty *tty, rtems_termios_device_context *base, rtems_libio_open_close_args_t *args ) { tms570_sci_context *ctx = (tms570_sci_context *) base; rtems_interrupt_lock_context lock_context; rtems_interval tw; int32_t baudrate; /* Turn off RX interrupts */ rtems_termios_device_lock_acquire(base, &lock_context); tms570_sci_disable_interrupts(ctx); rtems_termios_device_lock_release(base, &lock_context); tw = rtems_clock_get_ticks_per_second(); baudrate = rtems_termios_baud_to_number(cfgetospeed(&tty->termios)); tw = tw * 10 / baudrate + 1; while ( ( ctx->regs->FLR & TMS570_SCI_FLR_TX_EMPTY ) == 0 ) { rtems_task_wake_after(tw); } /* uninstall ISR */ rtems_interrupt_handler_remove(ctx->irq, tms570_sci_interrupt_handler, tty); tms570_sci_poll_last_close(tty, base, args); }
static void imx_i2c_destroy(i2c_bus *base) { imx_i2c_bus *bus; bus = (imx_i2c_bus *) base; rtems_interrupt_handler_remove(bus->irq, imx_i2c_interrupt, bus); i2c_bus_destroy_and_free(&bus->base); }
void cs8900_detach_interrupt (cs8900_device *cs) { rtems_status_code status = RTEMS_SUCCESSFUL; status = rtems_interrupt_handler_remove( LPC22xx_INTERRUPT_EINT2, cs8900_isr, cs ); assert(status == RTEMS_SUCCESSFUL); }
int BSP_disconnect_clock_handler (void) { rtems_status_code sc; clockOff(NULL); /* * remove interrupt handler */ sc = rtems_interrupt_handler_remove(BSP_PERIODIC_TIMER, BSP_clock_hdl,NULL); return sc == RTEMS_SUCCESSFUL; }
static void raspberrypi_clock_cleanup(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; /* Remove interrupt handler */ sc = rtems_interrupt_handler_remove( BCM2835_IRQ_ID_TIMER_0, (rtems_interrupt_handler) Clock_isr, NULL ); if (sc != RTEMS_SUCCESSFUL) { rtems_fatal_error_occurred(0xdeadbeef); } }
static void qoriq_clock_cleanup(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; qoriq_clock->bcr = GTBCR_CI; sc = rtems_interrupt_handler_remove( CLOCK_INTERRUPT, (rtems_interrupt_handler) Clock_isr, NULL ); if (sc != RTEMS_SUCCESSFUL) { rtems_fatal_error_occurred(0xdeadbeef); } }
/** * @deprecated Use rtems_interrupt_handler_remove() instead. */ int BSP_remove_rtems_irq_handler(const rtems_irq_connect_data *cd) { rtems_status_code sc = RTEMS_SUCCESSFUL; if (cd->off != NULL) { (*cd->off)(cd); } sc = rtems_interrupt_handler_remove(cd->name, cd->hdl, cd->handle); if (sc != RTEMS_SUCCESSFUL) { return 0; } return 1; }
rtems_status_code rtems_interrupt_server_handler_remove( rtems_id server, rtems_vector_number vector, rtems_interrupt_handler handler, void *arg ) { rtems_status_code sc = RTEMS_SUCCESSFUL; bsp_interrupt_server_iterate_entry ie = { .handler = handler, .arg = arg, .entry = NULL }; sc = bsp_interrupt_server_is_initialized(); if (sc != RTEMS_SUCCESSFUL) { return sc; } if (server != RTEMS_ID_NONE) { return RTEMS_NOT_IMPLEMENTED; } /* Query corresponding interrupt server entry */ sc = rtems_interrupt_handler_iterate( vector, bsp_interrupt_server_per_handler_routine, &ie ); if (sc != RTEMS_SUCCESSFUL) { return sc; } else if (ie.entry == NULL) { return RTEMS_INVALID_ID; } sc = rtems_interrupt_handler_remove( vector, bsp_interrupt_server_trigger, ie.entry ); if (sc != RTEMS_SUCCESSFUL) { return sc; } free(ie.entry); return RTEMS_SUCCESSFUL; }
static void atsam_uart_last_close( rtems_termios_tty *tty, rtems_termios_device_context *base, rtems_libio_open_close_args_t *args ) { atsam_uart_context *ctx = (atsam_uart_context *) base; #ifdef ATSAM_CONSOLE_USE_INTERRUPTS rtems_interrupt_handler_remove(ctx->irq, atsam_uart_interrupt, tty); #endif if (!ctx->console) { PMC_DisablePeripheral(ctx->id); } }
static void lpc_clock_cleanup(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; /* Disable timer */ lpc_clock->tcr = 0x0; /* Remove interrupt handler */ sc = rtems_interrupt_handler_remove( LPC_CLOCK_INTERRUPT, (rtems_interrupt_handler) Clock_isr, NULL ); if (sc != RTEMS_SUCCESSFUL) { rtems_fatal_error_occurred(0xdeadbeef); } }
void mpc55xx_edma_release_channel(edma_channel_context *ctx) { rtems_status_code sc = RTEMS_SUCCESSFUL; unsigned channel_index = edma_channel_index_of_tcd(ctx->edma_tcd); mpc55xx_edma_release_channel_by_tcd(ctx->edma_tcd); rtems_chain_extract(&ctx->node); sc = rtems_interrupt_handler_remove( MPC55XX_IRQ_EDMA(channel_index), edma_interrupt_handler, ctx ); if (sc != RTEMS_SUCCESSFUL) { bsp_fatal(MPC55XX_FATAL_EDMA_IRQ_REMOVE); } }
static int pl050_last_close(int major, int minor, void *arg) { const console_tbl *ct = Console_Port_Tbl[minor]; volatile pl050 *regs = pl050_get_regs(minor); rtems_status_code sc; regs->kmicr = 0; sc = rtems_interrupt_handler_remove( ct->ulIntVector, pl050_interrupt, (void *) minor ); assert(sc == RTEMS_SUCCESSFUL); return 0; }
static void mpc55xx_clock_cleanup( void) { rtems_status_code sc = RTEMS_SUCCESSFUL; volatile struct EMIOS_CH_tag *regs = &EMIOS.CH [MPC55XX_CLOCK_EMIOS_CHANNEL]; union EMIOS_CCR_tag ccr = MPC55XX_ZERO_FLAGS; /* Set channel in GPIO mode */ ccr.B.MODE = MPC55XX_EMIOS_MODE_GPIO_INPUT; regs->CCR.R = ccr.R; /* Remove interrupt handler */ sc = rtems_interrupt_handler_remove( MPC55XX_IRQ_EMIOS_GET_REQUEST( MPC55XX_CLOCK_EMIOS_CHANNEL), (rtems_interrupt_handler) Clock_isr, NULL ); RTEMS_CHECK_SC_VOID( sc, "remove clock interrupt handler"); }
static int leon3_console_last_close(int major, int minor, void *arg) { struct rtems_termios_tty *tty = leon3_console_get_tty(arg); struct apbuart_priv *uart = leon3_console_get_uart(minor); rtems_interrupt_level level; /* Turn off RX interrupts */ rtems_termios_interrupt_lock_acquire(tty, level); uart->regs->ctrl &= ~(LEON_REG_UART_CTRL_RI); rtems_termios_interrupt_lock_release(tty, level); /**** Flush device ****/ while (uart->sending) { /* Wait until all data has been sent */ } /* uninstall ISR */ rtems_interrupt_handler_remove(uart->irq, leon3_console_isr, uart); return 0; }
static void apbuart_last_close_interrupt( rtems_termios_tty *tty, rtems_termios_device_context *base, rtems_libio_open_close_args_t *args ) { struct apbuart_context *uart = (struct apbuart_context *) base; rtems_interrupt_lock_context lock_context; /* Turn off RX interrupts */ rtems_termios_device_lock_acquire(base, &lock_context); uart->regs->ctrl &= ~(APBUART_CTRL_RI); rtems_termios_device_lock_release(base, &lock_context); /**** Flush device ****/ while (uart->sending) { /* Wait until all data has been sent */ } /* uninstall ISR */ rtems_interrupt_handler_remove(uart->irq, apbuart_isr, tty); }
/** * @brief closes sci peripheral of interrupt driven driver * * calls tms570_sci_poll_last_close and disables interrupts * * @param[in] tty Termios control * @param[in] base context of the driver * @param[in] args * @retval false Error occured during initialization * @retval true Driver is open and ready */ static void tms570_sci_interrupt_last_close( rtems_termios_tty *tty, rtems_termios_device_context *base, rtems_libio_open_close_args_t *args ) { tms570_sci_context *ctx = (tms570_sci_context *) base; rtems_interrupt_lock_context lock_context; /* Turn off RX interrupts */ rtems_termios_device_lock_acquire(base, &lock_context); tms570_sci_disable_interrupts(ctx); rtems_termios_device_lock_release(base, &lock_context); /* Flush device */ while ( ( ctx->regs->FLR & TMS570_SCI_FLR_TX_EMPTY ) > 0 ) { ;/* Wait until all data has been sent */ } /* uninstall ISR */ rtems_interrupt_handler_remove(ctx->irq, tms570_sci_interrupt_handler, tty); tms570_sci_poll_last_close(tty, base, args); }
NS16550_STATIC void ns16550_cleanup_interrupts(int minor) { #if defined(BSP_FEATURE_IRQ_EXTENSION) rtems_status_code sc = RTEMS_SUCCESSFUL; console_tbl *c = Console_Port_Tbl [minor]; sc = rtems_interrupt_handler_remove( c->ulIntVector, ns16550_isr, (void *) minor ); if (sc != RTEMS_SUCCESSFUL) { /* FIXME */ printk("%s: Error: Remove interrupt handler\n", __func__); rtems_fatal_error_occurred(0xdeadbeef); } #elif defined(BSP_FEATURE_IRQ_LEGACY) int rv = 0; console_tbl *c = Console_Port_Tbl [minor]; rtems_irq_connect_data cd = { .name = c->ulIntVector, .hdl = ns16550_isr, .handle = (void *) minor }; rv = BSP_remove_rtems_irq_handler(&cd); if (rv == 0) { /* FIXME */ printk("%s: Error: Remove interrupt handler\n", __func__); rtems_fatal_error_occurred(0xdeadbeef); } #endif } /* * ns16550_write_support_polled * * Console Termios output entry point. * */ ssize_t ns16550_write_support_polled( int minor, const char *buf, size_t len ) { int nwrite = 0; /* * poll each byte in the string out of the port. */ while (nwrite < len) { /* * transmit character */ ns16550_write_polled(minor, *buf++); nwrite++; } /* * return the number of bytes written. */ return nwrite; }
rtems_task Task2(rtems_task_argument ignored) { rtems_status_code status; rtems_id period_id; rtems_interval ticks; status = rtems_rate_monotonic_create( rtems_build_name( 'P', 'E', 'R', '2' ), &period_id ); ticks = get_ticks_for_period(50); // the punching will start with the first hole int hole_to_punch = 0; // we are about to punch holes_total_count holes int holes_total_count = 4; int error = 0; int done = 0; while(1) { status = rtems_rate_monotonic_period( period_id, ticks ); if(status == RTEMS_TIMEOUT) { break; // this is the end. the system missed a deadline, which is fatal. } int state = read_punchpress_state(); if (state < STATE_INITIAL) break; switch (state) { case STATE_READY: plan_movement(hole_to_punch, holes_total_count); break; case STATE_PUNCH_READY: punch(hole_to_punch, holes_total_count); break; case STATE_PUNCHING: control_punch(&hole_to_punch); break; case STATE_RETRACT: control_retract(); break; case STATE_NAVIGATING: break; case STATE_DONE: done = 1; break; default: error = 1; break; } if ((error + done) > 0){ break; } } if (error > 0) { printf("ERROR! SOMETHING WENT WRONG (UNEXPECTED STATE OR DEADLINE MISSED) IN TASK CONTROLLING PUNCHING!\n"); exit(1); } outport_byte(OUT_PUNCH_IRQ, 0); rtems_rate_monotonic_delete(period_id); rtems_semaphore_delete(state_semaphore_id); rtems_interrupt_handler_remove(5, isr, NULL); /** * The only way to shutdown the app is to invoke exit() before deleting the "last" task. * Since it is not very nice and it is not used in example apps, just delete the task. **/ rtems_task_delete(RTEMS_SELF); }