Statistics
| Branch: | Revision:

root / hw / stellaris_input.c @ 8e31bf38

History | View | Annotate | Download (2.3 kB)

1
/*
2
 * Gamepad style buttons connected to IRQ/GPIO lines
3
 *
4
 * Copyright (c) 2007 CodeSourcery.
5
 * Written by Paul Brook
6
 *
7
 * This code is licensed under the GPL.
8
 */
9
#include "hw.h"
10
#include "devices.h"
11
#include "console.h"
12

    
13
typedef struct {
14
    qemu_irq irq;
15
    int keycode;
16
    uint8_t pressed;
17
} gamepad_button;
18

    
19
typedef struct {
20
    gamepad_button *buttons;
21
    int num_buttons;
22
    int extension;
23
} gamepad_state;
24

    
25
static void stellaris_gamepad_put_key(void * opaque, int keycode)
26
{
27
    gamepad_state *s = (gamepad_state *)opaque;
28
    int i;
29
    int down;
30

    
31
    if (keycode == 0xe0 && !s->extension) {
32
        s->extension = 0x80;
33
        return;
34
    }
35

    
36
    down = (keycode & 0x80) == 0;
37
    keycode = (keycode & 0x7f) | s->extension;
38

    
39
    for (i = 0; i < s->num_buttons; i++) {
40
        if (s->buttons[i].keycode == keycode
41
                && s->buttons[i].pressed != down) {
42
            s->buttons[i].pressed = down;
43
            qemu_set_irq(s->buttons[i].irq, down);
44
        }
45
    }
46

    
47
    s->extension = 0;
48
}
49

    
50
static const VMStateDescription vmstate_stellaris_button = {
51
    .name = "stellaris_button",
52
    .version_id = 0,
53
    .minimum_version_id = 0,
54
    .minimum_version_id_old = 0,
55
    .fields      = (VMStateField[]) {
56
        VMSTATE_UINT8(pressed, gamepad_button),
57
        VMSTATE_END_OF_LIST()
58
    }
59
};
60

    
61
static const VMStateDescription vmstate_stellaris_gamepad = {
62
    .name = "stellaris_gamepad",
63
    .version_id = 1,
64
    .minimum_version_id = 1,
65
    .minimum_version_id_old = 1,
66
    .fields      = (VMStateField[]) {
67
        VMSTATE_INT32(extension, gamepad_state),
68
        VMSTATE_STRUCT_VARRAY_INT32(buttons, gamepad_state, num_buttons, 0,
69
                              vmstate_stellaris_button, gamepad_button),
70
        VMSTATE_END_OF_LIST()
71
    }
72
};
73

    
74
/* Returns an array 5 ouput slots.  */
75
void stellaris_gamepad_init(int n, qemu_irq *irq, const int *keycode)
76
{
77
    gamepad_state *s;
78
    int i;
79

    
80
    s = (gamepad_state *)qemu_mallocz(sizeof (gamepad_state));
81
    s->buttons = (gamepad_button *)qemu_mallocz(n * sizeof (gamepad_button));
82
    for (i = 0; i < n; i++) {
83
        s->buttons[i].irq = irq[i];
84
        s->buttons[i].keycode = keycode[i];
85
    }
86
    s->num_buttons = n;
87
    qemu_add_kbd_event_handler(stellaris_gamepad_put_key, s);
88
    vmstate_register(NULL, -1, &vmstate_stellaris_gamepad, s);
89
}