static int packet_tx(serioStuff *s, void *p, size_t size, int timeout) { if(!flags.hanmode){ return serio_write(s, p, size, timeout); } else{ int res; int xfrcount; static u8 ctrlchars[3] = {SUBST,STX,ETX}; res = serio_write(s, ctrlchars + 1, 1, timeout); for(xfrcount = 0; (res == 1) && (xfrcount < size); xfrcount++){ if(((u8 *)p)[xfrcount] <= SUBST){ res = serio_write(s, ctrlchars, 1, timeout); /* Write SUBST */ } if(res == 1){ res = serio_write(s, ((u8 *) p) + xfrcount, 1, timeout); } } if(res == 1){ res = serio_write(s, ctrlchars + 2, 1, timeout); } return (res < 0) ? res : xfrcount; } }
static int sunkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { struct sunkbd *sunkbd = input_get_drvdata(dev); switch (type) { case EV_LED: serio_write(sunkbd->serio, SUNKBD_CMD_SETLED); serio_write(sunkbd->serio, (!!test_bit(LED_CAPSL, dev->led) << 3) | (!!test_bit(LED_SCROLLL, dev->led) << 2) | (!!test_bit(LED_COMPOSE, dev->led) << 1) | !!test_bit(LED_NUML, dev->led)); return 0; case EV_SND: switch (code) { case SND_CLICK: serio_write(sunkbd->serio, SUNKBD_CMD_NOCLICK - value); return 0; case SND_BELL: serio_write(sunkbd->serio, SUNKBD_CMD_BELLOFF - value); return 0; } break; } return -1; }
/* * h3600_flite_power: enables or disables power to frontlight, using last bright */ unsigned int h3600_flite_power(struct input_dev *dev, enum flite_pwr pwr) { unsigned char brightness = (pwr == FLITE_PWR_OFF) ? 0 : flite_brightness; struct h3600_dev *ts = input_get_drvdata(dev); /* Must be in this order */ serio_write(ts->serio, 1); serio_write(ts->serio, pwr); serio_write(ts->serio, brightness); return 0; }
static int rain_send(struct rain *rain, const char *command) { int err = serio_write(rain->serio, '!'); dev_dbg(rain->dev, "send: %s\n", command); while (!err && *command) err = serio_write(rain->serio, *command++); if (!err) err = serio_write(rain->serio, '~'); return err; }
/* * lkkbd_event() handles events from the input module. */ static int lkkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { struct lkkbd *lk = input_get_drvdata(dev); switch (type) { case EV_LED: lkkbd_toggle_leds(lk); return 0; case EV_SND: switch (code) { case SND_CLICK: lkkbd_toggle_keyclick(lk, value); return 0; case SND_BELL: if (value != 0) serio_write(lk->serio, LK_CMD_SOUND_BELL); return 0; } break; default: printk(KERN_ERR "%s(): Got unknown type %d, code %d, value %d\n", __func__, type, code, value); } return -1; }
static irqreturn_t taos_interrupt(struct serio *serio, unsigned char data, unsigned int flags) { struct taos_data *taos = serio_get_drvdata(serio); switch (taos->state) { case TAOS_STATE_INIT: taos->buffer[taos->pos++] = data; if (data == ':' || taos->pos == TAOS_BUFFER_SIZE - 1) { taos->buffer[taos->pos] = '\0'; taos->state = TAOS_STATE_IDLE; wake_up_interruptible(&wq); } break; case TAOS_STATE_SEND: if (taos->buffer[++taos->pos]) serio_write(serio, taos->buffer[taos->pos]); else { taos->state = TAOS_STATE_IDLE; wake_up_interruptible(&wq); } break; case TAOS_STATE_RECV: taos->buffer[taos->pos++] = data; if (data == ']') { taos->buffer[taos->pos] = '\0'; taos->state = TAOS_STATE_IDLE; wake_up_interruptible(&wq); } break; } return IRQ_HANDLED; }
ser_result_t ser_put(ser_t *ser, void *buf, size_t len) { ser_hdr_t hdr; serio_res_t err; if (!ser) { DPRINT(("ser_put: null ser\n")); return ser_RES_BUG; } if (!buf) { DPRINT(("ser_put: null buf\n")); return ser_RES_BAD; } if (len > 255) return ser_RES_FULL; hdr.frame0 = ser_HDR_FRAME0; hdr.frame1 = ser_HDR_FRAME1; hdr.bodylen = len; hdr.hchksum = (ser_HDR_FRAME0 + ser_HDR_FRAME1 + len) & 0xff; hdr.bodycrc = crc(buf, len); err = serio_write(&ser->serio, &hdr, sizeof(hdr)); if (err != serio_RES_OK) { DPRINT(("ser_put: serio_write header failed %d\n", err)); return CONVERT_ERR(err); } /* printbytes((void *)(&hdr), "ser_put:hdr:", sizeof(hdr)); */ err = serio_write(&ser->serio, buf, len); if (err != serio_RES_OK) { DPRINT(("ser_put: serio_write body failed %d\n", err)); return CONVERT_ERR(err); } /* printbytes(buf, "ser_put:buf:", len); */ DPRINT(("ser_put: bodycrc %4x, len %d, first 2 bytes %02x %02x, last 5 bytes %02x %02x %02x %02x %02x\n", hdr.bodycrc, hdr.bodylen, ((unsigned char *)buf)[0], ((unsigned char *)buf)[1], ((unsigned char *)buf)[len-5], ((unsigned char *)buf)[len-4], ((unsigned char *)buf)[len-3], ((unsigned char *)buf)[len-2], ((unsigned char *)buf)[len-1])); return ser_RES_OK; }
static int vsxxxaa_connect (struct serio *serio, struct serio_driver *drv) { struct vsxxxaa *mouse; struct input_dev *input_dev; int err = -ENOMEM; mouse = kzalloc (sizeof (struct vsxxxaa), GFP_KERNEL); input_dev = input_allocate_device (); if (!mouse || !input_dev) goto fail1; mouse->dev = input_dev; mouse->serio = serio; strlcat (mouse->name, "DEC VSXXX-AA/-GA mouse or VSXXX-AB digitizer", sizeof (mouse->name)); snprintf (mouse->phys, sizeof (mouse->phys), "%s/input0", serio->phys); input_dev->name = mouse->name; input_dev->phys = mouse->phys; input_dev->id.bustype = BUS_RS232; input_dev->dev.parent = &serio->dev; set_bit (EV_KEY, input_dev->evbit); /* We have buttons */ set_bit (EV_REL, input_dev->evbit); set_bit (EV_ABS, input_dev->evbit); set_bit (BTN_LEFT, input_dev->keybit); /* We have 3 buttons */ set_bit (BTN_MIDDLE, input_dev->keybit); set_bit (BTN_RIGHT, input_dev->keybit); set_bit (BTN_TOUCH, input_dev->keybit); /* ...and Tablet */ set_bit (REL_X, input_dev->relbit); set_bit (REL_Y, input_dev->relbit); input_set_abs_params (input_dev, ABS_X, 0, 1023, 0, 0); input_set_abs_params (input_dev, ABS_Y, 0, 1023, 0, 0); serio_set_drvdata (serio, mouse); err = serio_open (serio, drv); if (err) goto fail2; /* * Request selftest. Standard packet format and differential * mode will be requested after the device ID'ed successfully. */ serio_write (serio, 'T'); /* Test */ err = input_register_device (input_dev); if (err) goto fail3; return 0; fail3: serio_close (serio); fail2: serio_set_drvdata (serio, NULL); fail1: input_free_device (input_dev); kfree (mouse); return err; }
static void sunkbd_reinit(struct work_struct *work) { struct sunkbd *sunkbd = container_of(work, struct sunkbd, tq); wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ); serio_write(sunkbd->serio, SUNKBD_CMD_SETLED); serio_write(sunkbd->serio, (!!test_bit(LED_CAPSL, sunkbd->dev->led) << 3) | (!!test_bit(LED_SCROLLL, sunkbd->dev->led) << 2) | (!!test_bit(LED_COMPOSE, sunkbd->dev->led) << 1) | !!test_bit(LED_NUML, sunkbd->dev->led)); serio_write(sunkbd->serio, SUNKBD_CMD_NOCLICK - !!test_bit(SND_CLICK, sunkbd->dev->snd)); serio_write(sunkbd->serio, SUNKBD_CMD_BELLOFF - !!test_bit(SND_BELL, sunkbd->dev->snd)); }
void iforce_serial_xmit(struct iforce *iforce) { unsigned char cs; int i; unsigned long flags; if (test_and_set_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags)) { set_bit(IFORCE_XMIT_AGAIN, iforce->xmit_flags); return; } spin_lock_irqsave(&iforce->xmit_lock, flags); again: if (iforce->xmit.head == iforce->xmit.tail) { clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); spin_unlock_irqrestore(&iforce->xmit_lock, flags); return; } cs = 0x2b; serio_write(iforce->serio, 0x2b); serio_write(iforce->serio, iforce->xmit.buf[iforce->xmit.tail]); cs ^= iforce->xmit.buf[iforce->xmit.tail]; XMIT_INC(iforce->xmit.tail, 1); for (i=iforce->xmit.buf[iforce->xmit.tail]; i >= 0; --i) { serio_write(iforce->serio, iforce->xmit.buf[iforce->xmit.tail]); cs ^= iforce->xmit.buf[iforce->xmit.tail]; XMIT_INC(iforce->xmit.tail, 1); } serio_write(iforce->serio, cs); if (test_and_clear_bit(IFORCE_XMIT_AGAIN, iforce->xmit_flags)) goto again; clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); spin_unlock_irqrestore(&iforce->xmit_lock, flags); }
static void lkkbd_toggle_leds(struct lkkbd *lk) { struct serio *serio = lk->serio; unsigned char leds_on = 0; unsigned char leds_off = 0; CHECK_LED(lk, leds_on, leds_off, LED_CAPSL, LK_LED_SHIFTLOCK); CHECK_LED(lk, leds_on, leds_off, LED_COMPOSE, LK_LED_COMPOSE); CHECK_LED(lk, leds_on, leds_off, LED_SCROLLL, LK_LED_SCROLLLOCK); CHECK_LED(lk, leds_on, leds_off, LED_SLEEP, LK_LED_WAIT); if (leds_on != 0) { serio_write(serio, LK_CMD_LED_ON); serio_write(serio, leds_on); } if (leds_off != 0) { serio_write(serio, LK_CMD_LED_OFF); serio_write(serio, leds_off); } }
static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) { struct atkbd *atkbd = serio->private; unsigned int code = data; int scroll = 0, click = -1; int value; #ifdef ATKBD_DEBUG printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags); #endif #if !defined(__i386__) && !defined (__x86_64__) if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) { printk(KERN_WARNING "atkbd.c: frame/parity error: %02x\n", flags); serio_write(serio, ATKBD_CMD_RESEND); atkbd->resend = 1; goto out; } if (!flags && data == ATKBD_RET_ACK) atkbd->resend = 0; #endif if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK)) if (ps2_handle_ack(&atkbd->ps2dev, data)) goto out; if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_CMD)) if (ps2_handle_response(&atkbd->ps2dev, data)) goto out; if (!atkbd->enabled) goto out; input_event(&atkbd->dev, EV_MSC, MSC_RAW, code); if (atkbd->translated) { if (atkbd->emul || !(code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1 || code == ATKBD_RET_HANGUEL || code == ATKBD_RET_HANJA || code == ATKBD_RET_ERR || (code == ATKBD_RET_BAT && !atkbd->bat_xl))) { atkbd->release = code >> 7; code &= 0x7f; } if (!atkbd->emul && (code & 0x7f) == (ATKBD_RET_BAT & 0x7f)) atkbd->bat_xl = !atkbd->release; }
static int sunkbd_initialize(struct sunkbd *sunkbd) { sunkbd->reset = -2; serio_write(sunkbd->serio, SUNKBD_CMD_RESET); wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ); if (sunkbd->reset < 0) return -1; sunkbd->type = sunkbd->reset; if (sunkbd->type == 4) { /* Type 4 keyboard */ sunkbd->layout = -2; serio_write(sunkbd->serio, SUNKBD_CMD_LAYOUT); wait_event_interruptible_timeout(sunkbd->wait, sunkbd->layout >= 0, HZ / 4); if (sunkbd->layout < 0) return -1; if (sunkbd->layout & SUNKBD_LAYOUT_5_MASK) sunkbd->type = 5; } return 0; }
static int elo_command_10(struct elo *elo, unsigned char *packet) { int rc = -1; int i; unsigned char csum = 0xaa + ELO10_LEAD_BYTE; mutex_lock(&elo->cmd_mutex); serio_pause_rx(elo->serio); elo->expected_packet = toupper(packet[0]); init_completion(&elo->cmd_done); serio_continue_rx(elo->serio); if (serio_write(elo->serio, ELO10_LEAD_BYTE)) goto out; for (i = 0; i < ELO10_PACKET_LEN; i++) { csum += packet[i]; if (serio_write(elo->serio, packet[i])) goto out; } if (serio_write(elo->serio, csum)) goto out; wait_for_completion_timeout(&elo->cmd_done, HZ); if (elo->expected_packet == ELO10_TOUCH_PACKET) { /* We are back in reporting mode, the command was ACKed */ memcpy(packet, elo->response, ELO10_PACKET_LEN); rc = 0; } out: mutex_unlock(&elo->cmd_mutex); return rc; }
static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags) { struct atkbd *atkbd = serio_get_drvdata(serio); struct input_dev *dev = atkbd->dev; unsigned int code = data; int scroll = 0, hscroll = 0, click = -1; int value; unsigned short keycode; #ifdef ATKBD_DEBUG printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags); #endif #if !defined(__i386__) && !defined (__x86_64__) if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) { printk(KERN_WARNING "atkbd.c: frame/parity error: %02x\n", flags); serio_write(serio, ATKBD_CMD_RESEND); atkbd->resend = 1; goto out; } if (!flags && data == ATKBD_RET_ACK) atkbd->resend = 0; #endif if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK)) if (ps2_handle_ack(&atkbd->ps2dev, data)) goto out; if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_CMD)) if (ps2_handle_response(&atkbd->ps2dev, data)) goto out; if (!atkbd->enabled) goto out; input_event(dev, EV_MSC, MSC_RAW, code); if (atkbd->translated) { if (atkbd->emul || atkbd_need_xlate(atkbd->xl_bit, code)) { atkbd->release = code >> 7; code &= 0x7f; } if (!atkbd->emul) atkbd_calculate_xl_bit(atkbd, data); }
int ps2_sendbyte(struct ps2dev *ps2dev, unsigned char byte, int timeout) { serio_pause_rx(ps2dev->serio); ps2dev->nak = 1; ps2dev->flags |= PS2_FLAG_ACK; serio_continue_rx(ps2dev->serio); if (serio_write(ps2dev->serio, byte) == 0) wait_event_timeout(ps2dev->wait, !(ps2dev->flags & PS2_FLAG_ACK), msecs_to_jiffies(timeout)); serio_pause_rx(ps2dev->serio); ps2dev->flags &= ~PS2_FLAG_ACK; serio_continue_rx(ps2dev->serio); return -ps2dev->nak; }
static void lkkbd_toggle_keyclick(struct lkkbd *lk, bool on) { struct serio *serio = lk->serio; if (on) { DBG("%s: Activating key clicks\n", __func__); serio_write(serio, LK_CMD_ENABLE_KEYCLICK); serio_write(serio, volume_to_hw(lk->keyclick_volume)); serio_write(serio, LK_CMD_ENABLE_CTRCLICK); serio_write(serio, volume_to_hw(lk->ctrlclick_volume)); } else { DBG("%s: Deactivating key clicks\n", __func__); serio_write(serio, LK_CMD_DISABLE_KEYCLICK); serio_write(serio, LK_CMD_DISABLE_CTRCLICK); } }
/* * lkkbd_reinit() sets leds and beeps to a state the computer remembers they * were in. */ static void lkkbd_reinit(struct work_struct *work) { struct lkkbd *lk = container_of(work, struct lkkbd, tq); int division; /* Ask for ID */ serio_write(lk->serio, LK_CMD_REQUEST_ID); /* Reset parameters */ serio_write(lk->serio, LK_CMD_SET_DEFAULTS); /* Set LEDs */ lkkbd_toggle_leds(lk); /* * Try to activate extended LK401 mode. This command will * only work with a LK401 keyboard and grants access to * LAlt, RAlt, RCompose and RShift. */ serio_write(lk->serio, LK_CMD_ENABLE_LK401); /* Set all keys to UPDOWN mode */ for (division = 1; division <= 14; division++) serio_write(lk->serio, LK_CMD_SET_MODE(LK_MODE_UPDOWN, division)); /* Enable bell and set volume */ serio_write(lk->serio, LK_CMD_ENABLE_BELL); serio_write(lk->serio, volume_to_hw(lk->bell_volume)); /* Enable/disable keyclick (and possibly set volume) */ lkkbd_toggle_keyclick(lk, test_bit(SND_CLICK, lk->dev->snd)); /* Sound the bell if needed */ if (test_bit(SND_BELL, lk->dev->snd)) serio_write(lk->serio, LK_CMD_SOUND_BELL); }
static int taos_connect(struct serio *serio, struct serio_driver *drv) { struct taos_data *taos; struct i2c_adapter *adapter; char *name; int err; taos = kzalloc(sizeof(struct taos_data), GFP_KERNEL); if (!taos) { err = -ENOMEM; goto exit; } taos->state = TAOS_STATE_INIT; serio_set_drvdata(serio, taos); err = serio_open(serio, drv); if (err) goto exit_kfree; adapter = &taos->adapter; adapter->owner = THIS_MODULE; adapter->algo = &taos_algorithm; adapter->algo_data = serio; adapter->dev.parent = &serio->dev; /* Reset the TAOS evaluation module to identify it */ serio_write(serio, TAOS_CMD_RESET); wait_event_interruptible_timeout(wq, taos->state == TAOS_STATE_IDLE, msecs_to_jiffies(2000)); if (taos->state != TAOS_STATE_IDLE) { err = -ENODEV; dev_dbg(&serio->dev, "TAOS EVM reset failed (state=%d, " "pos=%d)\n", taos->state, taos->pos); goto exit_close; } name = taos_adapter_name(taos->buffer); if (!name) { err = -ENODEV; dev_err(&serio->dev, "TAOS EVM identification failed\n"); goto exit_close; } strlcpy(adapter->name, name, sizeof(adapter->name)); err = i2c_add_adapter(adapter); if (err) goto exit_close; dev_dbg(&serio->dev, "Connected to TAOS EVM\n"); taos->client = taos_instantiate_device(adapter); return 0; exit_close: serio_close(serio); exit_kfree: serio_set_drvdata(serio, NULL); kfree(taos); exit: return err; }
static void dock_keyboard_write(struct dock_keyboard_data *data, unsigned char chr) { if (data->keyboard_enable && data->serio) serio_write(data->serio, chr); }
static int hil_dev_connect(struct serio *serio, struct serio_driver *drv) { struct hil_dev *dev; struct input_dev *input_dev; uint8_t did, *idd; int error; dev = kzalloc(sizeof(*dev), GFP_KERNEL); input_dev = input_allocate_device(); if (!dev || !input_dev) { error = -ENOMEM; goto bail0; } dev->serio = serio; dev->dev = input_dev; error = serio_open(serio, drv); if (error) goto bail0; serio_set_drvdata(serio, dev); /* Get device info. MLC driver supplies devid/status/etc. */ init_completion(&dev->cmd_done); serio_write(serio, 0); serio_write(serio, 0); serio_write(serio, HIL_PKT_CMD >> 8); serio_write(serio, HIL_CMD_IDD); error = wait_for_completion_killable(&dev->cmd_done); if (error) goto bail1; init_completion(&dev->cmd_done); serio_write(serio, 0); serio_write(serio, 0); serio_write(serio, HIL_PKT_CMD >> 8); serio_write(serio, HIL_CMD_RSC); error = wait_for_completion_killable(&dev->cmd_done); if (error) goto bail1; init_completion(&dev->cmd_done); serio_write(serio, 0); serio_write(serio, 0); serio_write(serio, HIL_PKT_CMD >> 8); serio_write(serio, HIL_CMD_RNM); error = wait_for_completion_killable(&dev->cmd_done); if (error) goto bail1; init_completion(&dev->cmd_done); serio_write(serio, 0); serio_write(serio, 0); serio_write(serio, HIL_PKT_CMD >> 8); serio_write(serio, HIL_CMD_EXD); error = wait_for_completion_killable(&dev->cmd_done); if (error) goto bail1; did = dev->idd[0]; idd = dev->idd + 1; switch (did & HIL_IDD_DID_TYPE_MASK) { case HIL_IDD_DID_TYPE_KB_INTEGRAL: case HIL_IDD_DID_TYPE_KB_ITF: case HIL_IDD_DID_TYPE_KB_RSVD: case HIL_IDD_DID_TYPE_CHAR: if (HIL_IDD_NUM_BUTTONS(idd) || HIL_IDD_NUM_AXES_PER_SET(*idd)) { printk(KERN_INFO PREFIX "combo devices are not supported.\n"); goto bail1; } dev->is_pointer = false; hil_dev_keyboard_setup(dev); break; case HIL_IDD_DID_TYPE_REL: case HIL_IDD_DID_TYPE_ABS: dev->is_pointer = true; hil_dev_pointer_setup(dev); break; default: goto bail1; } input_dev->id.bustype = BUS_HIL; input_dev->id.vendor = PCI_VENDOR_ID_HP; input_dev->id.product = 0x0001; /* TODO: get from kbd->rsc */ input_dev->id.version = 0x0100; /* TODO: get from kbd->rsc */ input_dev->dev.parent = &serio->dev; if (!dev->is_pointer) { serio_write(serio, 0); serio_write(serio, 0); serio_write(serio, HIL_PKT_CMD >> 8); /* Enable Keyswitch Autorepeat 1 */ serio_write(serio, HIL_CMD_EK1); /* No need to wait for completion */ }
static void vsxxxaa_handle_POR_packet(struct vsxxxaa *mouse) { struct input_dev *dev = mouse->dev; unsigned char *buf = mouse->buf; int left, middle, right; unsigned char error; /* * Check for Power-On-Reset packets. These are sent out * after plugging the mouse in, or when explicitly * requested by sending 'T'. * * [0]: 1 0 1 0 R3 R2 R1 R0 * [1]: 0 M2 M1 M0 D3 D2 D1 D0 * [2]: 0 E6 E5 E4 E3 E2 E1 E0 * [3]: 0 0 0 0 0 Left Middle Right * * M: manufacturer location code * R: revision code * E: Error code. If it's in the range of 0x00..0x1f, only some * minor problem occured. Errors >= 0x20 are considered bad * and the device may not work properly... * D: <0010> == mouse, <0100> == tablet */ mouse->version = buf[0] & 0x0f; mouse->country = (buf[1] >> 4) & 0x07; mouse->type = buf[1] & 0x0f; error = buf[2] & 0x7f; /* * Get button state. It's the low three bits * (for three buttons) of byte 0. Maybe even the bit <3> * has some meaning if a tablet is attached. */ left = buf[0] & 0x04; middle = buf[0] & 0x02; right = buf[0] & 0x01; vsxxxaa_drop_bytes(mouse, 4); vsxxxaa_detection_done(mouse); if (error <= 0x1f) { /* No (serious) error. Report buttons */ input_report_key(dev, BTN_LEFT, left); input_report_key(dev, BTN_MIDDLE, middle); input_report_key(dev, BTN_RIGHT, right); input_report_key(dev, BTN_TOUCH, 0); input_sync(dev); if (error != 0) printk(KERN_INFO "Your %s on %s reports error=0x%02x\n", mouse->name, mouse->phys, error); } /* * If the mouse was hot-plugged, we need to force differential mode * now... However, give it a second to recover from it's reset. */ printk(KERN_NOTICE "%s on %s: Forcing standard packet format, " "incremental streaming mode and 72 samples/sec\n", mouse->name, mouse->phys); serio_write(mouse->serio, 'S'); /* Standard format */ mdelay(50); serio_write(mouse->serio, 'R'); /* Incremental */ mdelay(50); serio_write(mouse->serio, 'L'); /* 72 samples/sec */ }
/* * lkkbd_connect() probes for a LK keyboard and fills the necessary structures. */ static int lkkbd_connect(struct serio *serio, struct serio_driver *drv) { struct lkkbd *lk; struct input_dev *input_dev; int i; int err; lk = kzalloc(sizeof(struct lkkbd), GFP_KERNEL); input_dev = input_allocate_device(); if (!lk || !input_dev) { err = -ENOMEM; goto fail1; } lk->serio = serio; lk->dev = input_dev; INIT_WORK(&lk->tq, lkkbd_reinit); lk->bell_volume = bell_volume; lk->keyclick_volume = keyclick_volume; lk->ctrlclick_volume = ctrlclick_volume; memcpy(lk->keycode, lkkbd_keycode, sizeof(lk->keycode)); strlcpy(lk->name, "DEC LK keyboard", sizeof(lk->name)); snprintf(lk->phys, sizeof(lk->phys), "%s/input0", serio->phys); input_dev->name = lk->name; input_dev->phys = lk->phys; input_dev->id.bustype = BUS_RS232; input_dev->id.vendor = SERIO_LKKBD; input_dev->id.product = 0; input_dev->id.version = 0x0100; input_dev->dev.parent = &serio->dev; input_dev->event = lkkbd_event; input_set_drvdata(input_dev, lk); __set_bit(EV_KEY, input_dev->evbit); __set_bit(EV_LED, input_dev->evbit); __set_bit(EV_SND, input_dev->evbit); __set_bit(EV_REP, input_dev->evbit); __set_bit(LED_CAPSL, input_dev->ledbit); __set_bit(LED_SLEEP, input_dev->ledbit); __set_bit(LED_COMPOSE, input_dev->ledbit); __set_bit(LED_SCROLLL, input_dev->ledbit); __set_bit(SND_BELL, input_dev->sndbit); __set_bit(SND_CLICK, input_dev->sndbit); input_dev->keycode = lk->keycode; input_dev->keycodesize = sizeof(lk->keycode[0]); input_dev->keycodemax = ARRAY_SIZE(lk->keycode); for (i = 0; i < LK_NUM_KEYCODES; i++) __set_bit(lk->keycode[i], input_dev->keybit); __clear_bit(KEY_RESERVED, input_dev->keybit); serio_set_drvdata(serio, lk); err = serio_open(serio, drv); if (err) goto fail2; err = input_register_device(lk->dev); if (err) goto fail3; serio_write(lk->serio, LK_CMD_POWERCYCLE_RESET); return 0; fail3: serio_close(serio); fail2: serio_set_drvdata(serio, NULL); fail1: input_free_device(input_dev); kfree(lk); return err; }
static void sec_keyboard_tx(struct sec_keyboard_drvdata *data, u8 cmd) { if (data->pre_connected && data->tx_ready) serio_write(data->serio, cmd); }
static int taos_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags, char read_write, u8 command, int size, union i2c_smbus_data *data) { struct serio *serio = adapter->algo_data; struct taos_data *taos = serio_get_drvdata(serio); char *p; /* Encode our transaction. "@" is for the device address, "$" for the SMBus command and "#" for the data. */ p = taos->buffer; /* The device remembers the last used address, no need to send it again if it's the same */ if (addr != taos->addr) p += sprintf(p, "@%02X", addr); switch (size) { case I2C_SMBUS_BYTE: if (read_write == I2C_SMBUS_WRITE) sprintf(p, "$#%02X", command); else sprintf(p, "$"); break; case I2C_SMBUS_BYTE_DATA: if (read_write == I2C_SMBUS_WRITE) sprintf(p, "$%02X#%02X", command, data->byte); else sprintf(p, "$%02X", command); break; default: dev_warn(&adapter->dev, "Unsupported transaction %d\n", size); return -EOPNOTSUPP; } /* Send the transaction to the TAOS EVM */ dev_dbg(&adapter->dev, "Command buffer: %s\n", taos->buffer); taos->pos = 0; taos->state = TAOS_STATE_SEND; serio_write(serio, taos->buffer[0]); wait_event_interruptible_timeout(wq, taos->state == TAOS_STATE_IDLE, msecs_to_jiffies(250)); if (taos->state != TAOS_STATE_IDLE) { dev_err(&adapter->dev, "Transaction failed " "(state=%d, pos=%d)\n", taos->state, taos->pos); taos->addr = 0; return -EIO; } taos->addr = addr; /* Start the transaction and read the answer */ taos->pos = 0; taos->state = TAOS_STATE_RECV; serio_write(serio, read_write == I2C_SMBUS_WRITE ? '>' : '<'); wait_event_interruptible_timeout(wq, taos->state == TAOS_STATE_IDLE, msecs_to_jiffies(150)); if (taos->state != TAOS_STATE_IDLE || taos->pos != 6) { dev_err(&adapter->dev, "Transaction timeout (pos=%d)\n", taos->pos); return -EIO; } dev_dbg(&adapter->dev, "Answer buffer: %s\n", taos->buffer); /* Interpret the returned string */ p = taos->buffer + 2; p[3] = '\0'; if (!strcmp(p, "NAK")) return -ENODEV; if (read_write == I2C_SMBUS_WRITE) { if (!strcmp(p, "ACK")) return 0; } else { if (p[0] == 'x') { data->byte = simple_strtol(p + 1, NULL, 16); return 0; } } return -EIO; }