Esempio n. 1
0
static int cuda_init(void)
{
	if (sysinfo_get_value("cuda.address.physical", &(instance->cuda_physical)) != EOK)
		return -1;
	
	void *vaddr;
	if (pio_enable((void *) instance->cuda_physical, sizeof(cuda_t), &vaddr) != 0)
		return -1;
	
	dev = vaddr;

	instance->cuda = dev;
	instance->xstate = cx_listen;
	instance->bidx = 0;
	instance->snd_bytes = 0;

	fibril_mutex_initialize(&instance->dev_lock);

	/* Disable all interrupts from CUDA. */
	pio_write_8(&dev->ier, IER_CLR | ALL_INT);

	cuda_irq_code.ranges[0].base = (uintptr_t) instance->cuda_physical;
	cuda_irq_code.cmds[0].addr = (void *) &((cuda_t *) instance->cuda_physical)->ifr;
	async_set_interrupt_received(cuda_irq_handler);
	irq_register(10, device_assign_devno(), 0, &cuda_irq_code);

	/* Enable SR interrupt. */
	pio_write_8(&dev->ier, TIP | TREQ);
	pio_write_8(&dev->ier, IER_SET | SR_INT);

	/* Enable ADB autopolling. */
	cuda_autopoll_set(true);

	return 0;
}
Esempio n. 2
0
cuda_instance_t *cuda_init(cuda_t *dev, inr_t inr, cir_t cir, void *cir_arg)
{
	cuda_instance_t *instance
	    = malloc(sizeof(cuda_instance_t), FRAME_ATOMIC);
	if (instance) {
		instance->cuda = dev;
		instance->kbrdin = NULL;
		instance->xstate = cx_listen;
		instance->bidx = 0;
		instance->snd_bytes = 0;

		spinlock_initialize(&instance->dev_lock, "cuda.instance.dev_lock");

		/* Disable all interrupts from CUDA. */
		pio_write_8(&dev->ier, IER_CLR | ALL_INT);

		irq_initialize(&instance->irq);
		instance->irq.devno = device_assign_devno();
		instance->irq.inr = inr;
		instance->irq.claim = cuda_claim;
		instance->irq.handler = cuda_irq_handler;
		instance->irq.instance = instance;
		instance->irq.cir = cir;
		instance->irq.cir_arg = cir_arg;
		instance->irq.preack = true;
	}
	
	return instance;
}
Esempio n. 3
0
/** Initializes and registers timer interrupt handler. */
static void icp_timer_irq_init(void)
{
	irq_initialize(&icp.timer_irq);
	icp.timer_irq.devno = device_assign_devno();
	icp.timer_irq.inr = ICP_TIMER_IRQ;
	icp.timer_irq.claim = icp_timer_claim;
	icp.timer_irq.handler = icp_timer_irq_handler;

	irq_register(&icp.timer_irq);
}
Esempio n. 4
0
static void raspberrypi_timer_irq_start(void)
{
	/* Initialize timer IRQ */
	static irq_t timer_irq;
	irq_initialize(&timer_irq);
	timer_irq.devno = device_assign_devno();
	timer_irq.inr = BCM2835_TIMER1_IRQ;
	timer_irq.claim = raspberrypi_timer_irq_claim;
	timer_irq.handler = raspberrypi_timer_irq_handler;
	irq_register(&timer_irq);

	bcm2835_irc_enable(raspi.irc, BCM2835_TIMER1_IRQ);
	bcm2835_timer_start(raspi.timer);
}
Esempio n. 5
0
/** Initialize ns16550.
 *
 * @param dev      Addrress of the beginning of the device in I/O space.
 * @param inr      Interrupt number.
 * @param cir      Clear interrupt function.
 * @param cir_arg  First argument to cir.
 * @param output   Where to store pointer to the output device
 *                 or NULL if the caller is not interested in
 *                 writing to the serial port.
 *
 * @return Keyboard instance or NULL on failure.
 *
 */
ns16550_instance_t *ns16550_init(ns16550_t *dev, inr_t inr, cir_t cir,
    void *cir_arg, outdev_t **output)
{
	ns16550_instance_t *instance
	    = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC);
	if (instance) {
		instance->ns16550 = dev;
		instance->input = NULL;
		instance->output = NULL;
		
		if (output) {
			instance->output = malloc(sizeof(outdev_t),
			    FRAME_ATOMIC);
			if (!instance->output) {
				free(instance);
				return NULL;
			}
			
			outdev_initialize("ns16550", instance->output,
			    &ns16550_ops);
			instance->output->data = instance;
			*output = instance->output;
		}
		
		irq_initialize(&instance->irq);
		instance->irq.devno = device_assign_devno();
		instance->irq.inr = inr;
		instance->irq.claim = ns16550_claim;
		instance->irq.handler = ns16550_irq_handler;
		instance->irq.instance = instance;
		instance->irq.cir = cir;
		instance->irq.cir_arg = cir_arg;
		
		instance->parea.pbase = (uintptr_t) dev;
		instance->parea.frames = 1;
		instance->parea.unpriv = false;
		instance->parea.mapped = false;
		ddi_parea_register(&instance->parea);
	}
	
	return instance;
}