root / hw / stellaris_input.c @ 0200db65
History | View | Annotate | Download (2.3 kB)
1 | cf0dbb21 | pbrook | /*
|
---|---|---|---|
2 | cf0dbb21 | pbrook | * Gamepad style buttons connected to IRQ/GPIO lines
|
3 | cf0dbb21 | pbrook | *
|
4 | cf0dbb21 | pbrook | * Copyright (c) 2007 CodeSourcery.
|
5 | cf0dbb21 | pbrook | * Written by Paul Brook
|
6 | cf0dbb21 | pbrook | *
|
7 | 8e31bf38 | Matthew Fernandez | * This code is licensed under the GPL.
|
8 | cf0dbb21 | pbrook | */
|
9 | cf0dbb21 | pbrook | #include "hw.h" |
10 | cf0dbb21 | pbrook | #include "devices.h" |
11 | cf0dbb21 | pbrook | #include "console.h" |
12 | cf0dbb21 | pbrook | |
13 | cf0dbb21 | pbrook | typedef struct { |
14 | cf0dbb21 | pbrook | qemu_irq irq; |
15 | cf0dbb21 | pbrook | int keycode;
|
16 | 4483c7ac | Juan Quintela | uint8_t pressed; |
17 | cf0dbb21 | pbrook | } gamepad_button; |
18 | cf0dbb21 | pbrook | |
19 | cf0dbb21 | pbrook | typedef struct { |
20 | cf0dbb21 | pbrook | gamepad_button *buttons; |
21 | cf0dbb21 | pbrook | int num_buttons;
|
22 | cf0dbb21 | pbrook | int extension;
|
23 | cf0dbb21 | pbrook | } gamepad_state; |
24 | cf0dbb21 | pbrook | |
25 | cf0dbb21 | pbrook | static void stellaris_gamepad_put_key(void * opaque, int keycode) |
26 | cf0dbb21 | pbrook | { |
27 | cf0dbb21 | pbrook | gamepad_state *s = (gamepad_state *)opaque; |
28 | cf0dbb21 | pbrook | int i;
|
29 | cf0dbb21 | pbrook | int down;
|
30 | cf0dbb21 | pbrook | |
31 | cf0dbb21 | pbrook | if (keycode == 0xe0 && !s->extension) { |
32 | cf0dbb21 | pbrook | s->extension = 0x80;
|
33 | cf0dbb21 | pbrook | return;
|
34 | cf0dbb21 | pbrook | } |
35 | cf0dbb21 | pbrook | |
36 | cf0dbb21 | pbrook | down = (keycode & 0x80) == 0; |
37 | cf0dbb21 | pbrook | keycode = (keycode & 0x7f) | s->extension;
|
38 | cf0dbb21 | pbrook | |
39 | cf0dbb21 | pbrook | for (i = 0; i < s->num_buttons; i++) { |
40 | cf0dbb21 | pbrook | if (s->buttons[i].keycode == keycode
|
41 | cf0dbb21 | pbrook | && s->buttons[i].pressed != down) { |
42 | cf0dbb21 | pbrook | s->buttons[i].pressed = down; |
43 | cf0dbb21 | pbrook | qemu_set_irq(s->buttons[i].irq, down); |
44 | cf0dbb21 | pbrook | } |
45 | cf0dbb21 | pbrook | } |
46 | cf0dbb21 | pbrook | |
47 | cf0dbb21 | pbrook | s->extension = 0;
|
48 | cf0dbb21 | pbrook | } |
49 | cf0dbb21 | pbrook | |
50 | 4483c7ac | Juan Quintela | static const VMStateDescription vmstate_stellaris_button = { |
51 | 4483c7ac | Juan Quintela | .name = "stellaris_button",
|
52 | 4483c7ac | Juan Quintela | .version_id = 0,
|
53 | 4483c7ac | Juan Quintela | .minimum_version_id = 0,
|
54 | 4483c7ac | Juan Quintela | .minimum_version_id_old = 0,
|
55 | 4483c7ac | Juan Quintela | .fields = (VMStateField[]) { |
56 | 4483c7ac | Juan Quintela | VMSTATE_UINT8(pressed, gamepad_button), |
57 | 4483c7ac | Juan Quintela | VMSTATE_END_OF_LIST() |
58 | 4483c7ac | Juan Quintela | } |
59 | 4483c7ac | Juan Quintela | }; |
60 | 23e39294 | pbrook | |
61 | 4483c7ac | Juan Quintela | static const VMStateDescription vmstate_stellaris_gamepad = { |
62 | 4483c7ac | Juan Quintela | .name = "stellaris_gamepad",
|
63 | 4483c7ac | Juan Quintela | .version_id = 1,
|
64 | 4483c7ac | Juan Quintela | .minimum_version_id = 1,
|
65 | 4483c7ac | Juan Quintela | .minimum_version_id_old = 1,
|
66 | 4483c7ac | Juan Quintela | .fields = (VMStateField[]) { |
67 | 4483c7ac | Juan Quintela | VMSTATE_INT32(extension, gamepad_state), |
68 | 4483c7ac | Juan Quintela | VMSTATE_STRUCT_VARRAY_INT32(buttons, gamepad_state, num_buttons, 0,
|
69 | 4483c7ac | Juan Quintela | vmstate_stellaris_button, gamepad_button), |
70 | 4483c7ac | Juan Quintela | VMSTATE_END_OF_LIST() |
71 | 4483c7ac | Juan Quintela | } |
72 | 4483c7ac | Juan Quintela | }; |
73 | 23e39294 | pbrook | |
74 | cf0dbb21 | pbrook | /* Returns an array 5 ouput slots. */
|
75 | cf0dbb21 | pbrook | void stellaris_gamepad_init(int n, qemu_irq *irq, const int *keycode) |
76 | cf0dbb21 | pbrook | { |
77 | cf0dbb21 | pbrook | gamepad_state *s; |
78 | cf0dbb21 | pbrook | int i;
|
79 | cf0dbb21 | pbrook | |
80 | 7267c094 | Anthony Liguori | s = (gamepad_state *)g_malloc0(sizeof (gamepad_state));
|
81 | 7267c094 | Anthony Liguori | s->buttons = (gamepad_button *)g_malloc0(n * sizeof (gamepad_button));
|
82 | cf0dbb21 | pbrook | for (i = 0; i < n; i++) { |
83 | cf0dbb21 | pbrook | s->buttons[i].irq = irq[i]; |
84 | cf0dbb21 | pbrook | s->buttons[i].keycode = keycode[i]; |
85 | cf0dbb21 | pbrook | } |
86 | cf0dbb21 | pbrook | s->num_buttons = n; |
87 | cf0dbb21 | pbrook | qemu_add_kbd_event_handler(stellaris_gamepad_put_key, s); |
88 | 4483c7ac | Juan Quintela | vmstate_register(NULL, -1, &vmstate_stellaris_gamepad, s); |
89 | cf0dbb21 | pbrook | } |