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

Subversion Repositories or1k

[/] [or1k/] [tags/] [MW_0_8_9PRE7/] [mw/] [src/] [drivers/] [kbd_ipaq.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 673 markom
/*
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
 
63
static int IPAQ_Open(KBDDEVICE *pkd)
64
{
65
  /* Open the keyboard and get it ready for use */
66
  fd = open(KEYBOARD, O_RDONLY | O_NONBLOCK);
67
 
68
  if (fd < 0) {
69
      printf("%s - Can't open keyboard!\n", __FUNCTION__);
70
      return - 1;
71
  }
72
 
73
  return(fd);
74
}
75
 
76
static void IPAQ_Close(void)
77
{
78
  close(fd);
79
  fd = 0;
80
}
81
 
82
static void IPAQ_GetModifierInfo(MWKEYMOD *modifiers, MWKEYMOD *curmodifiers)
83
{
84
  if (modifiers)
85
    *modifiers = 0;                      /* no modifiers available */
86
  if (curmodifiers)
87
    *curmodifiers = 0;
88
}
89
 
90
 
91
static int IPAQ_Read(MWKEY *kbuf, MWKEYMOD *modifiers, MWSCANCODE *scancode)
92
{
93
  int keydown = 0;
94
  int cc = 0;
95
  char buf[1];
96
 
97
  cc = read(fd, &buf, 1);
98
 
99
  if (cc < 0)
100
    {
101
      if ((errno != EINTR) && (errno != EAGAIN) && (errno != EINVAL))
102
        {
103
          perror("IPAQ KEY");
104
           return(-1);
105
        }
106
      else
107
        {
108
          return(0);
109
        }
110
    }
111
  if (cc == 0)
112
    return(0);
113
 
114
  /* If the code is less than 127, then we know that */
115
  /* we have a key down.  Figure out what we've got */
116
 
117
  *modifiers = 0;
118
 
119
  if (*buf < 127)
120
    {
121
      keydown = 1; /* Key pressed but not released */
122
 
123
      if (*buf > 9)
124
        return(0);
125
 
126
      *scancode = scancodes[(int) *buf];
127
    }
128
  else
129
    {
130
      keydown = 2; /* key released */
131
      *scancode = *buf;
132
    }
133
 
134
  switch(*scancode)
135
    {
136
    case IPAQ_SCANCODE_RECORD:
137
      *kbuf = MWKEY_RECORD;
138
      break;
139
 
140
    case IPAQ_SCANCODE_CALENDAR:
141
      *kbuf = MWKEY_APP1;
142
      break;
143
 
144
    case IPAQ_SCANCODE_CONTACTS:
145
      *kbuf = MWKEY_APP2;
146
      break;
147
 
148
    case IPAQ_SCANCODE_Q:
149
      *kbuf = MWKEY_MENU;
150
      break;
151
 
152
    case IPAQ_SCANCODE_START:
153
//      *kbuf = MWKEY_LAST;
154
      *kbuf = MWKEY_CANCEL;
155
      break;
156
 
157
    case IPAQ_SCANCODE_UP:
158
      *kbuf = MWKEY_UP;
159
      break;
160
 
161
    case IPAQ_SCANCODE_DOWN:
162
      *kbuf = MWKEY_DOWN;
163
      break;
164
 
165
    case IPAQ_SCANCODE_LEFT:
166
      *kbuf = MWKEY_LEFT;
167
      break;
168
 
169
    case IPAQ_SCANCODE_RIGHT:
170
      *kbuf = MWKEY_RIGHT;
171
      break;
172
 
173
    default:
174
      printf("Ipaq - Unknown scancode %d\n", *scancode);
175
      return(0);
176
    }
177
 
178
  return(keydown);
179
}

powered by: WebSVN 2.1.0

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