Beispiel #1
0
static int Revo51_GetDataBit(struct CardData *card, int ack)
{
	int bit;
	
	if (ack)
		MicroDelay(5);
	
    // get data bit from the GPIO pines
    card->gpio_dir &= ~REVO51_I2C_DATA;
    SetGPIODir(card->pci_dev, card, card->gpio_dir);
    bit = GetGPIOData(card->pci_dev, card->iobase) & REVO51_I2C_DATA ? 1 : 0;
	
	return bit;
}
Beispiel #2
0
// Write data to the SDA line and clock to the SCL
static void Revo51_Write_CLK_SDA(struct CardData *card, int clk, int data)
{
	unsigned int val = 0, mask = REVO51_I2C_CLOCK | REVO51_I2C_DATA;;
	
	if (clk)
		val |= REVO51_I2C_CLOCK;
	if (data)
		val |= REVO51_I2C_DATA;
	
    card->gpio_dir |= mask;
	SetGPIODir(card->pci_dev, card, card->gpio_dir);
    SetGPIOMask(card->pci_dev, card->iobase, ~mask);
	SetGPIOData(card->pci_dev, card->iobase, mask & val);
	
	MicroDelay(5);
}
Beispiel #3
0
// Set the direction of the CLK and SDA lines:
// For sending, use 1, 1
static void  Revo51_SetDir_CLK_SDA(struct CardData *card, int clock, int data)
{
	unsigned int mask = 0, val;
	
    val = 0;
	if (clock)
		val = REVO51_I2C_CLOCK; /* write SCL */
	if (data)
		val |= REVO51_I2C_DATA; /* write SDA */
	
	mask = REVO51_I2C_CLOCK | REVO51_I2C_DATA;
	card->gpio_dir &= ~mask;
	card->gpio_dir |= val;
	SetGPIODir(card->pci_dev, card, card->gpio_dir);
	SetGPIOMask(card->pci_dev, card->iobase, ~mask);
	
}
Beispiel #4
0
static void ak4396_write(struct CardData *card, unsigned int reg,
			 unsigned int data)
{
	unsigned int block;

    SaveGPIO(card->pci_dev, card);
	SetGPIODir(card->pci_dev, card, AK4396_CSN|AK4396_CCLK|AK4396_CDTI);
	SetGPIOMask(card->pci_dev, card->iobase, ~(AK4396_CSN|AK4396_CCLK|AK4396_CDTI));
	/* latch must be low when writing */
	SetGPIOBits(card, AK4396_CSN, 0); 
	block =  ((AK4396_ADDR & 0x03) << 14) | (1 << 13) |
			((reg & 0x1f) << 8) | (data & 0xff);
	ak4396_write_word(card, block); /* REGISTER ADDRESS */
	/* release latch */
	SetGPIOBits(card, AK4396_CSN, 1);
	MicroDelay(1);
	/* restore */
    RestoreGPIO(card->pci_dev, card);
}
static int __init
rs_cnxt_init(void)
{
	int flags;
	struct cnxt_serial *info;
		
	/* Setup base handler, and timer table. */
	init_bh(SERIAL_BH, do_serial_bh);
	
	/* Initialize the tty_driver structure */
	
	memset(&serial_driver, 0, sizeof(struct tty_driver));
	serial_driver.magic = TTY_DRIVER_MAGIC;
	serial_driver.name = "ttyS";
	serial_driver.major = TTY_MAJOR;
	serial_driver.minor_start = 64;
	serial_driver.num = 1;
	serial_driver.type = TTY_DRIVER_TYPE_SERIAL;
	serial_driver.subtype = SERIAL_TYPE_NORMAL;
	serial_driver.init_termios = tty_std_termios;
	serial_driver.init_termios.c_cflag = 
			B57600 | CS8 | CREAD | HUPCL | CLOCAL;
	serial_driver.flags = TTY_DRIVER_REAL_RAW;
	serial_driver.refcount = &serial_refcount;
	serial_driver.table = serial_table;
	serial_driver.termios = serial_termios;
	serial_driver.termios_locked = serial_termios_locked;

	serial_driver.open = rs_open;
	serial_driver.close = rs_close;
	serial_driver.write = rs_write;
	serial_driver.put_char = rs_put_char;
	serial_driver.flush_chars = rs_flush_chars;
	serial_driver.write_room = rs_write_room;
	serial_driver.chars_in_buffer = rs_chars_in_buffer;
	serial_driver.flush_buffer = rs_flush_buffer;
	serial_driver.ioctl = rs_ioctl;
	serial_driver.throttle = rs_throttle;
	serial_driver.unthrottle = rs_unthrottle;
	serial_driver.set_termios = rs_set_termios;
	serial_driver.stop = rs_stop;
	serial_driver.start = rs_start;
	serial_driver.hangup = rs_hangup;
	serial_driver.set_ldisc = rs_set_ldisc;

	/*
	 * The callout device is just like normal device except for
	 * major number and the subtype code.
	 */
	callout_driver = serial_driver;
	callout_driver.name = "cua";
	callout_driver.major = TTYAUX_MAJOR;
	callout_driver.subtype = SERIAL_TYPE_CALLOUT;

	if (tty_register_driver(&serial_driver))
		panic("Couldn't register serial driver\n");
	if (tty_register_driver(&callout_driver))
		panic("Couldn't register callout driver\n");
	
	save_flags(flags); cli();


	info = &uart_info;
	info->magic = SERIAL_MAGIC;
	info->uart = (struct uart_regs*)UART0_Base_Addr;
	info->port = UART0_Base_Addr;
	info->tty = 0;
	info->irq = CNXT_INT_LVL_GPIO;
	info->custom_divisor = 16;
	info->close_delay = 50;
	info->closing_wait = 3000;
	info->x_char = 0;
	info->event = 0;
	info->count = 0;
	info->blocked_open = 0;
	info->tqueue.routine = do_softint;
	info->tqueue.data = info;
	info->tqueue_hangup.routine = do_serial_hangup;
	info->tqueue_hangup.data = info;
	info->callout_termios =callout_driver.init_termios;
	info->normal_termios = serial_driver.init_termios;
	init_waitqueue_head(&info->open_wait);
	init_waitqueue_head(&info->close_wait);
	info->line = 0;
	info->is_cons = 1; /* Means shortcuts work */

	printk("%s%d at 0x%08x (irq = %d)", serial_driver.name, info->line, 
	       info->port, info->irq);
       printk(" is a 16c550 UART\n");
       printk("info = %08x\n",info);
       
#if DEBUG_CONSOLE_ON_UART_2
	SetGPIOIntEnable( GPIO25, IRQ_OFF );
	SetGPIOInputEnable( GPIO25, GP_INPUTOFF );
#endif

	SetGPIOIntEnable(GPIOINT_UART1, IRQ_OFF);
	SetGPIODir( GPIOINT_UART1, GP_INPUT );
	SetGPIOIntPolarity (GPIOINT_UART1, GP_IRQ_POL_POSITIVE);
	SetGPIOInputEnable( GPIOINT_UART1, GP_INPUTON );

	GPIO_SetGPIOIRQRoutine(GPIOINT_UART1, GPIOB25_Handler);
	SetGPIOIntEnable(GPIOINT_UART1, IRQ_ON);
	
	restore_flags(flags);

	return 0;
}