Statistics
| Branch: | Revision:

root / hw / stellaris_input.c @ a0a3167a

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 cf0dbb21 pbrook
 * This code is licenced 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 cf0dbb21 pbrook
    s = (gamepad_state *)qemu_mallocz(sizeof (gamepad_state));
81 cf0dbb21 pbrook
    s->buttons = (gamepad_button *)qemu_mallocz(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
}