/** * Process root hub request. * * @param instance Root hub instance * @param request Structure containing both request and response information * @return Error code */ void rh_request(rh_t *instance, usb_transfer_batch_t *request) { assert(instance); assert(request); switch (request->ep->transfer_type) { case USB_TRANSFER_CONTROL: usb_log_debug("Root hub got CONTROL packet\n"); control_request(instance, request); break; case USB_TRANSFER_INTERRUPT: usb_log_debug("Root hub got INTERRUPT packet\n"); fibril_mutex_lock(&instance->guard); assert(instance->unfinished_interrupt_transfer == NULL); const uint16_t mask = create_interrupt_mask(instance); if (mask == 0) { usb_log_debug("No changes(%hx)...\n", mask); instance->unfinished_interrupt_transfer = request; } else { usb_log_debug("Processing changes...\n"); interrupt_request( request, mask, instance->interrupt_mask_size); } fibril_mutex_unlock(&instance->guard); break; default: usb_log_error("Root hub got unsupported request.\n"); TRANSFER_END(request, ENOTSUP); } }
void serial_write_ctrl(uint8_t value8) { if ( (value8 & 0x80) == 0x80 && (value8 & 0x01) == 0x01 ) { /* no data */ serial.data = 0xFF; serial.ctrl = (value8 & ~0x80); interrupt_request(INTERRUPT_SERIAL); } }
/** * Process interrupt on a hub device. * * If there is no pending interrupt transfer, nothing happens. * @param instance */ void rh_interrupt(rh_t *instance) { assert(instance); fibril_mutex_lock(&instance->guard); if (instance->unfinished_interrupt_transfer) { usb_log_debug("Finalizing interrupt transfer\n"); const uint16_t mask = create_interrupt_mask(instance); interrupt_request(instance->unfinished_interrupt_transfer, mask, instance->interrupt_mask_size); instance->unfinished_interrupt_transfer = NULL; } fibril_mutex_unlock(&instance->guard); }
hvmm_status_t hvmm_tests_gic_timer(void) { /* Testing Non-secure Physical Timer Event * (PPI2, Interrupt ID:30), Cortex-A15 * - Periodically triggers timer interrupt * - switches guest context at every timer interrupt */ HVMM_TRACE_ENTER(); /* handler */ interrupt_request(30, &interrupt_nsptimer); /* configure and enable interrupt */ interrupt_host_configure(30); /* start timer */ test_start_timer(); HVMM_TRACE_EXIT(); return HVMM_STATUS_SUCCESS; }
void timer_update(uint32_t cycles) { if ( (timer.control & TIMER_RUN) == 0 ) { timer.cycles = 0; return; } timer.cycles += cycles; while ( timer.cycles >= timer_cycles[timer.control & TIMER_CLOCK] ) { timer.counter++; if ( timer.counter == 0 ) { timer.counter = timer.modulo; interrupt_request(INTERRUPT_TIMER); } timer.cycles -= timer_cycles[timer.control & TIMER_CLOCK]; } }