symbian-qemu-0.9.1-12/qemu-symbian-svp/hw/stellaris_input.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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 #include "gui.h"
       
    13 
       
    14 typedef struct {
       
    15     qemu_irq irq;
       
    16     int keycode;
       
    17     int pressed;
       
    18 } gamepad_button;
       
    19 
       
    20 typedef struct {
       
    21     gamepad_button *buttons;
       
    22     int num_buttons;
       
    23     int extension;
       
    24 } gamepad_state;
       
    25 
       
    26 static void stellaris_gamepad_put_key(void * opaque, int keycode)
       
    27 {
       
    28     gamepad_state *s = (gamepad_state *)opaque;
       
    29     int i;
       
    30     int down;
       
    31 
       
    32     if (keycode == 0xe0 && !s->extension) {
       
    33         s->extension = 0x80;
       
    34         return;
       
    35     }
       
    36 
       
    37     down = (keycode & 0x80) == 0;
       
    38     keycode = (keycode & 0x7f) | s->extension;
       
    39 
       
    40     for (i = 0; i < s->num_buttons; i++) {
       
    41         if (s->buttons[i].keycode == keycode
       
    42                 && s->buttons[i].pressed != down) {
       
    43             s->buttons[i].pressed = down;
       
    44             qemu_set_irq(s->buttons[i].irq, down);
       
    45         }
       
    46     }
       
    47 
       
    48     s->extension = 0;
       
    49 }
       
    50 
       
    51 static void stellaris_gamepad_save(QEMUFile *f, void *opaque)
       
    52 {
       
    53     gamepad_state *s = (gamepad_state *)opaque;
       
    54     int i;
       
    55 
       
    56     qemu_put_be32(f, s->extension);
       
    57     for (i = 0; i < s->num_buttons; i++)
       
    58         qemu_put_byte(f, s->buttons[i].pressed);
       
    59 }
       
    60 
       
    61 static int stellaris_gamepad_load(QEMUFile *f, void *opaque, int version_id)
       
    62 {
       
    63     gamepad_state *s = (gamepad_state *)opaque;
       
    64     int i;
       
    65 
       
    66     if (version_id != 1)
       
    67         return -EINVAL;
       
    68 
       
    69     s->extension = qemu_get_be32(f);
       
    70     for (i = 0; i < s->num_buttons; i++)
       
    71         s->buttons[i].pressed = qemu_get_byte(f);
       
    72 
       
    73     return 0;
       
    74 }
       
    75 
       
    76 /* Returns an array 5 ouput slots.  */
       
    77 void stellaris_gamepad_init(int n, qemu_irq *irq, const int *keycode)
       
    78 {
       
    79     gamepad_state *s;
       
    80     int i;
       
    81 
       
    82     s = (gamepad_state *)qemu_mallocz(sizeof (gamepad_state));
       
    83     s->buttons = (gamepad_button *)qemu_mallocz(n * sizeof (gamepad_button));
       
    84     for (i = 0; i < n; i++) {
       
    85         s->buttons[i].irq = irq[i];
       
    86         s->buttons[i].keycode = keycode[i];
       
    87     }
       
    88     s->num_buttons = n;
       
    89     gui_register_dev_key_callback(stellaris_gamepad_put_key, s);
       
    90     register_savevm("stellaris_gamepad", -1, 1,
       
    91                     stellaris_gamepad_save, stellaris_gamepad_load, s);
       
    92 }