~vcs-imports/qemu/git

« back to all changes in this revision

Viewing changes to hw/stellaris_input.c

  • Committer: pbrook
  • Date: 2006-10-22 00:18:54 UTC
  • Revision ID: git-v1:e6e5906b6e0a81718066ca43aef57515026c6624
ColdFire target.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2196 c046a42c-6fe2-441c-8c8c-71466251a162

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 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