Subversion Repositories HelenOS-historic

Rev

Rev 1633 | Rev 1734 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
982 decky 1
/*
2
 * Copyright (C) 2006 Martin Decky
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 * - Redistributions of source code must retain the above copyright
10
 *   notice, this list of conditions and the following disclaimer.
11
 * - Redistributions in binary form must reproduce the above copyright
12
 *   notice, this list of conditions and the following disclaimer in the
13
 *   documentation and/or other materials provided with the distribution.
14
 * - The name of the author may not be used to endorse or promote products
15
 *   derived from this software without specific prior written permission.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
28
 
1702 cejka 29
 /** @addtogroup ppc32	
30
 * @{
31
 */
32
/** @file
33
 */
34
 
982 decky 35
#include <arch/drivers/cuda.h>
36
#include <arch/asm.h>
987 decky 37
#include <console/console.h>
1628 decky 38
#include <console/chardev.h>
1480 palkovsky 39
#include <arch/drivers/pic.h>
1625 decky 40
#include <sysinfo/sysinfo.h>
1480 palkovsky 41
#include <interrupt.h>
1619 decky 42
#include <stdarg.h>
982 decky 43
 
1633 decky 44
#define SPECIAL		'?'
45
 
1619 decky 46
#define PACKET_ADB  0x00
47
#define PACKET_CUDA 0x01
48
 
982 decky 49
#define CUDA_POWERDOWN 0x0a
50
 
51
#define RS 0x200
52
#define B (0 * RS)
53
#define A (1 * RS)
54
#define SR (10 * RS)
55
#define ACR (11 * RS)
56
 
57
#define SR_OUT 0x10
58
#define TACK 0x10
59
#define TIP 0x20
60
 
61
 
1619 decky 62
static volatile __u8 *cuda = NULL;
982 decky 63
 
1606 decky 64
 
1619 decky 65
static char lchars[0x80] = {
1633 decky 66
	'a',
67
	's',
68
	'd',
69
	'f',
70
	'h',
71
	'g',
72
	'z',
73
	'x',
74
	'c',
75
	'v', 
76
	SPECIAL,
77
	'b',
78
	'q',
79
	'w',
80
	'e',
81
	'r',
82
	'y',
83
	't',
84
	'1',
85
	'2',
86
	'3',
87
	'4',
88
	'6',
89
	'5',
90
	'=',
91
	'9',
92
	'7',
93
	'-',
94
	'8',
95
	'0',
96
	']',
97
	'o',
98
	'u',
99
	'[',
100
	'i', 
101
	'p',
102
	'\n',    /* Enter */
103
	'l',
104
	'j',
105
	'\'',
106
	'k',
107
	';',
108
	'\\',
109
	',',
110
	'/',
111
	'n',
112
	'm',
113
	'.',
114
	'\t',    /* Tab */
115
	' ',
116
	'`',
117
	'\b',    /* Backspace */
118
	SPECIAL,
119
	SPECIAL, /* Escape */
120
	SPECIAL, /* Ctrl */
121
	SPECIAL, /* Alt */
122
	SPECIAL, /* Shift */
123
	SPECIAL, /* Caps-Lock */
124
	SPECIAL, /* RAlt */
125
	SPECIAL, /* Left */
126
	SPECIAL, /* Right */
127
	SPECIAL, /* Down */
128
	SPECIAL, /* Up */
129
	SPECIAL, 
130
	SPECIAL,
131
	'.',     /* Keypad . */
132
	SPECIAL, 
133
	'*',     /* Keypad * */
134
	SPECIAL,
135
	'+',     /* Keypad + */
136
	SPECIAL,
137
	SPECIAL, /* NumLock */
138
	SPECIAL,
139
	SPECIAL,
140
	SPECIAL,
141
	'/',     /* Keypad / */
142
	'\n',    /* Keypad Enter */
143
	SPECIAL,
144
	'-',     /* Keypad - */
145
	SPECIAL,
146
	SPECIAL,
147
	SPECIAL,
148
	'0',     /* Keypad 0 */
149
	'1',     /* Keypad 1 */
150
	'2',     /* Keypad 2 */
151
	'3',     /* Keypad 3 */
152
	'4',     /* Keypad 4 */
153
	'5',     /* Keypad 5 */
154
	'6',     /* Keypad 6 */
155
	'7',     /* Keypad 7 */
156
	SPECIAL,
157
	'8',     /* Keypad 8 */
158
	'9',     /* Keypad 9 */
159
	SPECIAL,
160
	SPECIAL,
161
	SPECIAL,
162
	SPECIAL, /* F5 */
163
	SPECIAL, /* F6 */
164
	SPECIAL, /* F7 */
165
	SPECIAL, /* F3 */
166
	SPECIAL, /* F8 */
167
	SPECIAL, /* F9 */
168
	SPECIAL,
169
	SPECIAL, /* F11 */
170
	SPECIAL,
171
	SPECIAL, /* F13 */
172
	SPECIAL,
173
	SPECIAL, /* ScrollLock */
174
	SPECIAL,
175
	SPECIAL, /* F10 */
176
	SPECIAL,
177
	SPECIAL, /* F12 */
178
	SPECIAL,
179
	SPECIAL, /* Pause */
180
	SPECIAL, /* Insert */
181
	SPECIAL, /* Home */
182
	SPECIAL, /* PageUp */
183
	SPECIAL, /* Delete */
184
	SPECIAL, /* F4 */
185
	SPECIAL, /* End */
186
	SPECIAL, /* F2 */
187
	SPECIAL, /* PageDown */
188
	SPECIAL  /* F1 */
1619 decky 189
};
190
 
191
 
1628 decky 192
void send_packet(const __u8 kind, index_t count, ...);
1619 decky 193
 
194
 
195
static void receive_packet(__u8 *kind, index_t count, __u8 data[])
196
{
197
	cuda[B] = cuda[B] & ~TIP;
198
	*kind = cuda[SR];
199
 
200
	index_t i;
201
	for (i = 0; i < count; i++)
202
		data[i] = cuda[SR];
203
 
204
	cuda[B] = cuda[B] | TIP;
205
}
206
 
207
 
1606 decky 208
/* Called from getc(). */
209
static void cuda_resume(chardev_t *d)
210
{
211
}
212
 
213
 
214
/* Called from getc(). */
215
static void cuda_suspend(chardev_t *d)
216
{
217
}
218
 
219
 
220
static char key_read(chardev_t *d)
221
{
222
	char ch;
223
 
224
	ch = 0;
225
	return ch;
226
}
227
 
228
 
1628 decky 229
static chardev_t kbrd;
1606 decky 230
static chardev_operations_t ops = {
231
	.suspend = cuda_suspend,
232
	.resume = cuda_resume,
233
	.read = key_read
234
};
235
 
1619 decky 236
 
1633 decky 237
int cuda_get_scancode(void)
1480 palkovsky 238
{
1619 decky 239
	__u8 kind;
240
	__u8 data[4];
241
 
242
	receive_packet(&kind, 4, data);
243
 
1628 decky 244
	if ((kind == PACKET_ADB) && (data[0] == 0x40) && (data[1] == 0x2c))
245
		return data[2];
246
 
1633 decky 247
	return -1;
1480 palkovsky 248
}
982 decky 249
 
1628 decky 250
static void cuda_irq(int n, istate_t *istate)
251
{
1633 decky 252
	int scan_code = cuda_get_scancode();
1628 decky 253
 
1633 decky 254
	if (scan_code != -1) {
255
		__u8 scancode = (__u8) scan_code;
256
		if ((scancode & 0x80) != 0x80)
257
			chardev_push_character(&kbrd, lchars[scancode & 0x7f]);
258
	}
1628 decky 259
}
260
 
261
 
1619 decky 262
void cuda_init(__address base, size_t size)
990 decky 263
{
1619 decky 264
	cuda = (__u8 *) hw_map(base, size);
265
 
1480 palkovsky 266
	int_register(CUDA_IRQ, "cuda", cuda_irq);
267
	pic_enable_interrupt(CUDA_IRQ);
1606 decky 268
 
269
	chardev_initialize("cuda_kbd", &kbrd, &ops);
270
	stdin = &kbrd;
1625 decky 271
 
272
	sysinfo_set_item_val("cuda", NULL, true);
273
	sysinfo_set_item_val("cuda.irq", NULL, CUDA_IRQ);
990 decky 274
}
275
 
276
 
1628 decky 277
void send_packet(const __u8 kind, index_t count, ...)
278
{
279
	index_t i;
280
	va_list va;
281
 
282
	cuda[B] = cuda[B] | TIP;
283
	cuda[ACR] = cuda[ACR] | SR_OUT;
284
	cuda[SR] = kind;
285
	cuda[B] = cuda[B] & ~TIP;
286
 
287
	va_start(va, count);
288
 
289
	for (i = 0; i < count; i++) {
290
		cuda[ACR] = cuda[ACR] | SR_OUT;
291
		cuda[SR] = va_arg(va, int);
292
		cuda[B] = cuda[B] | TACK;
293
	}
294
 
295
	va_end(va);
296
 
297
	cuda[B] = cuda[B] | TIP;
298
}
299
 
300
 
982 decky 301
void cpu_halt(void) {
1004 decky 302
#ifdef CONFIG_POWEROFF
1619 decky 303
	send_packet(PACKET_CUDA, 1, CUDA_POWERDOWN);
304
#endif
1269 decky 305
	asm volatile (
306
		"b 0\n"
307
	);
982 decky 308
}
1702 cejka 309
 
310
 /** @}
311
 */
312