From: Jonathan Phenix <jonathan.phenix@videotron.ca>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] Joystick API
Date: Thu, 10 May 2007 20:01:55 -0400 [thread overview]
Message-ID: <4643B273.4040907@videotron.ca> (raw)
[-- Attachment #1: Type: text/plain, Size: 322 bytes --]
Hi,
this is an attempt to add a simple joystick API to qemu. This API will
be required for my upcoming Playstation emulator. It includes a "null"
driver, I have a Linux and SDL driver as well, I will send them when
this patch will be merged. Constructive comments are welcome.
Regards,
Jonathan Phénix
[-- Attachment #2: qemu-cvs-joystick.patch --]
[-- Type: text/x-patch, Size: 12272 bytes --]
diff -urN --exclude CVS qemu/joystick/joystick.c qemu-joystick/joystick/joystick.c
--- qemu/joystick/joystick.c 1969-12-31 19:00:00.000000000 -0500
+++ qemu-joystick/joystick/joystick.c 2007-05-10 19:21:07.000000000 -0400
@@ -0,0 +1,148 @@
+/* QEMU joystick API
+ *
+ * Copyright (C) 2007 Jonathan Phénix
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "joystick_int.h"
+
+static const JoyDriver *joy_driver_table[] = {
+#if 0
+#ifdef CONFIG_JOY_LINUX
+ &joy_driver_linux,
+#endif
+#ifdef CONFIG_SDL
+ &joy_driver_sdl,
+#endif
+#endif
+ &joy_driver_null,
+ NULL,
+};
+
+JoyState *qemu_joy_init(JoyButtonCB but_cb, JoyAxisCB axis_cb, void *opaque)
+{
+ const JoyDriver **ptr;
+ JoyState *s;
+
+#ifdef JOY_SAFE
+ if (!but_cb || !axis_cb)
+ return NULL;
+#endif
+
+ ptr = joy_driver_table;
+
+ while (*ptr) {
+ if ((*ptr)->probe() == JOY_OK)
+ break;
+ ptr++;
+ }
+
+ if (!ptr) {
+ /* This should never happens, the null driver should catch it but we are never too careful */
+ qemu_joy_log("%s: No suitable joystick driver\n", __func__);
+ qemu_free(s);
+ return NULL;
+ }
+
+ s = qemu_mallocz(sizeof(*s) + (*ptr)->size);
+ if (!s)
+ return NULL;
+
+ s->driver = *ptr;
+
+ s->joy_but_cb = but_cb;
+ s->joy_axis_cb = axis_cb;
+ s->cb_opaque = opaque;
+
+ s->driver->init(s);
+
+ return s;
+}
+
+JoyError qemu_joy_open(JoyState *s, unsigned int devno)
+{
+#ifdef JOY_SAFE
+ if (devno >= JOY_MAX || !s)
+ return JOY_EINVAL;
+#endif
+ return s->driver->open(s, devno);
+}
+
+JoyError qemu_joy_close(JoyState *s, unsigned int devno)
+{
+#ifdef JOY_SAFE
+ if (devno >= JOY_MAX || !s)
+ return JOY_EINVAL;
+#endif
+
+ return s->driver->close(s, devno);
+}
+
+JoyError qemu_joy_get_info(JoyState *s, unsigned int devno, JoyInfo *info)
+{
+#ifdef JOY_SAFE
+ if (devno >= JOY_MAX || !s || !info)
+ return JOY_EINVAL;
+#endif
+
+ memset(info, 0, sizeof(*info));
+
+ return s->driver->get_info(s, devno, info);
+}
+
+unsigned int qemu_joy_nr(JoyState *s)
+{
+#ifdef JOY_SAFE
+ if (!s)
+ return 0;
+#endif
+
+ return s->driver->nr(s);
+}
+
+void qemu_joy_flush(JoyState *s)
+{
+#ifdef JOY_SAFE
+ if (!s)
+ return;
+#endif
+
+ if (s->driver->flush)
+ s->driver->flush(s);
+}
+
+void qemu_joy_enable(JoyState *s)
+{
+#ifdef JOY_SAFE
+ if (!s)
+ return;
+#endif
+
+ if (s->driver->enable)
+ s->driver->enable(s);
+}
+
+extern FILE *logfile;
+
+void qemu_joy_log(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(logfile ? logfile : stderr, fmt, ap);
+ va_end(ap);
+}
+
diff -urN --exclude CVS qemu/joystick/joystick.h qemu-joystick/joystick/joystick.h
--- qemu/joystick/joystick.h 1969-12-31 19:00:00.000000000 -0500
+++ qemu-joystick/joystick/joystick.h 2007-05-10 19:14:08.000000000 -0400
@@ -0,0 +1,84 @@
+/* QEMU joystick API
+ *
+ * Copyright (C) 2007 Jonathan Phénix
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __JOYSTICK_H__
+#define __JOYSTICK_H__
+
+#include "vl.h"
+
+typedef struct JoyState JoyState;
+
+typedef void (*JoyButtonCB)(void *opaque, unsigned int devno, uint8_t button, int down);
+typedef void (*JoyAxisCB)(void *opaque, unsigned devno, uint8_t axis, int16_t state);
+
+typedef enum { JOY_OK = 0, JOY_EINVAL, JOY_ENODEV, JOY_ENOMEM, JOY_ERROR } JoyError;
+
+#define JOY_NAME_MAX 256
+#define JOY_DRIVER_MAX 256
+#define JOY_VER_MAX 256
+
+/* Maximum number of joystick that can be opened at one time */
+#define JOY_MAX 8
+
+typedef struct {
+ char name[JOY_NAME_MAX];
+ char driver[JOY_DRIVER_MAX];
+ char ver[JOY_VER_MAX];
+ uint8_t nr_axes;
+ uint8_t nr_buttons;
+} JoyInfo;
+
+
+/********************************************* User API *********************************************/
+
+/* In all these functions call, it is important that "0 < devno < JOY_MAX". The first joystick on
+ the system is 0 and not 1, i.e. devno == 1 is the second joystick */
+
+/* Init. the joystick subsystem and define the callback functions for axes and buttons state
+ changes. The callbacks functions should not be NULL. The opaque pointer will be passed as is
+ to callback functions */
+JoyState *qemu_joy_init(JoyButtonCB but_cb, JoyAxisCB axis_cb, void *opaque);
+
+/* Open the joystick devno. Should only be called if qemu_joy_init was successful. */
+JoyError qemu_joy_open(JoyState *s, unsigned int devno);
+
+/* Close the joystick devno. Should only be called if qemu_joy_init and qemu_joy_open(devno)
+ were successful. */
+JoyError qemu_joy_close(JoyState *s, unsigned int devno);
+
+/* Get some information about the joystick. "ver" is the version of the joystick driver, this
+ information is not always returned by the driver. Should only be called if qemu_joy_init
+ and qemu_joy_open(devno) were successful. */
+JoyError qemu_joy_get_info(JoyState *s, unsigned int devno, JoyInfo *info);
+
+/* Get the number of joystick(s) currently connected to the system. Should only be called if
+ qemu_joy_init was successful. */
+unsigned int qemu_joy_nr(JoyState *s);
+
+/* Make sure that all the joystick events were sent to the callback functions, use this to
+ make sure that you have a 100% up-to-date information. */
+void qemu_joy_flush(JoyState *s);
+
+/* Call this when you are ready to receive calls to the callback functions. */
+void qemu_joy_enable(JoyState *s);
+
+/****************************************************************************************************/
+
+#endif /* __JOYSTICK_H__ */
+
diff -urN --exclude CVS qemu/joystick/joystick_int.h qemu-joystick/joystick/joystick_int.h
--- qemu/joystick/joystick_int.h 1969-12-31 19:00:00.000000000 -0500
+++ qemu-joystick/joystick/joystick_int.h 2007-05-10 19:26:27.000000000 -0400
@@ -0,0 +1,58 @@
+/* QEMU internal joystick API
+ *
+ * Copyright (C) 2007 Jonathan Phénix
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __JOYSTICK_INT_H__
+#define __JOYSTICK_INT_H__
+
+#include "vl.h"
+#include "joystick.h"
+
+//#define JOY_SAFE
+//#define JOY_DEBUG
+
+typedef struct JoyDriver JoyDriver;
+
+struct JoyState {
+ const JoyDriver *driver;
+
+ JoyButtonCB joy_but_cb;
+ JoyAxisCB joy_axis_cb;
+ void *cb_opaque;
+};
+
+struct JoyDriver {
+ JoyError (*probe)(void);
+ JoyError (*init)(JoyState *js);
+ JoyError (*open)(JoyState *js, unsigned int devno);
+ JoyError (*close)(JoyState *js, unsigned int devno);
+ JoyError (*get_info)(JoyState *js, unsigned int devno, JoyInfo *info);
+ unsigned int (*nr)(JoyState *js);
+ void (*flush)(JoyState *js);
+ void (*enable)(JoyState *js);
+ int size;
+};
+
+extern const JoyDriver joy_driver_linux;
+extern const JoyDriver joy_driver_sdl;
+extern const JoyDriver joy_driver_null;
+
+void qemu_joy_log(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
+
+#endif /* __JOYSTICK_INT_H__ */
+
diff -urN --exclude CVS qemu/joystick/nulljoy.c qemu-joystick/joystick/nulljoy.c
--- qemu/joystick/nulljoy.c 1969-12-31 19:00:00.000000000 -0500
+++ qemu-joystick/joystick/nulljoy.c 2007-05-10 19:14:20.000000000 -0400
@@ -0,0 +1,63 @@
+/* QEMU joystick NULL driver
+ *
+ * Copyright (C) 2007 Jonathan Phénix
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "joystick_int.h"
+
+static JoyError null_probe(void)
+{
+ return JOY_OK;
+}
+
+static JoyError null_init(JoyState *s)
+{
+ return JOY_OK;
+}
+
+static JoyError null_open_close(JoyState *s, unsigned int devno)
+{
+ return JOY_OK;
+}
+
+static JoyError null_get_info(JoyState *s, unsigned int devno, JoyInfo *info)
+{
+ strncpy(info->name, "NULL", JOY_NAME_MAX - 1);
+ strncpy(info->driver, "NULL", JOY_DRIVER_MAX - 1);
+ info->nr_buttons = 1;
+ info->nr_axes = 2;
+
+ return JOY_OK;
+}
+
+static unsigned int null_nr(JoyState *s)
+{
+ return UINT_MAX;
+}
+
+const JoyDriver joy_driver_null = {
+ null_probe,
+ null_init,
+ null_open_close,
+ null_open_close,
+ null_get_info,
+ null_nr,
+ NULL, /* flush */
+ NULL, /* enable */
+ 0, /* size of private data */
+};
+
diff -urN --exclude CVS qemu/Makefile.target qemu-joystick/Makefile.target
--- qemu/Makefile.target 2007-05-08 17:05:55.000000000 -0400
+++ qemu-joystick/Makefile.target 2007-05-10 19:55:17.000000000 -0400
@@ -17,7 +17,7 @@
TARGET_BASE_ARCH:=sparc
endif
TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
-VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw:$(SRC_PATH)/audio
+VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw:$(SRC_PATH)/audio:$(SRC_PATH)/joystick
CPPFLAGS=-I. -I.. -I$(TARGET_PATH) -I$(SRC_PATH)
ifdef CONFIG_DARWIN_USER
VPATH+=:$(SRC_PATH)/darwin-user
@@ -416,6 +416,14 @@
VL_OBJS += pcnet.o
VL_OBJS += rtl8139.o
+JOYDRV = joystick.o nulljoy.o
+#ifdef CONFIG_JOY_LINUX
+#JOYDRV += linuxjoy.o
+#endif
+#ifdef CONFIG_SDL
+#JOYDRV += sdljoy.o
+#endif
+
ifeq ($(TARGET_BASE_ARCH), i386)
# Hardware support
VL_OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o $(AUDIODRV)
next reply other threads:[~2007-05-11 0:09 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-11 0:01 Jonathan Phenix [this message]
2007-05-20 20:32 ` [Qemu-devel] [PATCH] Joystick API Jonathan Phenix
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4643B273.4040907@videotron.ca \
--to=jonathan.phenix@videotron.ca \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.