~ubuntu-branches/ubuntu/wily/qemu-kvm-spice/wily

« back to all changes in this revision

Viewing changes to hw/stellaris_input.c

  • Committer: Bazaar Package Importer
  • Author(s): Serge Hallyn
  • Date: 2011-10-19 10:44:56 UTC
  • Revision ID: james.westby@ubuntu.com-20111019104456-xgvskumk3sxi97f4
Tags: upstream-0.15.0+noroms
ImportĀ upstreamĀ versionĀ 0.15.0+noroms

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
}