/** RAM disk initialization routine * * The information about the RAM disk is provided as sysinfo * values to the uspace tasks. * */ void init_rd(void *data, size_t size) { uintptr_t base = (uintptr_t) data; ASSERT((base % FRAME_SIZE) == 0); rd_parea.pbase = base; rd_parea.frames = SIZE2FRAMES(size); rd_parea.unpriv = false; rd_parea.mapped = false; ddi_parea_register(&rd_parea); sysinfo_set_item_val("rd", NULL, true); sysinfo_set_item_val("rd.size", NULL, size); sysinfo_set_item_val("rd.address.physical", NULL, (sysarg_t) base); printf("RAM disk at %p (size %zu bytes)\n", (void *) base, size); }
/** 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; }