2
* Gamepad style buttons connected to IRQ/GPIO lines
4
* Copyright (c) 2007 CodeSourcery.
5
* Written by Paul Brook
7
* This code is licensed under the GPL.
20
gamepad_button *buttons;
25
static void stellaris_gamepad_put_key(void * opaque, int keycode)
27
gamepad_state *s = (gamepad_state *)opaque;
31
if (keycode == 0xe0 && !s->extension) {
36
down = (keycode & 0x80) == 0;
37
keycode = (keycode & 0x7f) | s->extension;
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);
50
static const VMStateDescription vmstate_stellaris_button = {
51
.name = "stellaris_button",
53
.minimum_version_id = 0,
54
.minimum_version_id_old = 0,
55
.fields = (VMStateField[]) {
56
VMSTATE_UINT8(pressed, gamepad_button),
61
static const VMStateDescription vmstate_stellaris_gamepad = {
62
.name = "stellaris_gamepad",
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),
74
/* Returns an array 5 ouput slots. */
75
void stellaris_gamepad_init(int n, qemu_irq *irq, const int *keycode)
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];
87
qemu_add_kbd_event_handler(stellaris_gamepad_put_key, s);
88
vmstate_register(NULL, -1, &vmstate_stellaris_gamepad, s);