Exemplo n.º 1
0
/**
 * 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);
	}
}
Exemplo n.º 2
0
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);
	}
}
Exemplo n.º 3
0
/**
 * 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);
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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];
	}
}