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; }
// 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); }
// 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); }
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; }