Ejemplo n.º 1
0
static u32 imx_read(struct vmm_chardev *cdev,
		    u8 *dest, size_t len, off_t __unused *off, bool sleep)
{
	u32 i;
	struct imx_port *port;

	if (!(cdev && dest && cdev->priv)) {
		return 0;
	}

	port = cdev->priv;

	if (sleep) {
		for (i = 0; i < len; i++) {
			dest[i] = imx_getc_sleepable(port);
		}
	} else {
		for (i = 0; i < len; i++) {
			if (!imx_lowlevel_can_getc(port->base)) {
				break;
			}
			dest[i] = imx_lowlevel_getc(port->base);
		}
	}

	return i;
}
Ejemplo n.º 2
0
static void imx_rxint(struct imx_port *port)
{
	while (imx_lowlevel_can_getc(port->base)) {
		u8 ch = imx_lowlevel_getc(port->base);
		serial_rx(port->p, &ch, 1);
	}
}
Ejemplo n.º 3
0
static int imx_defterm_getc(u8 *ch)
{
	if (!imx_lowlevel_can_getc(imx_defterm_base)) {
		return VMM_EFAIL;
	}
	*ch = imx_lowlevel_getc(imx_defterm_base);
	return VMM_OK;
}
Ejemplo n.º 4
0
static u8 imx_getc_sleepable(struct imx_port *port)
{
	/* Wait until there is data in the FIFO */
	while (!imx_lowlevel_can_getc(port->base)) {
		/* Enable the RX interrupt */
		port->mask |= UCR1_RRDYEN;
		vmm_writel(port->mask, (void *)port->base + UCR1);
		/* Wait for completion */
		vmm_completion_wait(&port->read_possible);
	}

	/* Read data to destination */
	return imx_lowlevel_getc(port->base);
}