Statistics
| Branch: | Revision:

root / hw / stellaris_input.c @ 23e39294

History | View | Annotate | Download (2.2 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 licenced 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
    int 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 void stellaris_gamepad_save(QEMUFile *f, void *opaque)
51
{
52
    gamepad_state *s = (gamepad_state *)opaque;
53
    int i;
54

    
55
    qemu_put_be32(f, s->extension);
56
    for (i = 0; i < s->num_buttons; i++)
57
        qemu_put_byte(f, s->buttons[i].pressed);
58
}
59

    
60
static int stellaris_gamepad_load(QEMUFile *f, void *opaque, int version_id)
61
{
62
    gamepad_state *s = (gamepad_state *)opaque;
63
    int i;
64

    
65
    if (version_id != 1)
66
        return -EINVAL;
67

    
68
    s->extension = qemu_get_be32(f);
69
    for (i = 0; i < s->num_buttons; i++)
70
        s->buttons[i].pressed = qemu_get_byte(f);
71

    
72
    return 0;
73
}
74

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

    
81
    s = (gamepad_state *)qemu_mallocz(sizeof (gamepad_state));
82
    s->buttons = (gamepad_button *)qemu_mallocz(n * sizeof (gamepad_button));
83
    for (i = 0; i < n; i++) {
84
        s->buttons[i].irq = irq[i];
85
        s->buttons[i].keycode = keycode[i];
86
    }
87
    s->num_buttons = n;
88
    qemu_add_kbd_event_handler(stellaris_gamepad_put_key, s);
89
    register_savevm("stellaris_gamepad", -1, 1,
90
                    stellaris_gamepad_save, stellaris_gamepad_load, s);
91
}
92

    
93