static int samsung_defterm_getc(u8 *ch) { if (!samsung_lowlevel_can_getc(samsung_defterm_base)) { return VMM_EFAIL; } *ch = samsung_lowlevel_getc(samsung_defterm_base); return VMM_OK; }
static vmm_irq_return_t samsung_irq_handler(int irq_no, void *dev) { u16 data; struct samsung_port *port = (struct samsung_port *)dev; /* Get masked interrupt status */ data = vmm_in_le16((void *)(port->base + S3C64XX_UINTP)); /* handle RX FIFO not empty */ if (data & S3C64XX_UINTM_RXD_MSK) { /* Mask RX interrupts till RX FIFO is empty */ while (samsung_lowlevel_can_getc(port->base)) { u8 ch = samsung_lowlevel_getc(port->base); serial_rx(port->p, &ch, 1); } } /* Clear all interrupts */ vmm_out_le16((void *)(port->base + S3C64XX_UINTP), data); return VMM_IRQ_HANDLED; }