OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [mw/] [src/] [drivers/] [kbd_ipaq.c] - Rev 673

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 * Copyright (c) 2000 Century Software Embedded Technologies
 * Written by Jordan Crouse
 *
 * Microwindows keyboard driver for Compaq iPAQ
 */
 
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include "device.h"
 
#define IPAQ_SCANCODE_RECORD    129
#define IPAQ_SCANCODE_CALENDAR  130
#define IPAQ_SCANCODE_CONTACTS 131
#define IPAQ_SCANCODE_Q        132
#define IPAQ_SCANCODE_START    133
#define IPAQ_SCANCODE_UP       134 /* keycode up */
#define IPAQ_SCANCODE_RIGHT    135 /* keycode right */
#define IPAQ_SCANCODE_LEFT     136 /* keycode left */
#define IPAQ_SCANCODE_DOWN     137 /* keycode down */
 
#ifdef __ECOS
#define KEYBOARD "/dev/kbd"
#else
#define KEYBOARD "/dev/h3600_key"
#endif
 
static int  IPAQ_Open(KBDDEVICE *pkd);
static void IPAQ_Close(void);
static void IPAQ_GetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers);
static int  IPAQ_Read(MWKEY *kbuf, MWKEYMOD *modifiers, MWSCANCODE *scancode);
 
KBDDEVICE kbddev = {
	IPAQ_Open,
	IPAQ_Close,
	IPAQ_GetModifierInfo,
	IPAQ_Read,
	NULL
};
 
static int fd;
 
/* From the kernel - this maps a single index into */
/* the correct scancode */
 
static unsigned char scancodes[] = {
        0, /* unused */
        IPAQ_SCANCODE_RECORD, /* 1 -> record button */
        IPAQ_SCANCODE_CALENDAR, /* 2 -> calendar */
        IPAQ_SCANCODE_CONTACTS, /* 3 -> contact */
        IPAQ_SCANCODE_Q, /* 4 -> Q button */
        IPAQ_SCANCODE_START, /* 5 -> start menu */
        IPAQ_SCANCODE_UP, /* 6 -> up */
        IPAQ_SCANCODE_RIGHT, /* 7 -> right */
        IPAQ_SCANCODE_LEFT, /* 8 -> left */
        IPAQ_SCANCODE_DOWN, /* 9 -> down */
};
 
 
static int IPAQ_Open(KBDDEVICE *pkd)
{
  /* Open the keyboard and get it ready for use */
  fd = open(KEYBOARD, O_RDONLY | O_NONBLOCK);
 
  if (fd < 0) {
      printf("%s - Can't open keyboard!\n", __FUNCTION__);
      return - 1;
  }
 
  return(fd);
}
 
static void IPAQ_Close(void)
{
  close(fd);
  fd = 0;
}
 
static void IPAQ_GetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers)
{
  if (modifiers)
    *modifiers = 0;			/* no modifiers available */
  if (curmodifiers)
    *curmodifiers = 0;
}
 
 
static int IPAQ_Read(MWKEY *kbuf, MWKEYMOD *modifiers, MWSCANCODE *scancode)
{
  int keydown = 0;
  int cc = 0;
  char buf[1];
 
  cc = read(fd, &buf, 1);
 
  if (cc < 0)
    {
      if ((errno != EINTR) && (errno != EAGAIN) && (errno != EINVAL))
	{
	  perror("IPAQ KEY");
	   return(-1);
	}
      else
	{
	  return(0);
	}
    }
  if (cc == 0)
    return(0);
 
  /* If the code is less than 127, then we know that */
  /* we have a key down.  Figure out what we've got */
 
  *modifiers = 0;
 
  if (*buf < 127)
    {
      keydown = 1; /* Key pressed but not released */
 
      if (*buf > 9)
	return(0);
 
      *scancode = scancodes[(int) *buf];
    }
  else
    {
      keydown = 2; /* key released */
      *scancode = *buf;
    }
 
  switch(*scancode)
    {
    case IPAQ_SCANCODE_RECORD:
      *kbuf = MWKEY_RECORD;
      break;
 
    case IPAQ_SCANCODE_CALENDAR:
      *kbuf = MWKEY_APP1;
      break;
 
    case IPAQ_SCANCODE_CONTACTS:
      *kbuf = MWKEY_APP2;
      break;
 
    case IPAQ_SCANCODE_Q:
      *kbuf = MWKEY_MENU;
      break;
 
    case IPAQ_SCANCODE_START:
//      *kbuf = MWKEY_LAST;
      *kbuf = MWKEY_CANCEL;
      break;
 
    case IPAQ_SCANCODE_UP:
      *kbuf = MWKEY_UP;
      break;
 
    case IPAQ_SCANCODE_DOWN:
      *kbuf = MWKEY_DOWN;
      break;
 
    case IPAQ_SCANCODE_LEFT:
      *kbuf = MWKEY_LEFT;
      break;
 
    case IPAQ_SCANCODE_RIGHT:
      *kbuf = MWKEY_RIGHT;
      break;
 
    default:
      printf("Ipaq - Unknown scancode %d\n", *scancode);
      return(0);
    }
 
  return(keydown);
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.