Пример #1
0
static enum uart yam_check_uart(unsigned int iobase)
{
	unsigned char b1, b2, b3;
	enum uart u;
	enum uart uart_tab[] =
	{c_uart_16450, c_uart_unknown, c_uart_16550, c_uart_16550A};

	b1 = inb(MCR(iobase));
	outb(b1 | 0x10, MCR(iobase));	/* loopback mode */
	b2 = inb(MSR(iobase));
	outb(0x1a, MCR(iobase));
	b3 = inb(MSR(iobase)) & 0xf0;
	outb(b1, MCR(iobase));		/* restore old values */
	outb(b2, MSR(iobase));
	if (b3 != 0x90)
		return c_uart_unknown;
	inb(RBR(iobase));
	inb(RBR(iobase));
	outb(0x01, FCR(iobase));	/* enable FIFOs */
	u = uart_tab[(inb(IIR(iobase)) >> 6) & 3];
	if (u == c_uart_16450) {
		outb(0x5a, SCR(iobase));
		b1 = inb(SCR(iobase));
		outb(0xa5, SCR(iobase));
		b2 = inb(SCR(iobase));
		if ((b1 != 0x5a) || (b2 != 0xa5))
			u = c_uart_8250;
	}
	return u;
}
void serial_setbrg (void)
{
	unsigned int quot = 0;
	int uart = CONFIG_SYS_IXP425_CONSOLE;

	if ((gd->baudrate <= SERIAL_CLOCK) && (SERIAL_CLOCK % gd->baudrate == 0))
		quot = SERIAL_CLOCK / gd->baudrate;
	else
		hang ();

	IER(uart) = 0;					/* Disable for now */
	FCR(uart) = 0;					/* No fifos enabled */

	/* set baud rate */
	LCR(uart) = LCR_WLS0 | LCR_WLS1 | LCR_DLAB;
	DLL(uart) = quot & 0xff;
	DLH(uart) = quot >> 8;
	LCR(uart) = LCR_WLS0 | LCR_WLS1;
#ifdef CONFIG_SERIAL_RTS_ACTIVE
	MCR(uart) = MCR_RTS;				/* set RTS active */
#else
	MCR(uart) = 0;					/* set RTS inactive */
#endif
	IER(uart) = IER_UUE;
}
Пример #3
0
static int do_requests(int baseport, int irq, int index, int minor)
{
	int err;

	atomic_set(&uart[index].read_ready, 0);
	atomic_set(&uart[index].write_ready, 0);
	uart[index].read = 0;
	uart[index].write = 0;
	uart[index].base_port = baseport;
	cdev_init(&uart[index].cdev, &serial_fops);
	init_waitqueue_head(&uart[index].wq_reads);
	init_waitqueue_head(&uart[index].wq_writes);

	if ((err = cdev_add(&uart[index].cdev, MKDEV(major, minor), 1)))
	{
		//printk(LOG_LEVEL "cdev_init %d failed", minor);
		return err;
	}

	if (request_region(baseport, COM_PORTS, MODULE_NAME) == NULL)
	{
		//printk(LOG_LEVEL "request_region failed for COM1");
		return -EINVAL;
	}

	err = request_irq(irq, serial_interrupt_handle, IRQF_SHARED, MODULE_NAME,
			&uart[index]);
	if (err)
	{
		//printk(LOG_LEVEL "ERROR: %s: error %d\n", "request_irq", err);
		return err;
	}

	// Enable FIFO cu 14 octeti
	outb(0xc7, FCR(baseport));

	// Enable interrupts
	outb(0x08, MCR(baseport));
	outb(0x01, IER(baseport));

	//printk(LOG_LEVEL "index %d, baseport %d, irq %d, minor %d", index, baseport, irq, minor);

	return 0;
}
Пример #4
0
static void yam_set_uart(struct net_device *dev)
{
	struct yam_port *yp = netdev_priv(dev);
	int divisor = 115200 / yp->baudrate;

	outb(0, IER(dev->base_addr));
	outb(LCR_DLAB | LCR_BIT8, LCR(dev->base_addr));
	outb(divisor, DLL(dev->base_addr));
	outb(0, DLM(dev->base_addr));
	outb(LCR_BIT8, LCR(dev->base_addr));
	outb(PTT_OFF, MCR(dev->base_addr));
	outb(0x00, FCR(dev->base_addr));

	/* Flush pending irq */

	inb(RBR(dev->base_addr));
	inb(MSR(dev->base_addr));

	/* Enable rx irq */

	outb(ENABLE_RTXINT, IER(dev->base_addr));
}