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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [services/] [gfx/] [mw/] [v2_0/] [src/] [drivers/] [kbd_ipaq.c] - Blame information for rev 174

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 27 unneback
/*
2
 * Copyright (c) 2000 Century Software Embedded Technologies
3
 * Written by Jordan Crouse
4
 *
5
 * Microwindows keyboard driver for Compaq iPAQ
6
 */
7
 
8
#include <stdio.h>
9
#include <sys/types.h>
10
#include <fcntl.h>
11
#include <unistd.h>
12
#include <errno.h>
13
#include "device.h"
14
 
15
#define IPAQ_SCANCODE_RECORD    129
16
#define IPAQ_SCANCODE_CALENDAR  130
17
#define IPAQ_SCANCODE_CONTACTS 131
18
#define IPAQ_SCANCODE_Q        132
19
#define IPAQ_SCANCODE_START    133
20
#define IPAQ_SCANCODE_UP       134 /* keycode up */
21
#define IPAQ_SCANCODE_RIGHT    135 /* keycode right */
22
#define IPAQ_SCANCODE_LEFT     136 /* keycode left */
23
#define IPAQ_SCANCODE_DOWN     137 /* keycode down */
24
 
25
#ifdef __ECOS
26
#define KEYBOARD "/dev/kbd"
27
#else
28
#define KEYBOARD "/dev/h3600_key"
29
#endif
30
 
31
static int  IPAQ_Open(KBDDEVICE *pkd);
32
static void IPAQ_Close(void);
33
static void IPAQ_GetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers);
34
static int  IPAQ_Read(MWKEY *kbuf, MWKEYMOD *modifiers, MWSCANCODE *scancode);
35
 
36
KBDDEVICE kbddev = {
37
        IPAQ_Open,
38
        IPAQ_Close,
39
        IPAQ_GetModifierInfo,
40
        IPAQ_Read,
41
        NULL
42
};
43
 
44
static int fd;
45
 
46
/* From the kernel - this maps a single index into */
47
/* the correct scancode */
48
 
49
static unsigned char scancodes[] = {
50
        0, /* unused */
51
        IPAQ_SCANCODE_RECORD, /* 1 -> record button */
52
        IPAQ_SCANCODE_CALENDAR, /* 2 -> calendar */
53
        IPAQ_SCANCODE_CONTACTS, /* 3 -> contact */
54
        IPAQ_SCANCODE_Q, /* 4 -> Q button */
55
        IPAQ_SCANCODE_START, /* 5 -> start menu */
56
        IPAQ_SCANCODE_UP, /* 6 -> up */
57
        IPAQ_SCANCODE_RIGHT, /* 7 -> right */
58
        IPAQ_SCANCODE_LEFT, /* 8 -> left */
59
        IPAQ_SCANCODE_DOWN, /* 9 -> down */
60
};
61
 
62
static int IPAQ_Open(KBDDEVICE *pkd)
63
{
64
  /* Open the keyboard and get it ready for use */
65
  fd = open(KEYBOARD, O_RDONLY | O_NONBLOCK);
66
 
67
  if (fd < 0) {
68
      printf("%s - Can't open keyboard!\n", __FUNCTION__);
69
      return 0;
70
      return - 1;
71
  }
72
 
73
  printf("Keyboard is FD: %d\n", fd);
74
  return(fd);
75
}
76
 
77
static void IPAQ_Close(void)
78
{
79
    if (fd < 0) return;
80
  close(fd);
81
  fd = 0;
82
}
83
 
84
static void IPAQ_GetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers)
85
{
86
  if (modifiers)
87
    *modifiers = 0;                      /* no modifiers available */
88
  if (curmodifiers)
89
    *curmodifiers = 0;
90
}
91
 
92
 
93
static int IPAQ_Read(MWKEY *kbuf, MWKEYMOD *modifiers, MWSCANCODE *scancode)
94
{
95
  int keydown = 0;
96
  int cc = 0;
97
  char buf[1];
98
 
99
  if (fd < 0)
100
      return 0;
101
  cc = read(fd, &buf, 1);
102
 
103
  if (cc < 0)
104
    {
105
      if ((errno != EINTR) && (errno != EAGAIN) && (errno != EINVAL))
106
        {
107
          perror("IPAQ KEY");
108
           return(-1);
109
        }
110
      else
111
        {
112
          return(0);
113
        }
114
    }
115
  if (cc == 0)
116
    return(0);
117
 
118
  /* If the code is less than 127, then we know that */
119
  /* we have a key down.  Figure out what we've got */
120
 
121
  *modifiers = 0;
122
 
123
  if (*buf < 127)
124
    {
125
      keydown = 1; /* Key pressed but not released */
126
 
127
      if (*buf > 9)
128
        return(0);
129
 
130
      *scancode = scancodes[(int) *buf];
131
    }
132
  else
133
    {
134
      keydown = 2; /* key released */
135
      *scancode = *buf;
136
    }
137
 
138
  switch(*scancode)
139
    {
140
    case IPAQ_SCANCODE_RECORD:
141
      *kbuf = MWKEY_RECORD;
142
      break;
143
 
144
    case IPAQ_SCANCODE_CALENDAR:
145
      *kbuf = MWKEY_APP1;
146
      break;
147
 
148
    case IPAQ_SCANCODE_CONTACTS:
149
      *kbuf = MWKEY_APP2;
150
      break;
151
 
152
    case IPAQ_SCANCODE_Q:
153
      *kbuf = MWKEY_MENU;
154
      break;
155
 
156
    case IPAQ_SCANCODE_START:
157
//      *kbuf = MWKEY_LAST;
158
      *kbuf = MWKEY_CANCEL;
159
      break;
160
 
161
    case IPAQ_SCANCODE_UP:
162
      *kbuf = MWKEY_UP;
163
      break;
164
 
165
    case IPAQ_SCANCODE_DOWN:
166
      *kbuf = MWKEY_DOWN;
167
      break;
168
 
169
    case IPAQ_SCANCODE_LEFT:
170
      *kbuf = MWKEY_LEFT;
171
      break;
172
 
173
    case IPAQ_SCANCODE_RIGHT:
174
      *kbuf = MWKEY_RIGHT;
175
      break;
176
 
177
    default:
178
      printf("Ipaq - Unknown scancode %d\n", *scancode);
179
      return(0);
180
    }
181
 
182
  return(keydown);
183
}

powered by: WebSVN 2.1.0

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