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; }
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; }
/** 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); }
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); }
/** 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; }