xenocara/xserver/hw/kdrive/openbsd/openbsd.c

156 lines
3.3 KiB
C
Raw Normal View History

/* $OpenBSD: openbsd.c,v 1.4 2007/12/23 14:28:10 matthieu Exp $ */
/*
* Copyright (c) 2007 Matthieu Herrb <matthieu@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifdef HAVE_CONFIG_H
#include <kdrive-config.h>
#endif
#define XK_PUBLISHING
#include <X11/keysym.h>
#include <X11/Xdefs.h>
2007-05-25 13:10:43 -06:00
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
2007-05-25 13:10:43 -06:00
#include <dev/wscons/wsconsio.h>
#include "kdrive.h"
#include "kopenbsd.h"
int WsconsConsoleFd;
int OpenBSDApmFd = -1;
static Bool enabled;
2007-05-25 13:10:43 -06:00
#define WSCONS_DEV "/dev/ttyC0"
#define DBG(x) ErrorF x
static int
OpenBSDInit(void)
{
2007-05-25 13:10:43 -06:00
DBG(("OpenBSDInit\n"));
WsconsConsoleFd = open(WSCONS_DEV, O_RDWR);
if (WsconsConsoleFd == -1) {
FatalError("OpenBSDInit: error opening %s (%d)\n",
WSCONS_DEV, errno);
}
return 1;
}
Bool
OpenBSDFindPci(CARD16 vendor, CARD16 device, CARD32 count, KdCardAttr *attr)
{
2007-05-25 13:10:43 -06:00
DBG(("OpenBSDFindPci %04hx %04hx\n", vendor, device));
/* Find a PCI device matching vendor/device */
/* return KdCardAttr */
2007-05-25 13:10:43 -06:00
/* XXX */
attr->bus = 0;
attr->slot = 0;
attr->func = 0;
return TRUE;
}
unsigned char *
OpenBSDGetPciCfg(KdCardAttr *attr)
{
/* Get Config registers for card at attr */
2007-05-25 13:10:43 -06:00
DBG(("OpenBSDGetPciCfg %d:%d:%d\n",
attr->bus, attr->slot, attr->func));
return NULL;
}
static void
OpenBSDEnable(void)
{
2007-05-25 13:10:43 -06:00
DBG(("OpenBSDEnable\n"));
if (enabled)
return;
if (kdSwitchPending) {
kdSwitchPending = FALSE;
}
/* Open / init APM */
/* Get a VT */
/* Switch to graphics mode */
enabled = TRUE;
}
static Bool
OpenBSDSpecialKey(KeySym sym)
{
2007-05-25 13:10:43 -06:00
DBG(("OpenBSDSpecialKey\n"));
/* Initiate VT switch if needed */
return FALSE;
}
static void
OpenBSDDisable(void)
{
2007-05-25 13:10:43 -06:00
DBG(("OpenBSDDisable\n"));
enabled = FALSE;
/* Back to text mode */
/* Remove apm hooks */
}
static void
OpenBSDFini(void)
{
2007-05-26 18:53:47 -06:00
int mode = WSDISPLAYIO_MODE_EMUL;
2007-05-25 13:10:43 -06:00
DBG(("OpenBSDFini\n"));
if (WsconsConsoleFd < 0)
return;
2007-05-26 18:53:47 -06:00
/* switch back to initial VT */
2007-05-26 18:53:47 -06:00
if (ioctl(WsconsConsoleFd, WSDISPLAYIO_SMODE, &mode) == -1) {
ErrorF("WSDISPLAYIO_SMODE(EMUL): %s\n", strerror(errno));
}
}
static void
OpenBSDBell(int volume, int pitch, int duration)
{
struct wskbd_bell_data wsb;
DBG(("OpenBSDBell volume %d pictch %d duration %d\n",
volume, pitch, duration));
wsb.which = WSKBD_BELL_DOALL;
wsb.pitch = pitch;
wsb.period = duration;
wsb.volume = volume;
if (ioctl(WsconsConsoleFd, WSKBDIO_COMPLEXBELL, &wsb) == -1)
ErrorF("WsconsKeyboardBell: %s\n", strerror(errno));
}
KdOsFuncs OpenBSDFuncs = {
OpenBSDInit,
OpenBSDEnable,
OpenBSDSpecialKey,
OpenBSDDisable,
OpenBSDFini,
OpenBSDBell,
};
void
OsVendorInit(void)
{
2007-05-25 13:10:43 -06:00
DBG(("OsVendorInit\n"));
KdOsInit(&OpenBSDFuncs);
}