326 lines
6.9 KiB
C
326 lines
6.9 KiB
C
|
/*
|
|||
|
* Copyright <EFBFBD> 1999 Keith Packard
|
|||
|
*
|
|||
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
|||
|
* documentation for any purpose is hereby granted without fee, provided that
|
|||
|
* the above copyright notice appear in all copies and that both that
|
|||
|
* copyright notice and this permission notice appear in supporting
|
|||
|
* documentation, and that the name of Keith Packard not be used in
|
|||
|
* advertising or publicity pertaining to distribution of the software without
|
|||
|
* specific, written prior permission. Keith Packard makes no
|
|||
|
* representations about the suitability of this software for any purpose. It
|
|||
|
* is provided "as is" without express or implied warranty.
|
|||
|
*
|
|||
|
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|||
|
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, 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
|
|||
|
#include "itsy.h"
|
|||
|
|
|||
|
/* struct with LCD characteristics defined in fb_brutus.h */
|
|||
|
static struct FbLcdParamsStruct fbLcdParams;
|
|||
|
static int fb_d;
|
|||
|
static int fbn;
|
|||
|
Bool
|
|||
|
itsyCardInit (KdCardInfo *card)
|
|||
|
{
|
|||
|
int k;
|
|||
|
char *fb;
|
|||
|
char *pixels;
|
|||
|
|
|||
|
if ((fb_d = open("/dev/fbclone", O_RDWR)) < 0) {
|
|||
|
perror("Error opening /dev/fb\n");
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
if ((k=ioctl(fb_d, FB_LCD_PARAMS, &fbLcdParams)) != 0) {
|
|||
|
perror("Error with /dev/fb ioctl FB_LCD_PARAMS call");
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
fb = (char *) mmap ((caddr_t) NULL, fbLcdParams.frameBufferSize,
|
|||
|
PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fb_d, 0);
|
|||
|
|
|||
|
fprintf (stderr, "fb mapped at 0x%x\n", fb);
|
|||
|
if (fb == (char *)-1) {
|
|||
|
perror("ERROR: mmap framebuffer fails!");
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
card->driver = fb;
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
Bool
|
|||
|
itsyScreenInit (KdScreenInfo *screen)
|
|||
|
{
|
|||
|
CARD8 *fb = screen->card->driver;
|
|||
|
|
|||
|
screen->width = fbLcdParams.screenSizeH;
|
|||
|
screen->height = fbLcdParams.screenSizeV;
|
|||
|
screen->depth = fbLcdParams.bitsPerPixel;
|
|||
|
screen->bitsPerPixel = fbLcdParams.bitsPerPixel;
|
|||
|
screen->byteStride = fbLcdParams.frameBufferSizeH;
|
|||
|
screen->pixelStride = (fbLcdParams.frameBufferSizeH * 8 /
|
|||
|
fbLcdParams.bitsPerPixel);
|
|||
|
fprintf (stderr, "width %d height %d depth %d pstride %d bstride %d\n",
|
|||
|
screen->width, screen->height, screen->depth,
|
|||
|
screen->pixelStride, screen->byteStride);
|
|||
|
screen->dumb = FALSE;
|
|||
|
screen->softCursor = TRUE;
|
|||
|
screen->blueMask = 0;
|
|||
|
screen->greenMask = 0;
|
|||
|
screen->redMask = 0;
|
|||
|
screen->visuals = 1 << StaticGray;
|
|||
|
screen->rate = 72;
|
|||
|
screen->frameBuffer = (CARD8 *) (fb +
|
|||
|
fbLcdParams.pixelDataOffset +
|
|||
|
(fbLcdParams.reserveTopRows *
|
|||
|
screen->byteStride));
|
|||
|
fprintf (stderr, "Frame buffer 0x%x\n", screen->frameBuffer);
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
static unsigned short itsyIntensity[16] = {
|
|||
|
0xffff,
|
|||
|
0xffff,
|
|||
|
0xedb6,
|
|||
|
0xdb6d,
|
|||
|
0xc924,
|
|||
|
0xb6db,
|
|||
|
0xa492,
|
|||
|
0x9249,
|
|||
|
0x8000,
|
|||
|
0x6db6,
|
|||
|
0x5b6d,
|
|||
|
0x4924,
|
|||
|
0x36db,
|
|||
|
0x2492,
|
|||
|
0x1249,
|
|||
|
0x0000,
|
|||
|
};
|
|||
|
|
|||
|
Bool
|
|||
|
itsyCreateColormap (ColormapPtr pmap)
|
|||
|
{
|
|||
|
int i;
|
|||
|
|
|||
|
for (i = 0; i < 16; i++)
|
|||
|
{
|
|||
|
pmap->red[i].co.local.red = itsyIntensity[i];
|
|||
|
pmap->red[i].co.local.green = itsyIntensity[i];
|
|||
|
pmap->red[i].co.local.blue = itsyIntensity[i];
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
Bool
|
|||
|
itsyInitScreen (ScreenPtr pScreen)
|
|||
|
{
|
|||
|
pScreen->CreateColormap = itsyCreateColormap;
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
itsyPreserve (KdCardInfo *card)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
itsyEnable (ScreenPtr pScreen)
|
|||
|
{
|
|||
|
KdScreenPriv(pScreen);
|
|||
|
|
|||
|
fprintf (stderr, "Enabling LCD display\n");
|
|||
|
/* display it on the LCD */
|
|||
|
ioctl(fb_d, FB_LCD_SHOW, 0);
|
|||
|
}
|
|||
|
|
|||
|
Bool
|
|||
|
itsyDPMS (ScreenPtr pScreen, int mode)
|
|||
|
{
|
|||
|
if (mode)
|
|||
|
ioctl (fb_d, FB_LCD_OFF, 0);
|
|||
|
else
|
|||
|
ioctl (fb_d, FB_LCD_ON, 0);
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
itsyDisable (ScreenPtr pScreen)
|
|||
|
{
|
|||
|
/* ioctl (fb_d, FB_LCD_SWITCH, 0); */
|
|||
|
/* fprintf (stderr, "Disabling LCD display\n");*/
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
itsyRestore (KdCardInfo *card)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
itsyScreenFini (KdScreenInfo *screen)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
itsyCardFini (KdCardInfo *card)
|
|||
|
{
|
|||
|
int k;
|
|||
|
|
|||
|
fprintf (stderr, "Unmapping driver at 0x%x\n", card->driver);
|
|||
|
munmap (card->driver, fbLcdParams.frameBufferSize);
|
|||
|
fprintf (stderr, "Releasing fbn %d\n", fbn);
|
|||
|
/* release it */
|
|||
|
if (ioctl(fb_d, FB_LCD_FREE, fbn) != 0) {
|
|||
|
printf("FB_LCD_FREE of %d fails!\n", fbn);
|
|||
|
}
|
|||
|
close (fb_d);
|
|||
|
fprintf (stderr, "itsyFini done\n");
|
|||
|
}
|
|||
|
|
|||
|
KdCardFuncs itsyFuncs = {
|
|||
|
itsyCardInit, /* cardinit */
|
|||
|
itsyScreenInit, /* scrinit */
|
|||
|
itsyInitScreen, /* initScreen */
|
|||
|
itsyPreserve, /* preserve */
|
|||
|
itsyEnable, /* enable */
|
|||
|
itsyDPMS, /* dpms */
|
|||
|
itsyDisable, /* disable */
|
|||
|
itsyRestore, /* restore */
|
|||
|
itsyScreenFini, /* scrfini */
|
|||
|
itsyCardFini, /* cardfini */
|
|||
|
|
|||
|
0, /* initCursor */
|
|||
|
0, /* enableCursor */
|
|||
|
0, /* disableCursor */
|
|||
|
0, /* finiCursor */
|
|||
|
0, /* recolorCursor */
|
|||
|
|
|||
|
0, /* initAccel */
|
|||
|
0, /* enableAccel */
|
|||
|
0, /* disableAccel */
|
|||
|
0, /* finiAccel */
|
|||
|
|
|||
|
0, /* getColors */
|
|||
|
0, /* putColors */
|
|||
|
};
|
|||
|
|
|||
|
void
|
|||
|
InitCard (void)
|
|||
|
{
|
|||
|
KdCardAttr attr;
|
|||
|
|
|||
|
KdCardInfoAdd (&itsyFuncs, &attr, 0);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv)
|
|||
|
{
|
|||
|
KdInitOutput (pScreenInfo, argc, argv);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
InitInput (int argc, char **argv)
|
|||
|
{
|
|||
|
KdInitInput (&itsyTsMouseFuncs, &itsyKeyboardFuncs);
|
|||
|
}
|
|||
|
|
|||
|
int itsySessionFd = -1;
|
|||
|
|
|||
|
int
|
|||
|
ItsyOsInit (void)
|
|||
|
{
|
|||
|
pid_t sid;
|
|||
|
int i;
|
|||
|
itsy_session_info info;
|
|||
|
|
|||
|
if (itsySessionFd < 0)
|
|||
|
{
|
|||
|
itsySessionFd = open ("/dev/session", 0);
|
|||
|
ErrorF("itsySessionFD %d\n", itsySessionFd);
|
|||
|
}
|
|||
|
|
|||
|
(void) setsid ();
|
|||
|
sid = getsid (0);
|
|||
|
ErrorF ("Session ID %d PID %d\n", sid, getpid ());
|
|||
|
info.sid = sid;
|
|||
|
strcpy (info.name, "X");
|
|||
|
if (itsySessionFd >= 0)
|
|||
|
{
|
|||
|
i = ioctl (itsySessionFd, SESSION_SET_INFO, &info);
|
|||
|
if (i < 0)
|
|||
|
perror ("SESSION_SET_INFO");
|
|||
|
}
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
ItsyOsEnable (void)
|
|||
|
{
|
|||
|
itsy_session_request req;
|
|||
|
int i;
|
|||
|
|
|||
|
#define MANAGER_SID_TO_FOREGROUND 2
|
|||
|
|
|||
|
req.operation = MANAGER_SID_TO_FOREGROUND;
|
|||
|
req.data = 0;
|
|||
|
if (itsySessionFd >= 0)
|
|||
|
{
|
|||
|
i = ioctl (itsySessionFd, SESSION_MANAGER_REQUEST, &req);
|
|||
|
if (i < 0)
|
|||
|
perror ("SESSION_MANAGER_REQUEST");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Bool
|
|||
|
ItsyOsSpecialKey (KeySym sym)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
ItsyOsDisable (void)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
ItsyOsFini (void)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
KdOsFuncs ItsyOsFuncs = {
|
|||
|
ItsyOsInit,
|
|||
|
ItsyOsEnable,
|
|||
|
ItsyOsSpecialKey,
|
|||
|
ItsyOsDisable,
|
|||
|
ItsyOsFini,
|
|||
|
0
|
|||
|
};
|
|||
|
|
|||
|
void
|
|||
|
OsVendorInit (void)
|
|||
|
{
|
|||
|
KdOsInit (&ItsyOsFuncs);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
ddxUseMsg (void)
|
|||
|
{
|
|||
|
KdUseMsg();
|
|||
|
}
|
|||
|
|
|||
|
int
|
|||
|
ddxProcessArgument (int argc, char **argv, int i)
|
|||
|
{
|
|||
|
return KdProcessArgument (argc, argv, i);
|
|||
|
}
|