Annotation of qemu/hw/stellaris_input.c, revision 1.1.1.2

1.1       root        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: 
1.1.1.2 ! root       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: 
1.1       root       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);
1.1.1.2 ! root       89:     register_savevm("stellaris_gamepad", -1, 1,
        !            90:                     stellaris_gamepad_save, stellaris_gamepad_load, s);
1.1       root       91: }

unix.superglobalmegacorp.com